Despliegue de la misma base de código con pequeñas variaciones en varios serveres con capistrano y git

Tenemos una base de código que vendemos a múltiples clientes. Usamos git para control de versiones y Capistrano para implementaciones automatizadas.

Existen ligeras variaciones entre las implementaciones, como layouts de layout, files CSS, logotypes y files de configuration, como el controller frontal de CAKEPHP, que tiene las routes a la aplicación y los directorys cakephp en él.

Actualmente contamos con twigs principales maestras / etapas para el proyecto. Desarrollamos en las twigs de tema, una vez que la twig de tema está list para fusionarse en la base de código, fusionamos la twig de tema en etapas y la implementamos en nuestro server de ensayo principal.

Una vez que el código ha sido probado en la puesta en escena y estamos listos para lanzar, fusionamos la etapa en maestra. Luego tenemos que implementar en los diferentes serveres del cliente. Tenemos un server de producción y producción para cada cliente.

Actualmente tenemos una sucursal de producción y ensayo para cada cliente e implementamos en cada server de cada sucursal. Esto se está volviendo doloroso ya que tenemos que fusionar nuestra twig principal de proyectos en las twigs de producción / etapas para cada cliente y la cap deploy ejecución para cada server.

¿Cómo podemos simplemente implementar en los serveres de los clientes desde una sola twig, pero include los diferentes files necesarios para que cada server de clientes funcione y se vea como es debido?

Utilicé capistrano / ext / multistage para hacer algo similar.

Cuando entrego en producción, puedo usar el cap prod deploy , y cuando entrego para probar, puedo usar el cap test deploy .

Mi Capfile se ve como

 require 'rubygems' require 'railsless-deploy' require 'capistrano/ext/multistage' set :stages, %w(staging) load 'config/deploy' 

En config / deploy.rb es mi script de implementación principal.

En config / deploy tengo un script para cada entorno. es decir, prod.rb y test.rb.

Estos scripts específicos del entorno contienen variables específicas para esos entornos. Generalmente, especifico cosas como branch, user, app, deploy_to, copy_remote_dir, copy_exclude y cualquier otra variable que necesite usar en la configuration / deploy.rb principal que podría ser diferente entre entornos.

Algunas variables pueden no aparecer en todos los scripts específicos del entorno, por lo que deploy.rb comtesting su existencia antes de usarlos. es decir

 # Link upload area if exists?(:uploads) run "rm -rf #{current_release}#{uploads}" run "ln -s #{shanetworking_path}#{uploads} #{current_release}#{uploads}" end 

A veces, copyré una configuration específica del entorno, utilizando el nombre de ensayo

 # Copy config run "cp #{current_release}/config/#{stage}/app/config.php #{current_release}/src/app" 

Debo mencionar que utilizo git y una estrategia de copy para mi deploy_via. Como resultado, todas las configuraciones se cargan en los serveres en directorys fuera del path, y luego se copyn para colocarlas. Su experiencia puede ser diferente.

Obtenga más información sobre la extensión de múltiples etapas para capirstrano aquí: http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage