Export automatique d’un projet subversion vers un serveur de développement

Utiliser un outil de contrôle de version de sources est une excellente pratique, mais pour une équipe de développeur web, il peut aussi être intéressant de constater le résultat de leur travail personnel, sur un espace commun.
Voilà une des approches possibles, avec un script exportant automatiquement toutes les modifications appliquées par un commit, vers un serveur de développement.

Note : ce script utilise la fonction myscp.

#!/bin/bash -vx
# Auto exporte les modifications d'un projet subversion vers un serveur de developpement
# Luc Santeramo 2008-11-06
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
# Paramètres :
# - rev : numero de la derniere version commitée
# - repos : chemin vers le depot subversion
# - projet (multiple possible): nom du projet sur le depot, repertoire a exporter (trunk en general), nom de l'hote hebergeant
# l'environnement de developpement, utilisateur proprietaire des fichiers sur cet environnement de developpement, document root du
# projet sur l'hote defini
# Utilisation :
# Ajouter l'execution de ce script dans /var/lib/svn/hooks/post-commit
# exemple : /usr/local/bin/auto_export.sh --repos=${REPOS} --rev=${REV} --projet=test,trunk,dev.server.com,projectPPPPP,/home/projectPPPPPP/test
# Ici la version REV du répertoire trunk contenu dans le projet subversion "test" (se trouvant à l'emplacement REPOS sur le fs), sera envoyé à l'adresse dev.server.com, dans le repertoire /home/projectPPPPP/test de l'utilisateur projectPPPPPP
##################
# URL du dépot subversion
DEPOTSVN="http://hote.domaine.com/svn"
# Utilisateur SVN chargé de l'export des fichiers
SVNUSER="userlogin"
# Mot de passe utilisateur SVN
SVNUSERPWD="userpassword"
# Emplacement common_functions
COMMONFCT="/usr/local/bin"
# Destinataire des erreurs
#DEST="nom.prenom@domaine.com"
DEST="/tmp/$(basename $0).log"
# Correspondance "utilisateur subversion":"adresse email de l'utilisateur subversion" séparé par des espaces
# Variable utilisée pour l'envoi du compte rendu de l'operation
# L'envoi vers l'utilisateur est effectif uniquement si ${DEST} est une adresse email.
LISTDEST="userlogin:prenom.nom@domaine.com"
# Binaires
SVN="/usr/bin/svn"
SCP="myscp"
SSH="/usr/bin/ssh"
RM="/bin/rm"
##################
source ${COMMONFCT}/common_functions
# Gestion des erreurs
trap 'error_check_trap ${DEST} $_' ERR ; set -o errtrace
# empeche l'utilisation de variable non initialisée
set -o nounset
# Erreurs
E_PARAMERR=50
# Répertoire temporaire
TMPDIR="/tmp"
# initialisation des variables potentiellement vide
REV=""
REPOS=""
RESTARTENGINE=""
function usage () {
echo "Usage $0 --rev=REV --repos=REPOS --projet=NOMPROJET,REPEXPORTE,HOTE,USR,DOCROOTPROJET [ --projet=NOMPROJET,REPEXPORTE,HOTE,USR,DOCROOTPROJET ] ..."
exit $E_PARAMERR
}
function traite_projet () {
local NOMPROJET=$1
local REPEXPORTE=$2
local HOTE=$3
local USR=$4
local DOCRROOTPROJET=$5
# recuperation de la liste des modifications
changed=$(svnlook changed -r $REV $REPOS)
set -- ${changed} "--"
# on ne traite la modification sur ce projet que si ca a ete demande en parametre
PRJ=$(expr match "$2" '(^[^/]*)') # normalement toujours le même projet concerné par une REV
if [ "${PRJ}" == "${NOMPROJET}" ]
then
# recuperation de l'auteur de la modif et de son email
auth=$(svnlook author -r $REV $REPOS)
authmail=$(expr match "${LISTDEST}" '.*'${auth}':([^ ]*)')
#echo "REPOS=$REPOS ; REV=$REV ; changed=$changed ; auth=$auth authmail=$authmail"
# si le destinataire des erreurs est une adresse email, on y ajoute l'auteur du commit
if echo "${DEST}" | grep -q "@" > /dev/null 2>&1
then
DEST="$DEST,$authmail"
fi
# pour chaque modification
while [ "$1" != "--" ]
do
OP="$1"
#PRJ=$(expr match "$2" '(^[^/]*)')
SVNFIC=${2#${PRJ}/}
REALFIC=${2#${PRJ}/${REPEXPORTE}/}
# on applique la modif si elle concerne le repertoire a exporter mais pas les BDD
if [[ ${SVNFIC} =~ ^"${REPEXPORTE}" ]]
then
case "$1" in
# ajout ou modification
"A"|"U"|"UU" ) 
# recuperation du fichier/répertoire
${SVN} --username ${SVNUSER} --password ${SVNUSERPWD} --quiet checkout ${DEPOTSVN}/${PRJ}/$(dirname ${SVNFIC}) ${TMPDIR}/${PRJ}_$$/
if echo "${SVNFIC}" | grep -q "/$" > /dev/null 2>&1
# c'est un repertoire
then
${SSH} ${USR}@${HOTE} "mkdir -p ${DOCROOTPROJET}/${REALFIC} || exit $?"
${SCP} -r ${TMPDIR}/${PRJ}_$$/$(basename ${SVNFIC}) ${USR}@${HOTE}:${DOCROOTPROJET}/$(dirname ${REALFIC})
# c'est un fichier
else
# envoi du fichier
${SCP} ${TMPDIR}/${PRJ}_$$/$(basename ${SVNFIC}) ${USR}@${HOTE}:${DOCROOTPROJET}/${REALFIC}
fi
# nettoyage du répertoire temporaire
${RM} -rf ${TMPDIR}/${PRJ}_$$
;;
# supression
"D" ) 
if echo "${REALFIC}" | grep -q "/$" > /dev/null 2>&1
# c'est un repertoire
then
${SSH} ${USR}@${HOTE} "rm -rf ${DOCROOTPROJET}/${REALFIC} || exit $?"
# c'est un fichier
else
# suppression du fichier distant
${SSH} ${USR}@${HOTE} "rm ${DOCROOTPROJET}/${REALFIC} || exit $?"
fi
;;
# autre
* ) echo "operation ignoree";;
esac
fi
shift 2
done
# recuperation du commentaire
log=$(svnlook log -r $REV $REPOS)
# envoie par mail du compte rendu
if echo "${DEST}" | grep -q "@" > /dev/null 2>&1
then
echo -e "${log}n${changed}" | mail -s "[svn] Modifications ${REV} du projet ${NOMPROJET} appliquees sur ${HOTE}:${DOCROOTPROJET}" ${DEST}
fi
fi
}
# Verification du nombre de paramètres
[ "$#" -ge 3 ] || usage
# Vérification de la validité des paramètres
TEMP=$(getopt -o -- --longoptions projet:,rev:,repos: -- "$@")
[ $? != 0 ] && usage
# Traitement des paramètres --rev et --repos, indispensable pour le traitement de --projet
eval set -- "$TEMP"
while [ ! -z "$1" ]
do
case "$1" in
--rev) REV=$2 ; shift 2;;
--repos) REPOS=$2 ; shift 2;;
--projet) shift 2;;
--) shift ; break ;;
*) exit 1;;
esac
done
# Vérification de la présence des paramètres obligatoires
[ -z ${REV} ] || [ -z ${REPOS} ] && usage
# traitement des paramètres --projet
eval set -- "$TEMP"
while [ ! -z "$1" ]
do
case "$1" in
--rev) shift 2;;
--repos) shift 2;;
--projet) 
A_TMP=(${2//,/ })
NOMPROJET=${A_TMP[0]}
REPEXPORTE=${A_TMP[1]}
HOTE=${A_TMP[2]}
USR=${A_TMP[3]}
DOCROOTPROJET=${A_TMP[4]}
traite_projet ${NOMPROJET} ${REPEXPORTE} ${HOTE} ${USR} ${DOCROOTPROJET}
shift 2;;
--) shift ; break ;;
*) exit 1;;
esac
done
exit 0

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *