Boire ou coder ... Pourquoi choisir?
Publié le 31 mars 2010 22:00

Créer un tag GIT lors d'un déploiement

Non ceci n'est pas un poisson ;)

Je suis persuadé que vous utilisez tous Capistrano pour déployer vos applications web. Et vous utilisez GIT afin de versionner vos fichiers !

Cependant vous aimeriez bien vous souvenir de quand vous déployez, afin de pouvoir faire plus aisément un rollback. Ou tout simplement à but informatif. Et y'a justement une fonctionnalité cool de GIT prévue exactement pour ce genre de choses : les tags ! Vous aimeriez donc bien créer automatiquement un tag lorsque vous déployez votre application.

Comme ces tags doivent être lisibles et que nous travaillons avec Scrum, nous allons nommer chacun de ces déploiements en fonction de ce que l'on nommera des releases. Ces releases seront généralement calées sur des sprints. Mais pas forcément (un sprint peut n'avoir aucune release par exemple).

A vous de choisir comment vous nommez vos releases. Ici, on a décidé de prendre les super vilains de comics, dans l'ordre alphabétique (un en A; puis un en B, ...).

Commençons donc par nommer notre release. Nous utilisons multistage. Et nous souhaitons ne créer de tag que lorsque nous déployons en production.

Dans le fichier de configuration de la production (config/deploy/production.rb), configurons notre release.

set :current_tag_release, 'demolisseur'

Nous allons ensuite créer un recipe permettant de créer ce tag. Dans un fichier qui sera inclu pour votre déploiement (chez moi, config/deploy/recipes/deploy.rb)

require 'grit'
Capistrano::Configuration.instance.load do
    namespace :deploy do
        
        desc "Tags the local git branch and pushes it"
        task :tag do
            base_dir = File.join(File.dirname(__FILE__), '..', '..', '..')
            repo = Grit::Repo.new(base_dir)</p>

<p>            count = 1
            repo.tags.each do |tag|
                count += 1 if tag.name =~ Regexp.new("^#{current_tag_release}")
            end
      
            puts "  * -> Creating and pushing tag #{current_tag_release}-#{count.to_s}"
            system "cd #{base_dir}; git checkout #{branch}; git tag #{current_tag_release}-#{count.to_s}"
            system "cd #{base_dir}; git push --tags"
        end
    end

Que faisons-nous ?

Tout d'abord, avec grit, nous chargeons le repository git courant (donc celui de votre projet). Puis nous récupérons la liste de tous les tags et nous comptons combien de tags ont pour nom "release-x". Ou release est le nom de la release et x est le numéro du déploiement (de 1 à n). Nous ajoutons 1 à ce nombre afin d'obtenir le nom du tag à créer.

Par la suite, nous ne pouvons plus utiliser grit car celui-ci ne gère pas la création de tags. Nous devons donc utiliser system.

Tout d'abord :

system "cd #{base_dir}; git checkout #{branch}; git tag #{current_tag_release}-#{count.to_s}"
Nous nous rendons sur la branche déployée (normalement vous êtes déjà dessus mais bon ...). Puis nous créons le tag.

Puis :

system "cd #{base_dir}; git push --tags"
Nous poussons les tags sur le repository distant.

Pour finir, nous devons exécuter cette tâche à chaque déploiement en production. Retournons donc dans config/deploy/production.rb et ajoutons, en fin de fichier :

after "deploy:update_code", "deploy:tag"
Notre tag sera donc créé, juste après que le code n'ait été mis à jour sur le serveur.

Y'a plus qu'à déployer ! Notre tag sera créé et poussé sur le repository distant. Vous saurez maintenant exactement quand vous déployez votre application.

Commentaires

Matthieu Sadouni
Matthieu Sadouni dit: 31 mars 2010 22:00 Site web

Salut, ton article tombe bien j'allais m'attaquer prochainement à ce type de déploiement. Pour le moment j'utilise une branche par environnement. Je comptais me baser sur http://github.com/apinstein/git-deployment/ du coup je vais tester les deux. Merci !

Damien
Damien dit: 31 mars 2010 22:00 Site web

Cela n'empêche pas d'utiliser une branche par environnement :) Sur l'application sur laquelle je travaille, nous avons deux environnements : edge/dev et production/master.

Edge (environnement similaire à production mais à accès restreint) est déployé plusieurs fois par jour. On s'amuse pas à créer un tag à chaque fois. En revanche quand on déploie en production, on fait ça à 4 mains et on tag.

Postez un commentaire

Markdown activé