Salut à tous,
Je suis à la recherche d'un tuto assez simple sur Capistrano (ou pourquoi pas sur d'autres outils) pour gérer le déploiement de site.
J'ai vu le tuto de Gafikart sur le blog : Deployer comme un pro avec git.
Mais je cherche quelque chose d'un peu plus poussé.
J'entends beaucoup parler de ce fameux "Capistrano" sans vraiment bien comprendre la configuration. De plus, j'ai vu sur la page À propos que Grafikart l'utilisait sur la nouvelle version du site.
Dans mes multiples recherches, je suis tombé sur MagePHP (d'après ce qui est dit : semblable à Capistrano mais codé en PHP).
Quelqu'un a déjà essayé ?
Merci d'avance
Salut,
J'ai dû mettre en place Capistrano 3 pour le Continuous Deployment d'une appli Symfony 2 et je me suis servis de ce tuto.
Bien qu'orienté Symfony, c'est assez complet pour comprendre les mechanismes de base et ensuite adapter les scripts à ton application.
Après, selon ton environnement de travail (en gros si tu n'as pas accès aux rubygems), tu peux aussi t'orienter vers Fabric qui est en python.
@Hellow : Merci ! J'ai survolé rapidement et ce tuto semble bien détaillé (j'étais tombé sur pas mal de config sans vraiment d'explications). Je regarderai plus en détail dans la semaine !
Puis ça tombe bien, j'ai 2 applications Symfony2 qui sont concernées donc impeccable pour mes tests !
De rien :)
Pour info, les gars qui ont fait le tuto sont aussi ceux qui ont mis au point le plugin symfony pour Capistrano 3 avant de le laisser à l'équipe officielle de Capistrano.
J'ai commencé à mettre Capistrano 3 en place.
Le déploiement des fichiers via mon dépôt Gitlab se passe à merveille.
J'ai un peu galéré pour comprendre certaines parties de la config et je ne suis pas sûr de tout comprendre mais ça fonctionne !
Il me reste plus qu'à faire quelques tâches de déploiement..
Encore merci !
Y'a t-il moyen de lancer un déploiement à partir du serveur web (en plus du client) ?
Effectivement certaines parties sont assez tricky à comprendre.
Malheureusement non, le déploiement ne peut s'opérer que depuis le côté "client".
Les seuls moyens d'automatiser la tâche sont : un cron ou un job Jenkins (ou logiciel équivalant).
Pour te donner une idée de la démarche :
1/ un dev commit sur le repo git
2/ un webhook est envoyé à Jenkins
3/ le job associé au repo est lancé (git clone, testu, analyse etc...)
4/ en fin de job si tout c'est bien passé : cap production deploy
C'est en gros le workflow que j'ai mis en place chez nous.
J'ai un petit problème avec le flow que je ne comprends pas !
Voici un extrait de mon fichier "config.rb" :
after 'deploy:updated', 'sf:database'
after 'deploy:updated', 'sf:asset'
et mon fichier "sf.cap" :
namespace :sf do
desc 'Migration BDD'
task :database do
invoke 'symfony:run', :'doctrine:migration:migrate', '--no-interaction'
end
desc 'Dump assets'
task :asset do
invoke 'symfony:run', :'asset:dump', '--no-interaction'
end
end
Les commandes individuelles fonctionnent à merveille :
bundle exec cap dev sf:database
bundle exec cap dev sf:asset
Mon problème est plutôt sur le deploiement complet (cap dev deploy).
La 1ère commande "after" est lancée mais pas la seconde.
Si j'inverse les 2 commandes, c'est toujours la 1ère.
Impossible de lancer les 2 commandes via le hook "deploy:updated" !
Une idée de mon erreur ou une solution ?
Désolé du délais, je n'avais pas mes sources capistrano chez moi ;)
A mon avis le soucis viens de ta task, car dans mon config.rb j'ai :
# Post deployment tasks
after 'deploy:finishing', 'deploy:cleanup'
after 'deploy:updated', 'symfony:assets:install'
after 'deploy:updated', 'symfony:assetic:dump'
et ça roule comme sur des roulettes.
Pense également à augmenter le niveau de verbosité du debugger (si pas déjà fait) pour en savoir un peu plus sur ton soucis.
set :format, :pretty
set :log_level, :debug
Sinon une autre approche serait de réécrire une partie de la task deploy de Capistrano.
Voilà comment j'ai fais pour lui intégré l'initialisation d'un submodule dans le deploy :
Rake::Task["deploy:updating"].clear_actions
namespace :deploy do
desc 'Copy repo to releases, along with submodules'
task updating: :'git:update' do
on roles(:all) do
with fetch(:git_environmental_variables) do
within repo_path do
# We'll be using 'git clone' instead of 'git archive' (what Capistrano uses), since the latter doesn't fetch submodules.
# Use --recursive to fetch submodules as well.
execute :git, :clone, '-b', fetch(:branch), '--recursive', '.', release_path
# Delete .git* files. We don't need them, and they can be a security threat.
execute "find #{release_path} \\( -name '.git' -o -name '.gitignore' -o -name '.gitmodules' \\) -exec rm -rf {} \\; > /dev/null 2>&1", raise_on_non_zero_exit: false
# Loading the vendor submodule into Symfony via Composer
execute "cd '#{release_path}'; sudo composer run-script post-install-cmd > /dev/null 2>&1", raise_on_non_zero_exit: false
# Optimizing the vendors loading
invoke "composer:run", :dumpautoload, "-o"
execute "cd '#{release_path}'; sudo mv app/config/parameters.yml.dist app/config/parameters.yml > /dev/null 2>&1", raise_on_non_zero_exit: false
end
end
end
end
end