Julio
2009
Sistemas de control de versiones en la vida real
Los sistemas de control de versiones no son ninguna novedad (CVS, SVN, GIT, Mercurial...) lo que si es novedad es empezar a usarlos en sitios que hace unos años ni siquiera se hubieran contemplado.
Tenía ganas de hablar sobre este tema pero me acaba de convencer un bug que acabo de recibir: #537237 .
Desde hace ya varios meses en todos los servidores que administro y en mi portátil personal tengo montado el directorio /etc bajo control de versiones con GIT. Hacerlo es de lo más sencillo que hay:
cd /etc git init git add . git commit -m "importado /etc"
¿Qué ventajas tiene esto?
Pues más que en un equipo de escritorio (que puede ayudarnos a arreglar cosas si andamos con Debian unstable) en los servidores es super útil.
¿Hay que crear un VirtualHost en Apache o editar cierta configuración?
Nuevo "commit" con su respectivo comentario y eso queda para la historia si alguna vez nos da problemas y no sabemos por donde arreglarlo tenemos el log y los diff.
Existen paquetes como etckeeper que se encargan de la parte más complicada por nosotros, pero a mi me sirve con usar git a pelo. Una de las cosas que he añadido es un disparador para apt que se encargue de hacer un commit cada vez que instalamos o desinstalamos algo. (lo tomé prestado de algún sitio y ahora no recuerdo donde)
#!/bin/bash
set -e
caller=$(ps axww | mawk '/aptitude|apt-get/ {for (i=5; i<=NF ; i++) printf ("%s ",$i); printf ("\n") }' | head -1)
STATUS="$(git status)" || true if echo $STATUS | grep '\(modified\|new\|remove\)' > /dev/null 2>&1 ; then echo "git-snapshot-script: found changed files" echo $STATUS git commit -a -m "snapshot after: $caller" else echo " **GIT** git-snapshot-script: no changes" fi echo " **GIT** git-snapshot-script: done"
Basicamente se lee el nombre de proceso que llama a este script (por ejemplo: apt-get install postfix) se mira si el directorio /etc ha cambiado y se hace el commit quedando en el log el programa que provoco esos cambios.
Para que el invento funcione debemos decirle a apt que llame al script:
cat /etc/apt/apt.conf
DPkg {
Post-Invoke {"cd /etc ; ./apt/git-snapshot-script";};
}
IMPORTANTE: Procura que el directorio /etc/.git solo pueda leerlo y escribirlo root (chmod 700 /etc/.git; chown root:root /etc/.git), con ese directorio se puede sacar el /etc/shadow por ejemplo y probar programas de fuerza bruta para sacar las contraseñas.
Mi vicio por git no termina aquí. Últimamente ando modificando unos cuantos CMS para uso personal o para clientes y un día puse esas web bajo control de versiones, ¡qué gozada! hacer mini-cambios y poder revertirlos, jugar con varias ramas, etiquetar... y para ejemplo un botón, Galopín es nuestro sistema de facturación interno y he ido tocando cosas que no acababan de convencerme, aquí está el git publicado. El primer import tiene parches ya de varios años de uso ;)
) y es necesario acudir a una interfaz gráfica, he probado varias pero la que más me convence es