Usando capistrano para implementar desde diferentes twigs de git

Estoy usando capistrano para implementar una aplicación RoR. La base de código está en un repository de git, y la ramificación es ampliamente utilizada en el desarrollo. Capistrano usa el file deploy.rb para su configuration, uno de ellos es la twig para implementar.

Mi problema es este: digamos que creo una nueva twig A desde el maestro . El file de implementación hará reference a la twig maestra . Edito eso, por lo que A puede implementarse para probar el entorno. Termino de trabajar en la característica y fusiono la twig A en maestra . Como el file deploy.rb de A es más deploy.rb , se fusiona y ahora el deploy.rb en la twig principal hace reference a A. Hora de editar nuevamente.

Esa es una gran cantidad de edición manual aparentemente innecesaria: el parámetro siempre debe coincidir con el nombre de la twig actual. Además de eso, es fácil olvidarse de editar la configuration cada vez.

¿Cuál sería la mejor manera de automatizar este process?

Editar: Resulta que alguien ya había hecho exactamente lo que necesitaba :

Esta mañana tuve la oportunidad de implementar una twig de un repository git en un server de almacenamiento intermedio, pero no tenía la menor idea de cómo hacerlo. Una búsqueda rápida a través del código fuente de capistrano reveló que podía usar set :branch "branch_name" en mi script de implementación. Lo intenté y funcionó. Luego pensé que tendría que hacer un cambio similar en todas mis sucursales. Por supuesto, soy un perezoso y me pregunto si no habría una mejor manera.

Si no está familiarizado con git, la salida del command git branch es una list de twigs con un asterisco que marca el que está actualmente desprotegido en su máquina local. Por ejemplo:

 > git branch * drupal_authentication fragment_caching master 

Entonces, pensé, ¿qué pasa si solo analicé el resultado y busqué la twig marcada como actual?

 set :branch, $1 if `git branch` =~ /\* (\S+)\s/m 

Ahora puedo implementar cualquier twig que esté actualizada en mi equipo local desde un solo script de implementación compartido.

Esto funciona con Capistrano> = 3.1:

agregue esta línea a config / deploy.rb:

 set :branch, ENV['BRANCH'] if ENV['BRANCH'] 

y luego llama a capistrano con:

 cap production deploy BRANCH=master 

Esta solución funciona con Capistrano <3.1 :

 #call with cap -s env="<env>" branch="<branchname>" deploy set :branch, fetch(:branch, "master") set :env, fetch(:env, "production") 

Usando Capistrano 3.1.0+, ninguno de estos me funcionaba más. En cambio, de acuerdo con sus instrucciones comentadas:

  ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } 

Pero, no quiere usar ask o le avisará. En su lugar, debes usar set . HEAD es la twig más alta; 'borde' como se llama. Si desea una twig diferente, reemplace HEAD con su nombre de sucursal, por ejemplo: master , staging , etc.

Para concluir con ejemplos, en /config/deploy/production.rb , puede include esta línea:

  set :branch, proc { `git rev-parse --abbrev-ref master`.chomp } 

…o

  set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp } 

Por cierto, HEAD es la configuration pnetworkingeterminada, por lo que no hay necesidad de decirlo en el file. Se puede usar mejor en /config/deploy/edge.rb .

En /config/deploy/staging.rb , puede include esta línea:

  set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp } 

…o

  set :branch, proc { `git rev-parse --abbrev-ref test`.chomp } 

¡Entiendes la idea!

Espero que estos ejemplos ayuden a los futuros usuarios de capistrano (^_^)

Con varias etapas, en realidad ahora es:

 cap production deploy -s branch=my-branch 

La syntax del post anterior no funciona en mi entorno

Una alternativa a esto es:

En deploy.rb / stage.rb:

 set :branch, ENV['BRANCH'] || 'develop' 

En la línea de command:

 cap deploy BRANCH=featurex 

Esto le da una twig pnetworkingeterminada (que podría ser diferente para diferentes entornos) y la capacidad de cambiar de twigs cuando lo desee.

