ประหยัดเวลาการ setup บนคอมใหม่ด้วย Chezmoi

Raksit MANTANACHARU
NonTechCompany
Published in
3 min readFeb 9, 2022
Chezmoi (เช-มัว) แปลว่า บ้าน (Photo by Ralph Kelly on Unsplash)

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 บนคอมใหม่ไปได้เยอะเลย ลองนำไปใช้กันดูครับ 🥳

--

--