Kami menggunakan rcm untuk menyebarkan konfigurasi ke folder apa pun

Halo lagi. Minggu (artikel ini sudah sangat lama diasamkan di backlog) Beberapa waktu yang lalu, saya berbicara tentang cara menggunakan rcm untuk manajemen konfigurasi normal. Kami memiliki modul boneka di perusahaan kami yang mendistribusikan pengaturan pribadi pengguna ke semua host yang ia akses. Karena itu, saya ingin yang berikut ini:


  • Memiliki pengaturan saya sendiri untuk semua yang saya gunakan (vim, zsh, git, dll.)
  • Perbarui mereka saat mereka memperbarui dalam repositori dotfiles
  • Semua ini - tanpa gerakan yang tidak perlu

Alat-alatnya


Semua yang dibutuhkan sudah saya gunakan, yaitu:


  • rcm
  • git
  • tar

Format yang digunakan untuk menyebarkan file ke host


Tidak ada yang rumit di sini: kami menyebarkan tarbal dengan membongkar isinya di host. Hanya file dan direktori dari daftar tertentu yang dikelola, sepenuhnya menggerinda setiap mahkota dengan setiap penyebaran. Dengan demikian, jika tarball telah berubah, semua yang ada di daftar $HOME terhapus. Jika tidak, isi $ HOME tetap tidak berubah. Sebuah skrip terpisah bertanggung jawab untuk (kembali) mengemas folder dengan file sumber file pribadi, itu terlihat sangat sepele:


 #!/bin/bash -e # Repack each personal directory into a tarball, use gtar on mac/*BSD and tar on linux TAR=$(command -v gtar tar | head -1) cd "$(dirname "$0")" for file in *; do if [ -d "${file}" ]; then printf '\033[0;32mArchiving of \033[1;33m%s\033[0m\n' "$file" # to avoid differences in an archive because of different mtime # hard coded 2003-01-01 CET XZ_OPT=-e9 $TAR --mtime="@1041375600" -cJf "${file}.tar.xz" "${file}" fi done 

Cara membuat tarball bola komit baru


Sebarkan dotfiles bukan dalam $ HOME


Karena saya sudah memiliki alat yang saya gunakan konfigurasi untuk berbagai host, maka jelas saya akan menggunakannya. Anda hanya perlu memperbaiki sesuatu dan membuat rcm menyalin file ke tempat yang saya butuhkan. Namun, rcm selalu menetapkan file titik dalam $ HOME, tidak ada argumen baris perintah untuk mengubah perilaku ini.


Setelah beberapa percobaan dan memilih sumbernya, saya menyadari bahwa Anda dapat langsung mengubah $ HOME, kemudian perilaku utilitas semua perintah rcm akan berubah sebagai berikut: setiap utilitas lsrc, mkrc, rcdn, rsup akan membaca ${HOME}/.rcrc dan gunakan ${HOME}/.dotfiles secara default. Dengan demikian, cukup untuk membuat ${HOME}/.rcrc dengan semua parameter yang diperlukan.


Cara termudah adalah dengan membuat "kosong" dari folder rumah dan mengisinya dari awal dengan komit masing-masing. Contoh tampilannya dapat dilihat di repositori . Folder ini diabaikan pada semua host tanpa tag pribadi , sehingga tidak akan mengganggu konfigurasi utama. Satu file .rcrc tunggal berisi semua parameter untuk logika penyalinan file, saya hanya akan membuat beberapa komentar:


  • Tanpa $SYMLINK_DIRS rcup bekerja sangat lama, membuat daftar file lengkap untuk disalin. Dengan opsi ini, bersama-sama dengan $COPY_ALWAYS utilitas cukup menyalin seluruh folder sebagai cp -r tanpa masalah yang tidak perlu
  • Jelas, banyak yang tidak diperlukan pada server jarak jauh, semua ini tercantum dalam $EXCLUDES (dengan pengecualian dari vim plugins, mereka harus dihapus di hook karena $SYMLINK_DIRS )
  • Karena ${HOME}/.dotfiles berhenti berfungsi karena alasan yang jelas, Anda juga harus mengganti $DOTFILES_DIRS

Itu saja. Sekarang Anda dapat menyalin folder tag-pribadi di mana saja, mengganti ${HOME} untuk sementara waktu, dan menjalankan rcup


 WORK_DIR="${HOME}/.dotfiles/tag-personal" _OLD_HOME=$HOME HOME="${HOME}/some/long/custom/path" cp -r "${WORK_DIR}" "${HOME}" rcup -v HOME=$_OLD_HOME 

Wow! Tapi saya ingin sesuatu yang lain ...


Kami mengotomatiskan "penyebaran" konfigurasi ke custom $ HOME


Membuat "sesuatu" ini mudah, git pada titik ini akan membantu kaitannya. Ada file yang dapat dieksekusi .git/hooks/post-commit konten berikut:


 #!/bin/sh set -e WORK_DIR="tag-personal" HOME="${HOME}/some/long/custom/path/final_directory/USERNAME" # Some unnecessary and very heavy plugins EXCLUDED_VIM_PLUGINS='YouCompleteMe vimtex' rm -rf "${HOME}" cp -r "${WORK_DIR}" "${HOME}" rcdn -v rcup -v for plugin in ${EXCLUDED_VIM_PLUGINS}; do rm -rf "${HOME}/.vim/plugged/${plugin}" done # cleanup for .git dirs, compiled py and pictures find "${HOME}" \( \ \( -type d -iname '.git' \) -o \ \( -type f \ \( -iname '*.pyc' -o -iname '*.gif' -o -iname '*.png' \) \ \) \ \) -exec rm -rf {} + # final repack for files "${HOME}/../repack.sh" 

Sekarang, setelah setiap komit ke repositori dengan file dot, skrip ini akan diluncurkan.


Semuanya, setelah itu tetap membuat komit + push ke repositori dengan data pribadi dan tunggu sampai keajaiban otomatisasi membawa konfigurasi saya ke host yang berfungsi.


Mengapa menyulitkan hal-hal seperti ini?


Faktanya adalah bahwa sementara perusahaan tidak memiliki alat untuk menyebarkan konfigurasi pribadi ke host, tidak diperlukan kit semacam itu. Namun begitu peluang muncul, nafsu makan tumbuh seketika. Beberapa rekan saya puas dengan fakta bahwa mereka membawa tiga file ke host, katakan .vimrc .bashrc .gitconfig . Namun, untuk waktu yang lama saya telah mengasah dengan penuh kasih, memperbaiki dan memoles seluruh rangkaian berbagai alat. Hanya ~/.vim setelah menginstal semua plugin dengan berat 427MB (ya, 218 di antaranya adalah YCM, dan saya tidak menyeretnya ke server, dan setelah membersihkan dan mengemasnya semua kehilangan berat hingga 3MB).


Mungkin, seseorang akan berpikir bahwa ini entah bagaimana terlalu banyak dan bisa dilakukan dengan tangan. Mungkin tidak semua orang akan setuju dengan ini.


Saya harap ada orang lain yang memiliki kebutuhan fisik untuk merasa nyaman di tempat kerja, hampir di rumah, dan alat-alatnya memungkinkannya. Gunakan kesehatan Anda dan mungkin otomatisasi bersama kami!

Source: https://habr.com/ru/post/id435706/


All Articles