====== TP : Gérer son site web avec Git ====== * Objet : Gérer son site web avec Git * Niveau requis : {{tag>avisé}} * Commentaires : //Vous gérez un ou plusieurs sites web sur votre serveur. Vous voulez l'administrer avec git pour faciliter les mises-à-jour/patch/etc.// * À savoir : [[:doc:systeme:git:git|Utilisation de git]] :-) * Suivi : {{tag>}} * Création par [[user>captnfab]] 06/03/2014 * Testé par <...> le <...> FIXME * Commentaires sur le forum : [[https://debian-facile.org/topic-8596-wiki-tp-gerer-son-site-web-avec-git-page-1.html | ici]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) **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 //hooks//((crochets: scripts exécutés automatiquement lors de certaines opérations effectuées sur un dépôt git)), pour faciliter l'intégration de notre flot de travail. Nous allons considérer le schéma suivant, assez classique : * Une machine « **serveur** » * sur laquelle est installé un serveur **ssh** permettant à l'utilisateur //toto// de se connecter * sur laquelle est installé un serveur web publiant les données présentent dans ''/srv/monsiteweb/www'' (dossier inscriptible par //toto//) * ainsi que les données présentent dans ''/srv/monsiteweb/www-dev'' (dossier inscriptible par //toto//) * Une machine « **client** » * sur laquelle //toto// développe son site web. ===== 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 : #!/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 [[http://blog.getpelican.com/|pelican]] ou [[http://posativ.org/acrylamid/|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 * Rajouter les-dites sources dans le dossier. 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 * Indiquer à git de les prendre en compte : git add . git commit -m 'Version initiale' * Renommer la branche en //upstream// : git branch -m master upstream * Envoyer la branche sur le dépôt distant : 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. * Créer la branche //dev// basée sur la branche //upstream// : git checkout upstream git branch dev git checkout dev * Appliquer les modifications voulues. Par exemple : rm README VERSION COPYING * Valider les changements et envoyer le résultat sur le dépôt distant : 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. * Créer la branche //prod// basée sur la branche //dev// : git checkout dev git branch prod git checkout prod * La branche de test étant satisfaisante (sinon on ne la passerait pas en production), on se contente de la publier. 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…// * Récupérer des versions à jour du dépôt : git checkout dev git pull * Éditer la branche dev * Valider vos modifications : git commit -a -m 'bug corrigé' * Soumettre vos modifications git push * Lorsque le résultat est convenable, mettre à niveau la branche master git checkout master git merge dev -m 'intégration de la correction de bug' * Serrer les fesses et soumettre le résultat : git push ==== Mise à jour depuis upstream ==== * Récupérer les nouvelles sources dans la branche //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)' * Soumettre le résultat : git push * Importer les changements dans la branche de dev : git checkout dev git rebase upstream Corriger les erreurs éventuelles de fusion. Par exemple : git rm VERSION git rebase --continue * Puis soumettre la nouvelle version : git push --force * Fusionner la branche dev opérationnelle depuis la branche prod : git checkout prod git merge dev -m 'intégration de la nouvelle version upstream' * Serrer les fesses et soumettre le résultat : git push ===== Références ===== * http://www.git-scm.com/book/fr * http://toroid.org/ams/git-website-howto (en) * https://www.kernel.org/pub/software/scm/git/docs/githooks.html (en)