Script de mise en production sur serveur mutualisé

2 02 2010

Mon projet étant bientôt prêt, j’ai préparé la semaine dernière un script de mise en production du site, afin d’automatiser au maximum cette procédure pour la rendre plus simple, mais aussi plus sûre. N’ayant qu’un hébergement mutualisé chez 1and1, je ne dispose pas de connexion SSH, ce qui limite un peu les actions disponibles.

J’ai choisi de faire ce script avec Ant, tout simplement parce que je le connais pour l’avoir utilisé dans mes jobs précédents et qu’il me convient parfaitement. Il s’intègre de plus très bien dans Eclipse, que j’utilise pour développer, à condition d’avoir installé le plugin adéquat, soit l’environnement JDT (Java Development Tools), si on a choisi comme moi, une installation Eclipse PDT (Php Development Tools) qui n’inclue pas d’utilitaires pour Java. Car Ant tourne à l’aide de Java.

Que fait ce script?

Avec ce script, j’ai voulu automatiser 3 opérations : la sauvegarde, la construction du projet à déployer et le déploiement.

La sauvegarde

Dans cette “target”, je fais simplement un export des fichiers sources sur le serveur de production. Etant contraint par mon type d’hébergement, je ne peux que passer par une tâche ftp pour les récupérer. Ensuite, je créé une archive compressée à la date du jour, puis je supprime les fichiers importés.

<target name="backup" description="Sauvegarde de la prod">
<echo>Backup des fichiers</echo>
<mkdir dir="${BACKUP_TEMP_DIR}" />
<ftp action="get"
server="${FTP_SERVER}" userid="${FTP_USER}" password="${FTP_PWD}"
depends="false">
<fileset dir="${BACKUP_TEMP_DIR}" />
</ftp>
<echo>Creation de l'archive</echo>
<tstamp />
<tar basedir="${BACKUP_TEMP_DIR}" tarfile="${BACKUP_DIR}/${BACKUP_FILE_PREFIX}-${DSTAMP}.tar" />
<gzip zipfile="${BACKUP_DIR}/${BACKUP_FILE_PREFIX}-${DSTAMP}.tar.gz" src="${BACKUP_DIR}/${BACKUP_FILE_PREFIX}-${DSTAMP}.tar" />
<delete file="${BACKUP_DIR}/${BACKUP_FILE_PREFIX}-${DSTAMP}.tar" />
<delete dir="${BACKUP_TEMP_DIR}" />
<echo>Faire un dump de la base!!!</echo>
</target>

Pour les mêmes contraintes, il n’est pas possible de se connecter à la base de données. On ne peut donc pas automatiser un dump de la base. Il faut donc le faire à la main… Ce n’est ni long, ni compliqué à faire, c’est juste qu’il ne faut pas l’oublier.

Cette étape peut être relativement longue en fonction du nombre de fichiers et de leur taille. Mais on peut le faire un peu à l’avance.

La construction du projet

Cette étape consiste à générer un ensemble de fichiers destinés à être copiés sur le serveur. Ayant plusieurs projets CVS, je récupère le projet avec les sources en environnement de dev, que je surcharge avec celui contenant les fichiers de l’environnement de production.

<target name="build_dist" depends="cvs_checkout" description="Préparation des fichiers à distribuer">
<echo>Suppression des fichiers du build precedent</echo>
<delete dir="${CHECKOUT_DIR}" />
<delete dir="${DIST_DIR}" />
<mkdir dir="${CHECKOUT_DIR}"/>
<mkdir dir="${DIST_DIR}"/>
<echo message="Recuperation du repository CVS"/>
<cvspass cvsroot="${CVSROOT}" password="${CVS_PWD}" passfile="./.cvspass" />
<cvs cvsRoot="${CVSROOT}" package="${CVS_MODULE}" dest="${CHECKOUT_DIR}"
failonerror="true" quiet="true" reallyquiet="true" />
<cvs cvsRoot="${CVSROOT}" package="${CVS_MODULE_ENV}" dest="${CHECKOUT_DIR}"
failonerror="true" quiet="true" reallyquiet="true" />
<echo message="Preparation des fichiers a distribuer" />
<move todir="${DIST_DIR}" preservelastmodified="true">
<fileset dir="${CHECKOUT_DIR}/${CVS_MODULE}" />
</move>
<move todir="${DIST_DIR}" preservelastmodified="false">
<fileset dir="${CHECKOUT_DIR}/${CVS_MODULE_ENV}" />
</move>
</target>

Le déploiement

Cette étape s’effectue en 2 fois, là aussi pour cause d’impossibilité de connexion à la base de données via le script.

Dans un premier temps, on copie un fichier .htaccess, permettant de renvoyer toutes les requêtes HTTP vers une page d’attente, et on copie les fichiers construits à l’étape précédente (sauf le .htaccess) sur le serveur de production.

<target name="deploy_start" description="Deploiement en prod">
<echo message="Deploiement en prod" />
<ftp server="${FTP_SERVER}" userid="${FTP_USER}" password="${FTP_PWD}">
<fileset dir=".">
<include name=".htaccess" />
</fileset>
</ftp>
<!-- Mettre depends a true pour n'envoyer que les fichiers nouveaux ou modifiés -->
<ftp server="${FTP_SERVER}" userid="${FTP_USER}" password="${FTP_PWD}" depends="yes">
<fileset dir="${DIST_DIR}">
<exclude name="./.htaccess" />
</fileset>
</ftp>
<echo>!!! Faire la mise a jour de la base !!!</echo>
</target>

Ensuite, au besoin, il faut faire la mise à jour de la base de données à la main.

Dans un second temps, on copie le .htaccess de l’environnement de production qui n’a pas été copié précédemment pour rétablir l’accès au site.

<target name="deploy_end" description="Deploiement en prod">
<echo message="Remise de l'acces au site" />
<ftp server="${FTP_SERVER}" userid="${FTP_USER}" password="${FTP_PWD}">
<fileset dir="${DIST_DIR}">
<include name=".htaccess" />
</fileset>
</ftp>
</target>


Y’a surement de meilleures méthodes, mais celle-ci fonctionne pour moi pour l’instant.

Faire suivre cet article :
  • Facebook
  • Twitter
  • Google Bookmarks
  • Yahoo! Buzz
  • Wikio FR
  • LinkedIn
  • Viadeo
  • del.icio.us
  • Digg
  • MySpace
  • Netvibes
  • Technorati

Actions

Informations

2 réponses à “Script de mise en production sur serveur mutualisé”

11 02 2010
Je veux devenir mon propre patron » Script de mise en prod : tag de sources dans CVS (09:28:13) :

[...] important de mon script de mise en production, le tag des sources dans le repository CVS. CVS est un gestionnaire de sources, qui permet de [...]

2 03 2010
jozzy-online (05:34:21) :

Merci d’avoir un blog interessant

Laisser un commentaire

Vous pouvez utiliser ces balises html : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>