Table des matières

TP : Gérer son site web avec Git

Nota :

Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !

Introduction

Vous gérez vos projets ou vos documents avec git, et vous vous demandez comment faire pour gérer vos sites web de même?

Une des fonctionnalités de Git que nous allons fortement utiliser est celle de «branches». Nous allons mettre en place un système de hooks2), pour faciliter l'intégration de notre flot de travail.

Nous allons considérer le schéma suivant, assez classique :

Installation

Installer git sur le serveur et le client :

apt-get install git

Mise en place

Initialisation du dépôt

Création d'un dépôt nu sur le serveur

Sur le serveur :

mkdir -p /srv/monsiteweb/www.git
mkdir www.git
git init --bare www.git

Configuration des hooks sur le serveur

Sur le serveur :

vim /srv/monsiteweb/www.git/hooks/post-update

Le fichier doit contenir le code suivant :

/srv/monsiteweb/www.git/hooks/post-update
#!/bin/sh
for i in $*
do
  b=$(basename $i)
  if [ "$b" = "prod" ]
  then
    # Remplacer le chemin par celui utilisé par le serveur web pour
    # la version en production
    GIT_WORK_TREE=/srv/monsiteweb/www/ git checkout -f $b
  fi
  if [ "$b" = "dev" ]
  then
    # Remplacer le chemin par celui utilisé par le serveur web pour
    # la version en développement
    GIT_WORK_TREE=/srv/monsiteweb/www-dev/ git checkout -f $b
  fi
done

Le rendre exécutable :

chmod +x /srv/monsiteweb/www.git/hooks/post-update
Si vous utilisez un moteur de blog statique comme pelican ou acrylamid, vous pouvez lancer la recompilation du blog depuis ce fichier, juste après le checkout.

Clonage du dépôt sur le client

Sur le client :

mkdir -p ~/projets/mon-site/
cd ~/projets/mon-site/
git clone toto@serveur:/srv/monsiteweb/www.git

Création des branches

Ces manipulations sont à faire sur client:

La branche upstream

Cette branche est facultative et contient les sources du site web telles que fournies par son développeur.

cd ~/projets/mon-site/www
Par exemple:
wget 'http://download.dokuwiki.org/src/dokuwiki/dokuwiki-oldstable.tgz' -O/tmp/dokuwiki-oldstable.tgz
tar xf /tmp/dokuwiki-oldstable.tgz --strip-components 1
git add .
git commit -m 'Version initiale'
git branch -m master upstream
git push -u origin upstream

La branche dev

Cette branche est facultative et contient les sources du site web de développement. Un tel site est pratique pour mettre le code en test avant de le passer en production.

git checkout upstream
git branch dev
git checkout dev
Par exemple :
rm README VERSION COPYING
git commit -a -m 'Préparation à la mise en test'
git push -u origin dev

Le hook de la branche dev devrait alors s'activer automatiquement et placer les sources dans le dossier de dev sur le serveur.

La branche prod

Cette branche correspond à la version en cours d'utilisation sur le serveur.

git checkout dev
git branch prod
git checkout prod
git push -u origin prod

Le hook de la branche prod devrait alors s'activer automatiquement et placer les sources dans le dossier de prod sur le serveur.

Opérations courantes

Comment intégrer les opérations de maintenance courantes avec la structure git définie.

Ajout d'une fonctionnalité

Ou correction d'une fonctionnalité indésirable…

git checkout dev
git pull
git commit -a -m 'bug corrigé'
git push
git checkout master
git merge dev -m 'intégration de la correction de bug'
git push

Mise à jour depuis upstream

git checkout upstream
Par exemple :
git checkout upstream
rm -r *
wget 'http://download.dokuwiki.org/src/dokuwiki/dokuwiki-stable.tgz' -O/tmp/dokuwiki-stable.tgz
tar xf /tmp/dokuwiki-stable.tgz --strip-components 1
git add --all .
git commit -a -m 'nouvelle version upstream: Binky (2013-12-08)'
git push
git checkout dev
git rebase upstream
Corriger les erreurs éventuelles de fusion. Par exemple :
git rm VERSION
git rebase --continue
git push --force
git checkout prod
git merge dev -m 'intégration de la nouvelle version upstream'
git push

Références

1)
N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !
2)
crochets: scripts exécutés automatiquement lors de certaines opérations effectuées sur un dépôt git