qué - git tag
Usando capistrano para implementar desde diferentes ramas de git (12)
Estoy usando capistrano para implementar una aplicación RoR. La base de código está en un repositorio de git, y la ramificación es ampliamente utilizada en el desarrollo. Capistrano usa el archivo deploy.rb
para su configuración, uno de ellos es la rama para implementar.
Mi problema es este: digamos que creo una nueva rama A desde el maestro . El archivo de implementación hará referencia a la rama maestra . Edito eso, por lo que A puede implementarse para probar el entorno. Termino de trabajar en la característica y fusiono la rama A en maestra . Como el archivo deploy.rb
de A es más deploy.rb
, se fusiona y ahora el deploy.rb
en la rama principal hace referencia 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 rama actual. Además de eso, es fácil olvidarse de editar la configuración cada vez.
¿Cuál sería la mejor manera de automatizar este proceso?
Editar: Resulta que alguien ya había hecho exactamente lo que necesitaba :
Esta mañana tuve la oportunidad de implementar una rama de un repositorio git en un servidor 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 comando git branch es una lista de ramas 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 rama marcada como actual?
set :branch, $1 if `git branch` =~ //* (/S+)/s/m
Ahora puedo implementar cualquier rama que esté actualizada en mi equipo local desde un solo script de implementación compartido.
Método 1: establecer la rama específica de la etapa (por ejemplo, prueba, producción) para la implementación
Coloque la configuración de la branch
en los archivos de escenario en lugar de ''deploy.rb'' y configure desde allí la rama de destino para esa etapa.
Para una aplicación de dos etapas con test
y production
nombre de rama asociada, la configuración 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 ramas 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 rama base.
Método 2: Implementar directamente desde cualquier rama (usando la etiqueta)
Otro enfoque es implementar usando tag. Para implementar el uso de la etiqueta, configure la configuración 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 etiqueta asociado coincide (por ejemplo, /.*-test$/
).
Ahora, se puede hacer un despliegue desde cualquier rama,
Primero, crea una etiqueta desde cualquier rama,
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 métodos anteriores se basan en Capistrano 3.
Alternativamente, puede estructurarlo desde la línea de comando donde tiene una rama y un entorno predeterminados y también puede pasar parámetros a la llamada de límite, que podría incluir el entorno y la rama que se utilizará. Esto podría ser una rama que se expide explícitamente o podría tener un parámetro que indique la rama 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
...
Con varias etapas, en realidad ahora es:
cap production deploy -s branch=my-branch
La sintaxis del post anterior no funciona en mi entorno
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
Este comando 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: link
Se mencionó en un par de respuestas, pero actualmente no es correcto.
Lo que funciona para mí:
en el archivo deploy.rb
agregar
set :branch, ENV[''BRANCH''] || :master
entonces corre:
BRANCH=your_branch cap deploy
También tenga en cuenta que, para ejecutar con éxito este comando, debe estar en la rama principal.
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")
Estoy usando la versión 3.3.5 y tengo esto funcionando:
set :branch, ''develop''
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
Respuesta general:
Si tiene un archivo de configuración 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 archivo de configuración y reemplazar la variable " @BRANCH_NAME@
" por el valor apropiado que necesita su proceso de implementación.
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
.
Una alternativa a esto es:
En deploy.rb / stage.rb:
set :branch, ENV[''BRANCH''] || ''develop''
En la línea de comando:
cap deploy BRANCH=featurex
Esto le da una rama predeterminada (que podría ser diferente para diferentes entornos) y la capacidad de cambiar de ramas cuando lo desee.
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 rama más alta; ''borde'' como se llama. Si desea una rama diferente, reemplace HEAD
con su nombre de sucursal, por ejemplo: master
, staging
, etc.
Para concluir con ejemplos, en /config/deploy/production.rb
, puede incluir 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 configuración predeterminada, por lo que no es necesario realmente declarar eso en el archivo. Se puede usar mejor en /config/deploy/edge.rb
.
En /config/deploy/staging.rb
, puede incluir 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 (^_^)