Capifony: Capistrano, Git et symfony

Suite à l’article publié sur le blog de SimpleIT, il y a plusieurs mois, et après avoir remplacé mon fidèle Zend Frameworks par symfony, je me suis penché sur capistrano.

Voici l’article en question : http://www.simple-it.fr/blog/index.php?post/2010/08/20/Mise-en-ligne-des-nouveautes-du-SdZ-avec-Capistrano.

Je me suis donc penché sur le problème et après plusieurs recherches je suis tombé sur Capifony.

En effet, Capistrano est à la base réalisé pour déployer des applications RoR et non symfony.

Un groupe de développeurs a donc adapté cet outil, afin de le rendre utilisable rapidement avec nos projets symfony.

Vous pouvez trouver la page github de Capifony à cette adresse : https://github.com/everzet/capifony

J’ai trouvé un excellent tutoriel réalisé par un des auteurs du projet : http://blog.servergrove.com/2010/07/12/symfony-git-capistrano-capifony/.

J’ai adapté la première moitié et je vous l’ai traduite, mais je n’ai pas eu le courage de m’occuper de la deuxième moitié qui est déjà suffisamment claire et bien faite.

Installation

Capifony est basé sur capistrano qui est codé en ruby, il vous faudra donc ruby et gem d’installés.

Sous Mac, il suffit de lancer sudo gem update –system.

Pour installer capifony, lancez simplement :

1
gem install capifony

Cette commande installera capifony sur votre ordinateur local. (Capifony doit être installé sur votre machine de travail, inutile de l’installer sur vos serveurs).

Mise en place du projet symfony

1
2
3
4
5
cd /var/www
mkdir demo
cd !$
git init
touch .gitignore

Ajoutez ces lignes au .gitignore pour exclure les liens symboliques, les configurations de base de données, le cache, les backups, uploads & log de votre dépôt git:

.gitignore
1
2
3
4
5
6
7
8
9
web/sf*
web/uploads/*
cache/*
plugins/.*
log/*
config/databases.yml
mkmf.log
.rsync*
backups/*

Faisons notre premier commit :

1
2
git add .gitignore
git commit -m "initial commit"

Librairie symfony avec le projet

Ajout des sources de symfony au projet

Deux possiblités s’offrent à nous :

  • soit on télécharge les sources depuis le dépot subversion, mais l’ensemble du frameworks sera recopié à chaque déploiement.
  • soit on télécharge les sources depuis un mirroir git en tant que submodule, ce qui permettra un gain de temps lors du déploiement, car le frameworks ne sera pas copié.

Dans les deux cas, la synchronisation depuis le dépot subversion ou le dépot git sont aisées.

Synchronisation subversion

1
2
3
mkdir -p lib/vendor
svn co http://svn.symfony-project.com/branches/1.4/ lib/vendor/symfony
php lib/vendor/symfony/data/bin/symfony generate:project demo

Synchronisation Git

Nous utiliserons le dépôt git reconnu par l’auteur du tutoriel d’origine, mais ce dépôt n’est plus synchronisé sur le subversion de symfony depuis quelques temps. Rien ne vous empêche de créer votre propre dépôt et de le synchroniser celui-ci sur le dépôt subversion via git-svn.
EDIT: Il existe maintenant un dépot git officiel maintenu par SensioLabs.

1
git submodule add https://github.com/symfony/symfony1.git lib/vendor/symfony

Poussons notre projet local sur le dépôt distant

1
2
3
git add . git commit -m 'bundled symfony'
git remote add origin ssh://user@host/demo.git
git push origin master:refs/heads/master

Configuration

Now is the time to play with capifony itself. First of all, lets “capifony” our project:

1
capifony .

Capifony created Capfile and config/deploy.rb. Go into config/deploy.rb and edit it’s variables. To set capistrano config variables, you need to call set :var_name, “var_value” instruction inside deploy.rb. Below is the list of main variables:

  • :application – set your application name here (“demo” in our case);
  • :domain – domain of our remote server. This variable will be auto-populated with #{application}.com (demo.com in our case). Place your server address here if it’s not demo.com. I set it to #{application}.everzet.com, because my test host is http://demo.everzet.com;
  • :deploy_to – path, where we will deploy our application (in most cases /var/www/#{domain});
  • :repository – path to repository (#{domain}:/var/repos/#{application}.git in our case);
  • :scm – source code management tool. In our case set it to :git, but it can be any of accurev, bzr, cvs, darcs, subversion, mercurial, perforce, subversion or even none;
  • :use_sudo – set to false, because we doesn’t need sudo during our deployment process;
  • :deploy_via – set it to :remote_cache, so deployments will last less time;
  • :git_enable_submodules – set it to 1 if you have submodules in project (if you staged symfony as submodule for example);

Also add this line to config/deploy.rb:

config/deploy.rb
1
ssh_options[:forward_agent] = true

if you want to use your local SSH key instead of remote one for git checkout.

Your resulting config/deploy.rb is must be something like this:

config/deploy.rb ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
set :application, "demo"
set :domain, "#{application}.everzet.com"
set :deploy_to, "/var/www/#{domain}"
set :scm, :git
set :git_enable_submodules, 1
set :repository, "#{domain}:/var/repos/#{application}.git"
set :deploy_via, :remote_cache
role :web, domain
role :app, domain
role :db, domain, :primary => true
set :use_sudo, false
set :keep_releases, 3
ssh_options[:forward_agent] = true

Deployment

To start, we need to know 3 basic capistrano commands:

  • cap deploy:setup – create directories on server;
  • cap deploy:cold – copy code, build database, make symlinks;
  • cap deploy – copy code, make symlinks.

Now run:

1
cap deploy:setup

Now lets deploy our application for the first time:

1
cap deploy:cold

If you’ve configured your remote server hosts right, you now can open http://your.remote.host/main & see you symfony application there.

Deploy & Rollback

Now what if we change something, deployed it and it’s broke our site? Lets break something!

1
2
3
git add .
git commit -m 'buggy change'
git push origin master

Now deploy this bug:

1
cap deploy

and try to open http://your.remote.host/main. Oh, no! Something broke. What to do? Simple! Run:

1
cap deploy:rollback

and capistrano will roll your server back to previous working version of project and you will be able to find, fix, push and deploy the bugfix later, without problems.


Edit: Si vous n’avez toujours pas compris le fonctionnement de Capifony ou son utilité je vous recommande d’aller lire cet article : http://tech.joro.fr/capifony-explique-a-nos-clients/.
Si vous recontrez des soucis, peut-être que cet article vous aidera à les résoudre: http://tech.joro.fr/retour-dexperience-capifony/.