Projet

Général

Profil

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
Redmine Appliance - Powered by TurnKey Linux