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}"
Puis :
system "cd #{base_dir}; git push --tags"
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"
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
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 !
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.