Complemento Jenkins Git: ¿Cómo crear una etiqueta específica?

120

Tengo problemas para que Jenkins cree una etiqueta específica. La etiqueta es parte de una compilación parametrizada, pero no sé cómo pasar esto al complemento git para simplemente compilar esa etiqueta. Esto ha estado tomando 3 horas de mi día y he concedido la derrota a los maestros en el stack overflow.

sksamuel
fuente
¿Quiere decir que esto es diferente de stackoverflow.com/questions/7157170/… ? (tercer resultado de google.com/… )
VonC
1
"Esto ha estado tomando 3 horas de mi día" - No soy tan vago como para que 3 horas de mi día no incluyan todos los enlaces que pude encontrar en Google :)
sksamuel
1
¿Estás seguro de que quieres hacerlo de esta manera? ¿Te das cuenta de que el etiquetado en git no escala ? ¿Quizás podría usar una tarea de "ejecutar shell" para escribir un script para verificar la etiqueta / revisión que realmente desea?
mpontillo

Respuestas:

222

Pude hacer eso usando el parámetro "ramas para construir":

Branch Specifier (blank for default): tags/[tag-name]

Reemplace [tag-name] por el nombre de su etiqueta.

Emmanuel Keller
fuente
5
No sé por qué esto no tiene más +1. Esa entrada del blog de erics-notes es muy confusa. Esto es simple y funciona muy bien. ¡Gracias!
Cody S
3
Funcionó muy bien para mí. Gracias. Mi parámetro se llamó RELEASE_TAG, así que usé etiquetas / $ {RELEASE_TAG} como valor para el Especificador de rama.
Wesley Womack
3
No se pudo hacer que esto funcione. Por alguna razón, no puedo pagar la etiqueta. Recibo: 'ERROR: No se pudo encontrar ninguna revisión para compilar. Verifique la configuración del repositorio y la rama para este trabajo '. Especifico etiquetas / 3.0.1, también probé * / etiquetas / 3.0.1 Verifiqué que la etiqueta existe.
lostintranslation
1
Cuando intento hacer lo que se sugiere en esta respuesta, cada encuesta del repositorio desencadena una compilación. El registro de sondeo de git mostrará continuamente que la "Última revisión construida" es la revisión de la etiqueta, pero la "Última revisión del cabezal remoto es" es la revisión de la más reciente HEAD. La lógica del complemento git parece comparar estas dos revisiones, que en mi repositorio siempre son desiguales y, por lo tanto, siempre se activa una nueva compilación.
Louis
Seguramente esta debe ser la respuesta correcta, funcionó para mí y es muy simple. Sin embargo, no sondeo el repositorio, así que supongo que todavía existe ese problema.
Jeremy
76

Ninguna de estas respuestas fue suficiente para mí, usando Jenkins CI v.1.555, el complemento Git Client v.1.6.4 y el complemento Git 2.0.4.

Quería crear un trabajo para un repositorio de Git para una etiqueta específica, fija (es decir, no parametrizada). Tuve que improvisar una solución a partir de las diversas respuestas más la publicación del blog "construir una etiqueta Git" citada por Thilo .

  1. Asegúrese de enviar su etiqueta al repositorio remoto con git push --tags
  2. En la sección "Repositorio de Git" de su trabajo, bajo el encabezado "Administración de código fuente", haga clic en "Avanzado".
  3. En el campo de Refspec, agregue el siguiente texto: +refs/tags/*:refs/remotes/origin/tags/*
  4. En "Ramas para construir", "Especificador de rama", coloque */tags/<TAG_TO_BUILD>(reemplazando <TAG_TO_BUILD>con su nombre de etiqueta real).

Agregar Refspec para mí resultó ser crítico. Aunque parecía que los repositorios de git estaban obteniendo toda la información remota de forma predeterminada cuando lo dejé en blanco, el complemento de Git no podría encontrar mi etiqueta. Solo cuando especifiqué explícitamente "obtener las etiquetas remotas" en el campo Refspec, el complemento de Git pudo identificar y construir a partir de mi etiqueta.