Alternativamente, puede estructurarlo desde la línea de command donde tiene una twig y un entorno pnetworkingeterminados y también puede pasar parameters a la llamada de límite, que podría include el entorno y la twig que se utilizarán. Esta podría ser una twig que se expide explícitamente o podría tener un parámetro que indique la twig actual como se describe en el enlace que enumeró.

 #call with cap -S env="<env>" branch="<branchname>" deploy ... # Prevents error if not parameter passed, assumes that default 'cap deploy' command # and should deploy the master branch to the production server set(:env, 'production') unless exists?(:env) set(:branch, 'master') unless exists?(:branch) if !env.nil? && env == "production" role :web, "production_ip_address" else # add more as needed role :web, "development_ip_address" end if !branch.nil? && branch == "current" set :branch, $1 if `git branch` =~ /\* (\S+)\s/m elsif !branch.nil? set :branch, branch else # add more as needed set :branch, "master" end ... 

Ejemplo de código muy prestado de aquí

Si está utilizando capistrano-multistage , solo necesita ejecutar

 cap -s branch=$MY_BRANCH deploy 

o

 cap -s branch=$MY_BRANCH production deploy 

sin más modificaciones a su deploy.rb .

Este command ya no funcionará:

 cap deploy -s branch=your_branch 

Soporte para -sS flags fue eliminado en capistrano v3 +.
Aquí puedes leer más sobre esto: enlace
Se mencionó en un par de respuestas, pero actualmente no es correcto.

Lo que funciona para mí:
en el file deploy.rb agregar

 set :branch, ENV['BRANCH'] || :master 

entonces corre:

 BRANCH=your_branch cap deploy 

También tenga en count que, para ejecutar con éxito este command, debe estar en la twig principal.

Esta solución debería funcionar con todas las versiones de Capistrano.

 def branch_name(default_branch) branch = ENV.fetch('BRANCH', default_branch) if branch == '.' # current branch `git rev-parse --abbrev-ref HEAD`.chomp else branch end end set :branch, branch_name('master') 

Uso:

 BRANCH=. cap [staging] deploy # => deploy current branch BRANCH=master cap [staging] deploy # => deploy master branch cap [staging] deploy # => deploy default branch 

Estoy usando la versión 3.3.5 y tengo esto funcionando:

 set :branch, 'develop' 

Respuesta general:

Si tiene un file de configuration con un contenido modificado de entorno a entorno, debe hacer que esa línea sea una "plantilla" (con una cadena que representa un nombre de variable como @BRANCH_NAME@ o @ENV_NAME@ ).

Luego, tendría un script (versionado) capaz de leer su file de configuration y replace la variable " @BRANCH_NAME@ " por el valor apropiado que necesita su process de implementación.

Para los usuarios de capistrano 3:

 desc "prompt for branch or tag" task :git_branch_or_tag do on roles(:all) do |host| run_locally do execute :git, 'tag' tag_prompt = "Enter a branch or tag name to deploy" ask(:branch_or_tag, tag_prompt) tag_branch_target = fetch(:branch_or_tag, 'master') set(:branch, tag_branch_target) end end end before 'deploy:updated', :git_branch_or_tag 

Método 1: establecer la twig específica de la etapa (por ejemplo, testing, producción) para la implementación

Ponga la configuration de la branch en files de escenario en lugar de 'deploy.rb' y configure la twig de destino para esa etapa desde la que se desplegará.

Para una aplicación de dos etapas con test y production nombre de twig asociada, la configuration se verá así,

 # app_root/config/deploy/test.rb ... set :branch, "test" ... # app_root/config/deploy/production.rb ... set :branch, "production" ... 

Este método permite implementar desde twigs específicas de la etapa. Por lo tanto, solo se necesitará un paso adicional para fusionar o volver a establecer la base del último código de la twig base.

Método 2: Implementar directamente desde cualquier twig (usando la label)

Otro enfoque es implementar usando tag. Para implementar el uso de la label, configure la configuration de la branch . en 'deploy.rb' de la siguiente manera,

 set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp 

Y configure el CI para implementar condicionalmente en diferentes etapas si el patrón de label asociado coincide (por ejemplo, /.*-test$/ ).

Ahora, se puede hacer un deployment desde cualquier twig,

  • Primero, crea una label desde cualquier twig,

    git tag -a v0.1.0-test -m "Versión 0.1.0-test"

  • Y, empujar

    git push origen v0.1.0-test

Nota: Los methods anteriores se basan en Capistrano 3.