Script para automatizar la creación de repositorios SVN.
Desarrollo, bash April 6th, 2008Hola,
Para continuar con los scripts en bash, como el que publiqué hace unos días para crear vhosts en apache, esta vez escribo para publicar un script para crear repositorios svn y luego su respectiva sandbox (copia de trabajo).
A quien le podría resultar util? A quienes se dedican a la programación, en especial a la creación de sistemas para la web, y que en su trabajo diario tienen que lidiar con multiples proyectos, y por lo tanto, es probable que tenga que hacer esto repetidamente. En mi caso, yo hago eso, pero solo hasta fechas recientes decidí manejar mis proyectos personales a través de SubVersion. Antes solo lo utilizaba en el trabajo, y solo era un usuario, no administrador de ningún repositorio svn.
Un buen día decidí averiguar un poco acerca de la creación de los repositorios y vi lo sencillo que es en realidad. Mi mejor referencia fue esta página: http://artis.imag.fr/~Xavier.Decoret/resources/svn/index.html
Así pues, decidí comenzar a utilizar svn en mis pequeños proyectos personales, y vi que el proceso que se sigue para crear un repositorio, luego agregar archivos al mismo y luego hacer un svn checkout (obtener copia del juego de archivos en un directorio de trabajo) , era un candidato ideal para la automatización a través de un script bash. Y ayer que tuve tiempo, me puse a escribir dicho script.
Se da por asentado que subversion ha sido instalado con anterioridad. Si no lo tiene instalado y usa Debian/Ubuntu, solo corra el comando sudo aptitude install subversion.
Modo de uso:
Quizá quede más claro si ponemos un ejemplo. Supongamos que estás trabajando en un proyecto x, el cual se localiza en tu directorio /var/www2/miproyecto.com . Luego, decides administrar este proyecto a través de subversion. Lo único que tienes que hacer, con este script seria:
1) Bajar el script ( aquí), descomprimirlo y darle permisos de ejecución ( chmod a+x create_svn.sh)
2) Hacer los cambios necesarios a la configuración, (lineas 14-18)
3) Correrlo asi: sudo sh create_svn.sh miproyectom.com
Lo que el script haria seria lo siguiente:
1) Crear el repositorio svn llamado miproyecto.com, asegurándose de que no exista un repositorio llamado miproyecto.com previamente.
2)Importar todos los archivos presentes en el directorio del proyecto ( /var/www2/miproyecto.com/) hacia el repositorio. Si el directorio estaba vacío inicialmente, el script crea un archivo llamado index.php para que svn no vaya a dar un error al hacer la importación inicial.
3) Si el directorio tenía contenido, es decir archivos o subdirectorios, crea una copia temporal en /tmp/ como respaldo en caso de algun error, dado que en el siguiente paso se borra todo el contenido.
4)Borrar todo el contenido del directorio /var/www2/miproyecto.com/ , para asi poder en el siguiente paso hacer el checkout (obtener una copia de trabajo proveniente del repositorio).
5)Obtener la copia de trabajo en el directorio en cuestion. Pero ahora ya bajo control de svn.
6)En caso de que todo haya salido bien, y si es el caso, el programa te avisa que deberias eliminar la copia temporal de respaldo creada en /tmp/, dado que ya no es necesaria.
7) Y listo!!!! ya esta todo listo para que empiezes a hacer cambios en tus archivos, agregar mas archivos y luego hacer svn commit para agregar al repositorio tus modificaciones.
Para bajar el script haga click aquí. El script es muy sencillo, y a continuacion se muestra:
#!/bin/sh
#get domain name from parameter
domain=$1;
#if no domain provided, die
if [ -z $domain ] ; then
echo "Error: missing domain name"
echo "Usage: sh create_svn.sh mydomain.com"
exit
fi
################# Configuration ##################
# Configure these variables according to your needs
svn_path="/home/joel/svn" #no trailing /
www_path="/var/www2" #no trailing /
svn_owner="joel:users"
document_root_owner="joel:users"
############################################
#more variables
#don't edit these, they are set based on the values of the variables set in the configuration section above
svn_repo="${svn_path}/${domain}"
svn_repo_dir="${svn_repo}/"
svn_repo_url="file://${svn_repo}"
document_root="${www_path}/${domain}"
document_root_dir="${document_root}/"
temp_path="/tmp/${domain}"
temp_path_dir="${temp_path}/"
#check if repo exists
if [ -e $svn_repo ] ; then
echo "Repository ${svn_repo} already exists"
exit
fi
#if document root does not exist, create it and put a bogus file
doc_existed=1
if [ ! -e $document_root ] ; then
echo "Creating ${document_root} ."
mkdir -p $document_root
bogusfile="${document_root}/index.php"
echo "" > $bogusfile
doc_existed=0
fi
#create repository
echo "Creating svn repository"
svnadmin create --fs-type fsfs $svn_repo
#do initial import
echo "Performing initial import"
svn import $document_root_dir file:///$svn_repo -m "initial import"
#create temporary backup of stuff in the document root if there was already stuff in it
if [ $doc_existed -eq 1 ] ; then
echo "Creating temporary directory to backup files"
mkdir -p $temp_path
#check if temp dir exists
if [ ! -e $temp_path_dir ] ; then
echo "Creating $temp_path_dir"
mkdir -p $temp_path_dir
fi
#ok to rsynk
echo "rsync-ing to ${temp_path_dir}"
rsync -avz $document_root_dir $temp_path_dir
fi
#Go to the original directory and wipe it out
cd $document_root_dir
curr_path=`pwd`
if [ $curr_path != $document_root ] ; then
echo "Could not change to ${document_root} directory"
exit
fi
if [ -z $document_root_dir ] ; then
echo "Invalid value for document root ${document_root}"
exit
fi
#protection
if [ $curr_path = "/" ] ; then
echo "Danger!!!!!"
exit
fi
#delete the stuff in the document root directory
echo "Deleting files..."
rm -rf $document_root_dir
#move to parent root
echo "Changing directory to ${www_path}"
cd $www_path
#checkout the files from the repo
echo "Doing the initial svn checkout"
svn co $svn_repo_url
#change ownership of directories
echo "Changing file ownership"
chown -R $svn_owner $svn_repo_dir
chown -R $document_root_owner $document_root_dir
#reminder to delete the temporary backup if it was done
if [ $doc_existed -eq 1 ] ; then
echo "\n\n";
echo "-----------------------------------------------------------------------------------------"
echo "Check if everything was created correctly."
echo "In case something went wrong, there is a backup copy of your files here:"
echo $temp_path_dir
echo "If everything is fine, you should remove the temporary backup "
echo "running the following command rm -rf ${temp_path_dir}"
echo "-----------------------------------------------------------------------------------------"
fi
October 28th, 2008 at 2:45 pm
Interesting to know.