Actualización 2014-5-7 : Desafortunadamente, esta solución viene con un efecto secundario indeseable para Jenkins CI (v.1.555) y el mecanismo de notificación push del repositorio Git al estilo Stash Webhook to Jenkins : cada vez que se actualiza cualquier rama del repositorio en un empujón, los trabajos de creación de etiquetas también se activarán nuevamente. Esto conduce a una gran cantidad de reconstrucciones innecesarias de los mismos trabajos de etiquetas una y otra vez. Intenté configurar los trabajos con y sin la opción "Forzar sondeo usando el espacio de trabajo", y pareció no tener ningún efecto. La única forma en que podría evitar que Jenkins hiciera las compilaciones innecesarias para los trabajos de etiquetas es borrar el campo Refspec (es decir, eliminar +refs/tags/*:refs/remotes/origin/tags/*).

Si alguien encuentra una solución más elegante, edite esta respuesta con una actualización. Sospecho, por ejemplo, que tal vez esto no sucedería si refspec específicamente fuera en +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>lugar del asterisco catch-all. Por ahora, sin embargo, esta solución está funcionando para nosotros, simplemente eliminamos la Refspec adicional después de que el trabajo tenga éxito.

gotgenes
fuente
4
Para "agregar el siguiente texto" a la refspec ... si su refspec era anteriormente +refs/heads/*:refs/remotes/origin/*, ahora lo será +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (No he trabajado mucho con refspecs, por lo que me tomó un poco de experimentación aprender que este campo está delimitado por espacios).
driftcatcher
1
Un +1 extra para esta solución. Las soluciones anteriores tampoco me funcionaron.
whitespy9
16

¿No puedes decirle a Jenkins que construya a partir de un nombre de referencia? Si es así entonces es

refs/tags/tag-name

De todas las preguntas que veo sobre Jenkins y Hudson, sugeriría cambiar a TeamCity. No he tenido que editar ningún archivo de configuración para que TeamCity funcione.

Andrew T Finnell
fuente
En realidad, no eres la primera persona en sugerir la ciudad del equipo. ¿Es realmente mucho mejor? Podría comprobarlo.
sksamuel
1
@monkjack Probé la misma sintaxis en uno de mis repositorios y funcionó. ¿Puede enumerar sus etiquetas actuales? ¿Está seguro de que ha empujado específicamente esa etiqueta al repositorio remoto congit push --tags
Andrew T Finnell
4
Acercarse. No estaba presionando las etiquetas hasta el control remoto, pero ahora lo estoy. Puedo hacer que jenkins construya ahora usando refs / tags / harpercollins-1.0.16, sin embargo, siempre insiste en construir la cabeza independientemente de lo que coloque allí. Confirmé que el control remoto tiene la etiqueta (puedo verla en gitweb) y hacer una instantánea de esa etiqueta confirma que todo está allí correctamente.
sksamuel
6
TeamCity es propietario, lo que lo hace prácticamente inútil.
argot
2
¡Oh, sí, cambiar de herramienta gratuita a comercial es la elección correcta! Cuando jetbrains reinvente la rueda y cree un nuevo rastreador de errores, ¿propondrá a otros que cambien de bugzilla a ese?
m1ld
11

Si está utilizando canalizaciones de Jenkins y desea verificar una etiqueta específica (por ejemplo: un TAGparámetro de su compilación), esto es lo que puede hacer:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}
Vincent de Lagabbe
fuente
9

En un Jenkins más reciente (1.639 y superior) puede:

  1. simplemente especifique el nombre de la etiqueta en un campo 'Ramas para construir'.
  2. en una compilación parametrizada, puede usar un parámetro como variable en un mismo campo 'Ramas para construir', es decir, $ {Branch_to_build}.
  3. puede instalar Git Parameter Plugin que le proporcionará funcionalidad al enumerar todas las ramas y etiquetas disponibles.
m1ld
fuente
1
De hecho, simplemente ingresar un nombre de etiqueta también funcionó para mí. Aunque la documentación para esto en el complemento git todavía dice específicamente que hacer eso no debería funcionar: "<tagName>: Esto no funciona ya que la etiqueta no será reconocida como etiqueta. Use refs / tags / <tagName> en su lugar."
Zitrax
Esto funcionó para mí en Jenkins 1.532.3, acabo de especificar la versión de la etiqueta (por ejemplo 1.0.1) en las ramas para construir el campo.
andre
9

Hice algo como esto y funcionó:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

ingrese la descripción de la imagen aquí

El registro de Jenkins confirmó que estaba obteniendo la fuente de la etiqueta

Comprobando la revisión 0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)

Hasan Shaik
fuente
Esto es genial para crear todas las etiquetas, ¡gracias! Agregar el refspecfue el truco haciendo clic en el botón Avanzado.
styfle
9

Configuré el campo Advanced-> Refspec en refs/tags/[your tag name]. Esto parece más simple que las otras sugerencias para Refspec, pero funcionó bien para mí.

ACTUALIZACIÓN 23/7/2014 - En realidad, después de más pruebas, resulta que esto no funcionó como se esperaba. Parece que la versión HEAD todavía se estaba revisando. Deshaga esto como la respuesta aceptada. Terminé obteniendo una solución funcional siguiendo la publicación de gotgenes en este hilo (30 de marzo). El problema mencionado en esa publicación de activación innecesaria de compilaciones no fue un problema para mí, ya que mi trabajo se activa desde un trabajo anterior, no desde el sondeo de SCM.

ACTUALIZAR ABR-2018 : tenga en cuenta en los comentarios que esto funciona para una persona y está de acuerdo con la documentación de Jenkins.

Nabu
fuente
Solo quería señalar que, cuatro años después de que se publicó esta respuesta, el uso refs/tags/<tagname>es lo que la documentación de Jenkins dice que se debe usar, y funciona bien para mí. Quizás el complemento tenía errores en el momento de la publicación original, pero ... a partir de abril de 2018, esta es la respuesta correcta.
evadeflow
Actualizando mi comentario anterior: En realidad, descubrí que puedo omitir el refs/tagsprefijo y simplemente usar <tagname>. YMMV, pero ... funciona bien para mis propósitos.
evadeflow
3

Pude hacer que Jenkins construyera una etiqueta estableciendo Refspec y Branch Specifier como se detalla en esta publicación de blog .

También tuve que establecer el Nombre del repositorio (en "origen" en mi caso) para poder hacer referencia a él en Refspec (de lo contrario, aparentemente usaría un nombre generado aleatoriamente).

Thilo
fuente
2

Lo que hice al final fue:

  • creó una nueva rama jenkins-targety consiguió que Jenkins rastreara eso
  • fusionar desde cualquier rama o etiqueta que quiera construir en el jenkins-target
  • una vez que la compilación estuvo funcionando, las pruebas pasaron, etc., simplemente cree una etiqueta desde la jenkins-targetrama

No estoy seguro de si esto funcionará para todos, mi proyecto era bastante pequeño, no había demasiadas etiquetas y esas cosas, pero es muy fácil de hacer, no tienes que perder el tiempo con las especificaciones de referencia y los parámetros y esas cosas :-)

Hugh Perkins
fuente
Me gusta este enfoque tan simple.
zochhuana
2

Puede crear incluso un tipo de etiqueta, por ejemplo 1.2.3-alpha43, utilizando comodines:

Refspec: +refs/tags/*:refs/remotes/origin/tags/*

Especificador de rama: origin/tags/1.2.3-alpha*

También puede marcar " Crear cuando se envía un cambio a GitHub " para activar el envío, pero debe agregar la acción "crear" al webhook

cascada
fuente
1

Agregando mis dos centavos aquí ya que no he visto una respuesta que use la opción "Construir con parámetros" en Jenkins.

Aquí estoy usando la consola del navegador Jenkins CI para el proyecto starwars_api y pude construir directamente con "Construir con parámetros" con el valor refs / tags / tag-name

  1. elija la opción "construir con parámetros".
  2. agregue valor en el cuadro como "refs / tags / tag_142" (tag_name = tag_142 para mi ejemplo)

construir con nombre de etiqueta de referencia

anayagam
fuente