tipos tag qué existen etiquetas crear git capistrano

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 ...

Ejemplo de código muy prestado de aquí


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 (^_^)