Estoy usando capistrano para implementar una aplicación RoR. La base de código está en un repositorio git, y la ramificación se usa ampliamente en el desarrollo. Capistrano usa el deploy.rb
archivo para su configuración, una de ellas es la rama desde la que se implementa.
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 . Editar I que, por lo que una puede ser desplegado a entorno de prueba. Termino de trabajar en la función y fusiono la rama A en la maestra . Dado que el deploy.rb
archivo de A es más fresca, que se fusionó en y ahora el deploy.rb
de maestro de referencias rama Una . Hora de editar de nuevo.
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 desplegar una rama de un repositorio git en un servidor provisional, pero no tenía la menor idea de cómo. 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ó. Entonces pensé que tendría que hacer un cambio similar en todas mis ramas. Por supuesto, soy un holgazán y me preguntaba si no habí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é pasaría si solo analizara la salida y buscara la rama marcada como actual:
set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
Ahora puedo implementar cualquier rama que esté actualizada en mi máquina local desde un solo script de implementación compartido.
fuente
Respuestas:
Esto funciona con Capistrano> = 3.1:
agregue esta línea a
config/deploy.rb
:y luego llame a capistrano con:
Esta solución funciona con Capistrano <3.1:
fuente
env
, pero esto funcionó para mí solo usando una ramaUsando Capistrano 3.1.0+, ninguno de estos funcionó para mí. En cambio, de acuerdo con sus instrucciones comentadas:
Pero no desea usarlo
ask
o se lo indicará. En su lugar deberías usarset
.HEAD
es la rama más alta; 'borde' como se llama. Si quieres una rama diferente, reemplaceHEAD
con su nombre de la sucursal, por ejemplo:master
,staging
, etc.Para concluir con ejemplos, en
/config/deploy/production.rb
, puede incluir esta línea:...o
por cierto,
HEAD
es la configuración predeterminada, por lo que no es necesario indicarlo realmente en el archivo. Podría usarse mejor en a/config/deploy/edge.rb
.En
/config/deploy/staging.rb
, puede incluir esta línea:...o
¡Tienes la idea!
Espero que estos ejemplos ayuden a los futuros usuarios de capistrano (^_^)
fuente
git rev-parse --abbrev-ref HEAD
se usa para averiguar en qué rama está HEAD. ejecutargit rev-parse --abbrev-ref staging
(casi) siempre saldrástaging
. Solo puedes usarset :branch, 'staging'
.Con etapas múltiples, en realidad es ahora:
La sintaxis de la publicación anterior no funciona en mi entorno
fuente
-s branch=foo
establece la rama variable capistranofoo
después de cargar las recetasPuedo confirmar que lo siguiente todavía funciona en Cap 3.11.0 13/10/18 y Cap 2:
En deploy.rb / stage.rb:
En la línea de comando:
Esto le brinda una rama predeterminada (que podría ser diferente para diferentes entornos) y la capacidad de cambiar las ramas cuando lo desee.
fuente
Alternativamente, puede estructurarlo desde la línea de comandos donde tiene una rama y un entorno predeterminados y también puede pasar parámetros a la llamada de límite que podrían incluir el entorno y la rama que se utilizarán. Esto podría ser una rama que se pasa explícitamente o podría tener un parámetro que indicaría la rama actual como se describe en el enlace que enumeró.
Ejemplo de código prestado mucho de aquí
fuente
-s
para obtener la rama especificadaSi está utilizando capistrano-multietapa , solo necesita ejecutar
o
sin ninguna otra edición a su
deploy.rb
.fuente
branch=
, nobranch-
.Este comando ya no funcionará:
Se
-sS
eliminó el soporte para banderas en capistrano v3 +.Aquí puedes leer más al respecto: enlace
Se mencionó en un par de respuestas, pero actualmente no es correcto.
Lo que funciona para mí:
en el
deploy.rb
archivo agregarentonces corre:
También tenga en cuenta que, para ejecutar con éxito este comando, debe estar en la rama maestra.
fuente
Esta solución debería funcionar con todas las versiones de Capistrano.
Uso:
fuente
Estoy usando la versión 3.3.5 y tengo esto funcionando:
fuente
Respuesta general:
Si tiene un archivo de configuración con un contenido modificado de un entorno a otro, debe hacer esa línea como una "plantilla" (con una cadena que representa el nombre de la variable como
@BRANCH_NAME@
o@ENV_NAME@
).Luego, tendría un script (versionado) capaz de leer su archivo de configuración y reemplazar la
@BRANCH_NAME@
variable " " por el valor apropiado que necesita su proceso de implementación.fuente
Para usuarios de capistrano 3:
fuente
Método 1: establecer una rama específica de la etapa (por ejemplo, prueba, producción) para la implementación
Poner
branch
configuración en los archivos de la etapa en lugar de 'deploy.rb' y establezca la rama de destino desde la que se implementará esa etapa.Para una aplicación de dos etapas con nombre de sucursal asociado
test
yproduction
, la configuración se verá así,Este método permite la implementación desde ramas específicas de la etapa. Por lo tanto, el único paso adicional que se requerirá es fusionar o modificar el código más reciente de la rama base.
Método 2: Implemente directamente desde cualquier rama (usando la etiqueta)
Otro enfoque es implementar usando la etiqueta. Para implementar usando la etiqueta, configure la
branch
configuración. en 'deploy.rb' de la siguiente manera,Y configure el CI para que se implemente condicionalmente en diferentes etapas si el patrón de etiqueta asociado coincide (por ejemplo,
/.*-test$/
).Ahora, se puede implementar desde cualquier sucursal,
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 origin v0.1.0-test
Nota: Los métodos anteriores se basan en Capistrano 3.
fuente
devolverá la rama actual en la que se encuentra exactamente.
Siempre configuro el en
gpsh
lugar degit push -u origin branch_name
fuente