Déployer le projets en production¶
Déploiement automatisé avec l'outils capifony:
Il n'a pas besoin d'installer cet outils sur les serveurs de prod, seulement sur le poste client qui souhaite mettre à jour l'application en prod.
1. Installation de capifony¶
2. Configuration du fichier pour le déploiement¶
Se positionner à la racine du projet
capifony .
Ouvrir le fichier conf/deploy.rb
set :application, "ent"
set :domain, "appz.abuledu.net"
set :domainbzr, "redmine.ryxeo.com"
set :deploy_to, "/home/webs/ent.abuledu.net/htdocs/"
set :repository, "sftp://#{domainbzr}/home/groupes/developpeurs/horizon/horizon-ent/version-1.0"
set :scm, :bzr
set :git_enable_submodules, 1
set :deploy_via, :remote_cache
role :web, domain # Your HTTP server, Apache/etc
role :app, domain # This may be the same as your `Web` server
role :db, domain, :primary => true # This is where Rails migrations will run
set :use_sudo, false
set :user, 'tgilbert'
set :password, '******'
set :keep_releases, 3
set :symfony_env, "prod"
set :symfony_env_prod, "prod"
set :rake, "rake"
set :rails_env, "production"
set :migrate_env, "prod"
set :migrate_target, :latest
set :tg_db_type, "mysql"
set :tg_db_user, "abuledu"
set :tg_db_pwd, "*****"
set :tg_db_name, "abuledu"
Sur couche pour capifony (afin d'utiliser mes propres fonctions lors de la mise à jour du code
# Met à jour les plugins avant d'utiliser les fonctions symfony
# Test
before "deploy:finalize_update" do
abuledu_init.initplugin
abuledu_init.createlinksf
abuledu_init.projectconfig
end
after "deploy:finalize_update" do
abuledu_init.fixtures
end
after "deploy:setup" do
abuledu_init.initsf
migration.setup
end
after "deploy:symlink" do
migration.createlink
migration.migrate
migration.getnumversion
end
after "deploy:rollback:default" do
migration.migratecurrent
end
Actions non implémenter dans la version de capifony (Migration de la bdd et initialisation des données du projets)
A ajouter au fichier
- initsf : permet d'utiliser symfony sans l'installer sur le serveur
- initplugin : Initialise les plugin lors du déploiement du code
namespace :abuledu_init do
desc <<-DESC
Initialise la librairie symfony
DESC
task :initsf do
run "if [ ! -d #{shared_path}/lib/vendor ]; then mkdir -p #{shared_path}/lib/vendor; cd #{shared_path}/lib/vendor; wget http://redmine.ryxeo.com/attachments/download/1038/symfony-1.4.11.tgz; tar zxpf symfony-1.4.11.tgz; mv symfony-1.4.11 symfony; rm symfony-1.4.11.tgz; fi"
end
task :initplugin do
#run "mkdir #{release_path}/plugins"
run "cd #{release_path}; bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/horizon/horizon-plugins-sf/ksWdCalendarPlugin-1.0 plugins/ksWdCalendarPlugin"
run "cd #{release_path}; bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/horizon/horizon-plugins-sf/sfJqueryReloadedPlugin-1.0 plugins/sfJqueryReloadedPlugin"
run "cd #{release_path}; bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/horizon/horizon-plugins-sf/sfFormExtraPlugin-1.0 plugins/sfFormExtraPlugin"
run "cd #{release_path}; bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/horizon/horizon-plugins-sf/abuleduLdapPlugin-1.0 plugins/abuleduLdapPlugin"
run "cd #{release_path}; bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/horizon/horizon-plugins-sf/abuleduGuardPlugin-1.0 plugins/abuleduGuardPlugin"
run "cd #{release_path}; bzr branch sftp://redmine.ryxeo.com/home/groupes/developpeurs/horizon/horizon-plugins-sf/abuleduCASifyPlugin-1.0 plugins/abuleduCASifyPlugin"
end
desc <<-DESC
Création du lien symbolique pour symfony
DESC
task :createlinksf do
run "ln -s #{shared_path}/lib/vendor/symfony/data/web/sf #{release_path}/web/"
run "ln -s #{shared_path}/lib/vendor/ #{release_path}/lib/vendor"
end
task :projectconfig do
run "cp -f #{release_path}/config/ProjectConfiguration.class.prod #{release_path}/config/ProjectConfiguration.class.php"
end
task :fixtures do
run "cd #{release_path}/data/fixtures; rm `ls | grep -v prod.yml`"
end
end
Fonction permettant de mettre à jour la base symfony
namespace :migration do desc <<-DESC Initialise le répertoire migration/doctrine pour en faire un lien DESC task :setup do run "mkdir -p #{shared_path}/migration/doctrine" end desc <<-DESC Création du lien symbolique vers le répertoire migration/doctrine DESC task :createlink do run "ln -s #{shared_path}/migration #{current_path}/lib/" end desc <<-DESC Effectue la différence entre le modèle en production et la dernière version DESC task :diff, :on_error => :continue do run "rm -Rf #{deploy_to}temp" run "mkdir #{deploy_to}temp" run "cp -Rf #{current_path}/* #{deploy_to}temp/" upload("config/doctrine/schema.yml", "#{deploy_to}temp/config/doctrine/", :via=> :scp, :recursive => true) upload("plugins/abuleduGuardPlugin/config/doctrine/schema.yml", "#{deploy_to}temp/plugins/abuleduGuardPlugin/config/doctrine/", :via=> :scp, :recursive => true) run "#{php_bin} #{deploy_to}temp/symfony doctrine:generate-migrations-diff --env=prod" run "rm -Rf #{deploy_to}temp" end desc <<-DESC Met à jour le modèle de la BDD en fonction de la dernière révision DESC task :migrate , :on_error => :continue do run "if [ -d #{current_path} ]; then #{php_bin} #{current_path}/symfony doctrine:migrate --env=prod; fi" end desc <<-DESC Migre vers une version -1 DESC task :down do run "#{php_bin} #{current_path}/symfony doctrine:migrate --down --env=prod" end desc <<-DESC Migre vers une version +1 DESC task :up do run "#{php_bin} #{current_path}/symfony doctrine:migrate --up --env=prod" end desc <<-DESC Migre vers la version correspondant à la révision encours DESC task :migratecurrent do snumversion = 0; run "cat '#{current_path}/numversion'" do |ch, st, data| snumversion = Integer(data); end run "#{php_bin} #{current_path}/symfony doctrine:migrate #{snumversion} --env=prod" end desc <<-DESC Récupère le numéro de version de la base pour la révision encours DESC task :getmigrationcurrent do snumversion = 0; run "cat '#{current_path}/numversion'" do |ch, st, data| snumversion = data; end end desc <<-DESC Récupère le numéro de version migration inscrit en base de données DESC task :getnumversion do case #{tg_db_type} when 'mysql' begin run "mysql -h localhost -u #{tg_db_user} --password=#{tg_db_pwd} -N -b -s #{tg_db_name} -e 'select version from migration_version;' > #{current_path}/numversion;" rescue Exception => error migration.versionvide end when 'pgsql' begin run "export PGUSER=#{tg_db_user}; export PGPASSWORD=#{tg_db_pwd}; psql -h localhost -t -c 'select version from migration_version;' #{tg_db_name} > #{current_path}/numversion;" rescue Exception => error migration.versionvide end end end task :versionvide do run "echo '0' > #{current_path}/numversion" end end
3. Lancer le déploiement¶
Une fois le script enregistrer, il faut lancer la commande suivante :
Initialisation du projets en prod et premier lancement
cap deploy:setup cap deploy:cold
Configuration de la base
Saisir les données de l'utilisateur pour la base de données du projets
dsn [mysql:host=localhost;dbname=frontend] : mysql:host=localhost;dbname=abuledu
db_username [root] : abuledu
db_password : abuledu
Do you really want to rebuild prod's database and load prod's fixtures? (y/N)
N
Mettre à jour le site en production
Avant de déployer le code, il faut d'abord mettre à jour la base
cap migration:diff
Cette commande va vérifier que le modèle est différents et générer les scripts de migration sans migrer la base ni le code
Si tous c'est bien passé, il ne reste plus qu'à déployer
cap deploy
4. Retour en arrière rollback¶
S'il faut retourner en arrière, il suffit de lancer la commande suivante
cap deploy:rollback
Il revient à la version précédente au niveau du code et de la base
Si la base n'a pas changé il faut lancer la commande suivante
cap deploy:rollback:code
Pour migrer la base manuellement de niveau supérieur à inférieur
cap migration:down ou cap migration:up
Pour connaitre la version de migration du répertoire courant
cap migration:getmigrationcurrent
5.Problèmes connus¶
Lors du déploiement de l'application, il y a un bug avec scm de bazarr (bzr)
Il faut modifier le fichier bzr.rb
sudo vim ~/.rvm/gems/ruby-1.9.2-p180/gems/capistrano-2.5.21/lib/capistrano/recipes/deploy/scm/bzr.rb
def query_revision(revision)
return revision unless :head == revision
command = scm('revno', repository)
result = yield(command).chomp
end