ประหยัดเวลาการ setup บนคอมใหม่ด้วย Chezmoi
TL;DR
Chezmoi (อ่านว่า เช-มัว) เป็นเครื่องมือที่ช่วยประหยัดเวลาการ setup บนคอมใหม่ที่ย้ายมาจากเครื่องเก่า เหมาะสำหรับ developer เพราะสามารถใช้ได้กับหลาย operating system และ file หลากหลายรูปแบบ นอกจากนั้นยังมีความปลอดภัย และสามารถตรวจสอบการเปลี่ยนแปลงได้
ปัญหาที่เกิดขึ้น 🤔
ในการพัฒนา software แน่นอนว่าเราไม่สามารถใช้ computer เครื่องเดิมไปตลอดชีวิต ดังนั้นเราก็หนีไม่พ้นการเปลี่ยนเครื่องไปมา หรือต้อง clean reset เครื่องใหม่ สิ่งที่ต้องทำทุกครั้ง โดยเฉพาะ developer คือต้องมาจดจำว่า
- ลง application อะไรไปบ้าง
- ลง dependency, plugin อะไรไปบ้าง
- ทำการ configure script อะไรไว้บ้าง
- มี dotfiles อะไรบ้าง ซึ่งมันคือ file ที่มี
.
นำหน้า เช่น.bash_profile
.zshsrc
.gitconfig
โดยเราจะหาผ่าน Finder ไม่เจอ เพราะมันถูกซ่อนไว้นั่นเอง
นั่นหมายความว่า เราจะต้องมาทำสิ่งเหล่านี้ซ้ำซาก บางทีลืมไปอย่างนึงปุ๊บ เครื่องใหม่เราก็ run ไม่ได้เหมือนอย่างเก่า ยังไม่รวมถึงการที่ developer คนใหม่เข้ามาร่วมทีม การที่พวกเค้าจะต้องมาติดตั้งที่มีขั้นตอนเยอะแยะซ้ำซากก็บั่นทอน productivity ได้เหมือนกัน
ถึงแม้ต้นเหตุมันก็เป็นที่ตัวเราที่ลืมก็จริง แต่การหาวิธีแก้หรือเครื่องมือที่มาช่วยแก้ลืมให้เรามันก็เป็นเรื่องที่ดีนะ ทีนี้เรามาดูวิธีแก้กันว่ามีอะไรบ้าง
- จดไว้ในเอกสาร หรือทำ README ไว้บน internet (เช่น Git หรือ Cloud storage) สิ่งที่ต้องมาว่ากันต่อคือ มัน update บ่อยแค่ไหน เชื่อถือได้หรือไม่
- เตรียม shell script ไว้ติดตั้งโดยเฉพาะ สิ่งที่น่าสนใจคือเราจะรู้ได้อย่างไรว่า shell script มันทำงานถูกต้องหรือไม่
- Upload dotfiles จากเครื่องเดิมขึ้นบน Git จากนั้นในอีกเครื่องนึง เราก็จะทำการ download ลงมาติดตั้งใน
$HOME
directory สิ่งที่ยังเป็นปัญหาอยู่คือ ถ้าเราต้องการที่จะเก็บ credentials ก็ไม่ปลอดภัยบน Git นอกจากนั้นถ้าเรามี configuration ที่ต่างกันในแต่ละเครื่อง เราก็ต้องมาเตรียม file แยก แม้ว่าจะต่างกันแค่บรรทัดเดียว
ในบทความนี้ เราจะมาว่าด้วยเรื่องของเครื่องมือ Chezmoi กัน
จัดการ dotfiles ด้วย Chezmoi 🏠
Chezmoi (อ่านว่า เช-มัว) เป็นเครื่องมือที่จัดการ dotfiles ซึ่งมีจุดเด่นคือ
- รองรับการทำงานกับหลาย operating system เช่น Linux, macOS, Windows
- มีความปลอดภัย เพราะสามารถทำงานร่วมกับ password manager ได้
- สามารถตรวจสอบการเปลี่ยนแปลงก่อน apply dotfiles ลงไป
- สามารถใช้งานกับ file และ directory และ symlink ได้
ตัวอย่างเช่น เราใช้ macOS ซึ่งต้องการจะย้ายไป setup อีกเครื่องนึง สิ่งที่เราจะย้ายไปคือ
- Oh My Zsh คร่าวๆ คือเอาไว้แต่ง terminal ของเรา โดย plugins และ theme ต่างๆ ก็จะเก็บไว้ใน
.oh-my-zsh
ส่วน file ที่จะ run ทุกครั้งที่เปิด terminal session ใหม่ ก็จะเก็บไว้ใน.zshrc
- Homebrew เป็น package manager สำหรับ macOS อุดมไปด้วย dependency ต่างๆ
Upload dotfiles จากเครื่องเดิม ⬆️
สิ่งที่เราต้องติดตั้งไว้ก่อนในเครื่องเดิม ได้แก่
- Homebrew
- Git
เริ่มต้นจากการติดตั้ง Chezmoi ด้วย Homebrew ผ่านคำสั่ง
$ brew install chezmoi
จากนั้นทำการตั้ง repository สำหรับเก็บ dotfiles ด้วยคำสั่ง
$ chezmoi init
ซึ่ง repository ใหม่จะถูกสร้างไว้ใน ~/.local/share/chezmoi/
เราสามารถเข้าไป directory โดยตรงผ่านคำสั่ง
$ chezmoi cd
สมมติเราจะเพิ่ม file ใหม่เข้าไป เช่น .zshrc
ก็สามารถทำได้เลยผ่านคำสั่ง
$ chezmoi add ~/.zshrc
โดย Chezmoi จะทำการ copy ~/.zshrc
ไปไว้ใน ~/.local/share/chezmoi/dot_zshrc
(สังเกตว่าชื่อ file จะเปลี่ยนไป)
จากนั้นเราสามารถแก้ไข file นี้ได้ผ่านคำสั่ง
$ chezmoi edit ~/.zshrc
สำหรับตัว Oh My Zsh รวมถึง plugin และ theme นั้น จะถูกเก็บไว้ใน ~/.oh-my-zsh
directory เราสามารถ export Oh My Zsh ออกมาได้ผ่านคำสั่ง
$ chezmoi add -r --exact ~/.oh-my-zsh
โดย Chezmoi จะทำการ copy ~/.oh-my-zsh
ไปไว้ใน ~/.local/share/chezmoi/exact_dot_oh-my-zsh
สำหรับ Homebrew เราจะต้องสร้าง Brewfile
ซึ่งประกอบไปด้วยชื่อของ formula และ casks เราสามารถ generate ได้ผ่านคำสั่ง
$ chezmoi cd$ brew bundle dump
ดู change ของ file เมื่อเทียบของเดิมผ่านคำสั่ง
$ chezmoi diff
เมื่อเราโอเคกับ change แล้วเราก็ run คำสั่งเพื่อบันทึกและเอาขึ้น Git repository เช่น GitHub เป็นอันเสร็จสิ้น
$ chezmoi -v apply$ chezmoi cd$ git add .$ git commit -m “Initial commit”$ git remote add origin https://github.com/username/dotfiles.git$ git push -u origin master
Download dotfiles จากเครื่องใหม่ ⬇️
สิ่งที่เราต้องติดตั้งไว้ก่อนในเครื่องใหม่ ได้แก่
- Homebrew
- Git
เริ่มต้นจากการติดตั้ง Chezmoi ด้วย Homebrew ผ่านคำสั่ง
$ brew install chezmoi
จากนั้น download dotfiles ที่เครื่องเก่าของเราเอาขึ้นไปไว้ผ่านคำสั่ง
$ chezmoi init https://github.com/username/dotfiles.git
ดู change ของ file เมื่อเทียบของเดิมผ่านคำสั่ง
$ chezmoi diff
เมื่อเราโอเคกับ change แล้วเราก็ run คำสั่งเพื่อบันทึก จากนั่นเข้าไปดู file ที่ apply ลงไป ก็เป็นอันเสร็จสิ้น
$ chezmoi apply -v$ cat ~/.zshrc$ ls ~/.oh-my-zsh
แต่ถ้าเราอยากแก้ไข file ก่อนที่จะ apply เราก็สามารถทำได้ ผ่านคำสั่ง
$ chezmoi edit <file>
ทีนี้ถ้า dotfiles repository มีการ update เราก็สามารถ update เข้าเครื่องเราได้ผ่านคำสั่ง
$ chezmoi update -v
จัดการ config ที่ต่างกันด้วย template file 🔧
ยกตัวอย่างเช่น เรามี file .gitconfig
ซึ่งในเครื่องแต่ละคนก็จะมีค่าต่างกัน เช่น
[user]email = “nook@example.com”
[user]email = “paii@example.com”
สิ่งที่ต้องเตรียมในแต่ละเครื่องคือ ให้สร้าง file ~/.config/chezmoi/chezmoi.toml
ผ่านคำสั่ง
$ chezmoi edit-config
จากนั้นเพิ่ม properties ชื่อ email
ลงไป ซึ่ง value ของแต่ละเครื่องก็จะมีค่าต่างกัน อย่างเช่น
[data]email = “nook@example.com”
ปิดท้ายด้วยการเพิ่ม ~/.gitconfig
ลงไปใน Chezmoi ให้กลายเป็น template file ผ่านคำสั่ง
$ chezmoi add —-autotemplate ~/.gitconfig
Chezmoi จะทำการสร้าง ~/.local/share/chezmoi/dot_gitconfig.tmpl
ไว้ ทีนี้ถ้าคนอื่นอยากใช้ template file นี้ก็เพียงแค่เตรียม ~/.config/chezmoi/chezmoi.toml
ไว้ แล้วก็ download dotfiles repository มา apply เป็นอันเสร็จสิ้น
นอกจากนั้นยังสามารถสร้าง template ที่มี condition ขึ้นอยู่กับ operating system ได้ด้วย เช่น การแยกเงื่อนไขระหว่างบน macOS และ Linux ทำให้ได้ผลลัพธ์ต่างกัน สามารถดูได้เพิ่มเติมที่ link ข้างล่างนี้
การใช้งานกับ password manager 🔑
Chezmoi รองรับการทำงานร่วมกับ password manager ต่างๆ เช่น 1Password หรือ Bitwarden เพื่อใช้จัดการกับการเก็บ credentials เช่น เรามี template file ที่ระบุ ID ของ 1Password item ไว้ เพียงแค่เราเชื่อมต่อ 1Password command-line ตอนเรา download dotfiles repo ลงมา มันก็จะ apply ให้เลย
{{- (onepasswordDetailsFields "<item-id>").password.value }}
สามารถดูเพิ่มเติมได้ที่ link ข้างล่างนี้
Chezmoi มี use case ต่างๆ ที่เรายังไม่ได้ลองอีกมากมาย จากการใช้งานเบื้องต้นแค่นี้ ส่วนตัวเรามองว่ามันเป็นเครื่องมือที่ช่วยประหยัดเวลาการ setup บนคอมใหม่ไปได้เยอะเลย ลองนำไปใช้กันดูครับ 🥳