Usamos rcm para implementar la configuración en cualquier carpeta

Hola de nuevo Semana (este artículo ha estado en escabeche durante mucho tiempo en la cartera de pedidos) Hace algún tiempo, hablé sobre cómo usar rcm para la administración de la configuración normal. Tenemos un módulo de títeres en nuestra empresa que distribuye la configuración personal del usuario a todos los hosts a los que tiene acceso. En consecuencia, quiero lo siguiente:


  • Tengo mi propia configuración para todo lo que uso (vim, zsh, git, etc.)
  • Actualícelos a medida que se actualizan en el repositorio de archivos de puntos
  • Todo esto, sin gestos innecesarios.

Las herramientas


Ya utilizo todo lo que necesito, a saber:


  • rcm
  • git
  • alquitrán

El formato utilizado para implementar archivos en hosts


Aquí no hay nada complicado: implementamos tarballs desempacando su contenido en los hosts. Solo se gestionan los archivos y directorios de una lista específica, moliendo completamente cada corona con cada implementación. En consecuencia, si el tarball ha cambiado, todo en la lista $HOME se borra. De lo contrario, el contenido de $ HOME no se modifica. Un script separado es responsable de (re) empaquetar la carpeta con los archivos fuente de los archivos personales; parece bastante trivial:


 #!/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 

Cómo crear un nuevo tarball de commit ball


Implementar archivos de puntos no en $ HOME


Como ya tengo una herramienta con la que implemento configuraciones en varios hosts, obviamente la usaré. Solo tiene que arreglar algo y hacer que rcm copie los archivos donde lo necesite. Sin embargo, rcm siempre establece los archivos de puntos en $ HOME, no hay argumentos de línea de comando para cambiar este comportamiento.


Después de algunos experimentos y seleccionar la fuente, me di cuenta de que puede cambiar directamente $ HOME, luego el comportamiento de las utilidades de todos los comandos rcm cambiará de la siguiente manera: cada una de las utilidades lsrc, mkrc, rcdn, rsup leerá ${HOME}/.rcrc y usará ${HOME}/.dotfiles por defecto. En consecuencia, es suficiente crear el mismo ${HOME}/.rcrc con todos los parámetros necesarios.


La forma más fácil es hacer un "espacio en blanco" de la carpeta de inicio y llenarlo desde cero con cada confirmación. Un ejemplo de cómo se ve se puede ver en el repositorio . Esta carpeta se ignora en todos los hosts sin la etiqueta personal ; en consecuencia, no interferirá con la configuración principal. Un solo archivo .rcrc contiene todos los parámetros para la lógica de copia de archivos, solo haré algunos comentarios:


  • Sin $SYMLINK_DIRS rcup funciona sin remedio durante mucho tiempo, creando una lista completa de archivos para copiar. Con esta opción, junto con $COPY_ALWAYS utilidad simplemente copia la carpeta completa como cp -r sin problemas innecesarios
  • Obviamente, no se necesita mucho en servidores remotos, todo esto aparece en $EXCLUDES (con la excepción de los complementos vim, deben eliminarse en el gancho porque $SYMLINK_DIRS )
  • Dado que ${HOME}/.dotfiles deja de funcionar por razones obvias, también debe anular $DOTFILES_DIRS

Eso es todo Ahora puede copiar la carpeta personal de etiquetas en cualquier lugar, anular ${HOME} por un tiempo y ejecutar 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! Pero quiero algo más ...


Automatizamos el "despliegue" de configuraciones para personalizar $ HOME


Hacer este "algo" es fácil, git en este punto ayudará con sus ganchos. Hay un archivo ejecutable .git/hooks/post-commit siguientes contenidos:


 #!/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" 

Ahora, después de cada confirmación en el repositorio con archivos de puntos, se iniciará este script.


Todo, después de eso, queda hacer un commit + push al repositorio con datos personales y esperar hasta que la magia de la automatización lleve mis configuraciones a los hosts de trabajo.


¿Por qué complicar cosas como esta?


El hecho es que si bien la compañía no tenía herramientas para implementar una configuración personal en los hosts, no había necesidad de tal kit. Pero tan pronto como surge la oportunidad, el apetito crece instantáneamente. Algunos de mis colegas estaban satisfechos con el hecho de que llevaron tres archivos a los hosts, por ejemplo .vimrc .bashrc .gitconfig . Sin embargo, durante mucho tiempo había estado afilando, corrigiendo y puliendo con amor un conjunto completo de varias herramientas. Solo la ~/.vim después de instalar todos los complementos pesa 427 MB (sí, 218 de ellos son YCM, y no los arrastro a los servidores, y después de limpiarlos y empacarlos todo pierde peso hasta 3 MB).


Probablemente, alguien pensará que esto es de alguna manera demasiado y podría haberse hecho con las manos. Quizás no todos estén de acuerdo con esto.


Espero que alguien más tenga una necesidad casi física de sentirse cómodo en las estaciones de trabajo, casi en casa, y las herramientas lo permitan. ¡Use su salud y que la automatización esté con nosotros!

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


All Articles