¿Cómo puedo hacer que Jenkins CI con Git se dispare al presionar para dominar?


205

Estoy tratando de configurar Jenkins-ci para un proyecto usando GitHub. Ya configuré Jenkins con los complementos apropiados. Quiero que Jenkins ejecute scripts de compilación solo cuando alguien en el proyecto se esfuerce por dominar. Hasta ahora he podido configurarlo para que se active una compilación cada vez que alguien empuje a cualquier lugar, pero eso es demasiado amplio. He hecho esto con ganchos de servicio post-recepción en Git.

He leído el wiki de Jenkins, y un par de tutoriales, pero falta este detalle en particular ... ¿tiene algo que ver con las encuestas? ¿O debería trabajarse en el lado de Git, de modo que Git solo active a Jenkins cuando masterse cambie?


3
El autor original de Jenkins, Kohsuke Kawaguchi, describe cómo hacer notificaciones automáticas desde el repositorio utilizando el complemento Git complemento Git 1.1.14. Ver kohsuke.org/2011/12/01/…
GeraldScott

Respuestas:


190

Como ya señaló gezzed en su comentario, mientras tanto hay una buena solución (descrita en Polling must die: desencadenar compilaciones de Jenkins desde un gancho Git ):

  • Establezca el desencadenador de compilación del trabajo de Jenkins en Poll SCM , pero no especifique una programación.

  • Cree un activador posterior a la recepción de GitHub para notificar la URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Esto activará todas las compilaciones que sondeen el repositorio Git especificado.

  • Sin embargo, el sondeo en realidad verifica si se ha enviado algo a la rama utilizada.

Funciona perfectamente


1
Esto también funcionó muy bien para mí, puede usar el mismo enfoque con una instalación local gitoriosa
Justin Smith

44
Funciona también con el gancho POST de Bitbucket (no Jenkins). Para especificar las credenciales de autenticación, puede usar el usuario: contraseña@my.ci.server/git/notifyCommit? Url = ... como la URL.
loevborg

¿Se puede configurar para que jenkins construya solo las bibliotecas / proyectos afectados por el último impulso al repositorio? ¿No está construyendo toda la sucursal nuevamente?
Croolman

¿Puedes aclarar esta parte? "Crear un activador posterior a la recepción de github para notificar la URL"
dewwwald

Supongo que github debe poder llegar a su instancia de Jenkins, lo que significa que debe ser de acceso público. ¿Es posible hacer que esto funcione con un servidor Jenkins que no sea público?
A. Murray

33

A partir de la versión 0.5, el complemento GitHub para Jenkins puede desencadenar una compilación cuando se empuja un cambio a GitHub .


23
@asveikau: la pregunta original era sobre github.
docwhat

Esa no es una buena solución porque desencadena la compilación independientemente de qué rama se haya empujado.
Shannon

En realidad, parece que obedece el especificador de rama en la configuración del complemento git si habilita "Poll SCM" (no es necesario programarlo).
Shannon

1
Si bien eso puede ser cierto, aún activa la compilación de forma incorrecta cuando no existe un espacio de trabajo ("El espacio de trabajo está fuera de línea. Programando una nueva compilación para obtener un espacio de trabajo. (Nonexisting_workspace) Listo. Tomó 0 ms Se encontraron cambios"). Ver también issues.jenkins-ci.org/browse/JENKINS-18079
Shannon

El complemento GitHub enumera el complemento Git como una dependencia . El wiki dice "al crear un trabajo, especifique URL en" Proyecto Github "y seleccione Git especifique URL en" Administración del código fuente ". Dice" Este activador solo activa el algoritmo de sondeo interno del complemento Git para cada evento entrante contra un repositorio coincidente ". creo que eso significa que a la encuesta SCM le gusta bastante en la respuesta aceptada, pero tiene opciones para configurar el webhook automáticamente y un par de características más.
dosentmatter

9

En lugar de desencadenar compilaciones forma remota, cambie la configuración de su proyecto Jenkins para desencadenar compilaciones mediante sondeo.

Jenkins puede sondear en función de un interno fijo, o por una URL. Esto último es lo que desea omitir compilaciones si no hay cambios para esa rama. Los detalles exactos están en la documentación. . Esencialmente, solo necesita marcar la opción "Encuesta SCM", dejar la sección de programación en blanco y establecer una URL remota para presionar JENKINS_URL / job / name / polling.

Un problema si tiene un entorno Jenkins seguro es diferente /build, la /pollingURL requiere autenticación. Las instrucciones aquí tienen detalles. Por ejemplo, tengo un enlace GitHub Post-Receive a username:apiToken@JENKIS_URL/job/name/polling.


8

Para GitLab , use estos pasos:

  1. Vaya a la configuración de su proyecto → Web hooks
  2. Ingrese la URL "Build Now" de su proyecto Jenkins como una URL de evento push:

    http://server.com/jenkins/job/project_name/build?delay=0sec por ejemplo

  3. Haga clic Add Web Hooky luegotest hook

Luego, cada vez que se compromete con el repositorio, se activa el enlace web y se crea una compilación. Asegúrese de configurar su espacio de trabajo Jenkins para delete workspace before each buildobtener una copia nueva del nuevo código.


2
¿Cómo está resolviendo el problema sobre la cuestión de construir justo cuando se empuja la rama maestra?
Custodio

4

No está relacionado con Git, pero a continuación ayudaré con la configuración del trabajo de Jenkins en detalle con Mercurial. Puede ayudar a otros con un problema similar.

  1. Instale el complemento del disparador de URL
  2. Vaya a la página de configuración del trabajo y seleccione la Poll SCMopción. Establezca el valor en* * * * *
  3. Marque la opción: [URLTrigger] - Poll with a URL. Ahora puede seleccionar algunas opciones como cambio de fecha de modificación, contenido de URL, etc.
  4. En las opciones, seleccione Cambio de contenido de URL, seleccione la primera opción: Monitor change of content
  5. Guarda los cambios.

Ahora, active algunos cambios en el repositorio de Mercurial mediante algunos registros de prueba.

Vea que el trabajo de Jenkins ahora se ejecuta detectando los cambios de SCM. Cuando se ejecuta la compilación debido a cambios de Mercurial, verá texto Started by an SCM change. De lo contrario, el usuario que lo inició manualmente.


3

Espero que esto ayude: cómo activar una compilación Jenkins en Git commit

Es solo una cuestión de usar curl para activar un trabajo de Jenkins usando los ganchos Git proporcionados por Git.

El comando curl http://localhost:8080/job/someJob/build?delay=0secpuede ejecutar un trabajo de Jenkins, donde someJobestá el nombre del trabajo de Jenkins.

Busque la carpeta "ganchos" en su carpeta oculta .git. Cambie el nombre del archivo "post-commit.sample" a "post-commit". Ábralo con el Bloc de notas, elimine la línea ": Nada" y pegue el comando anterior en él.

Eso es. Siempre que realice una confirmación, Git activará los comandos posteriores a la confirmación definidos en el archivo.


Al principio me confundí con tu comentario porque pensé que tenía que cambiar el "trabajo" en la url anterior por un nombre de trabajo. También estaba confundido porque cuando presioné "New Item" en Jenkins, configuré un "Proyecto", no un trabajo, así que cuando mencionaste "someJob" arriba, no sabía que ese era el nombre de mi proyecto. Finalmente descubrí la url que necesitaba: localhost: 8078 / job / codecept% 20tests / build donde "codecept% 20tests" era el nombre de mi proyecto. Gracias por su solución
Paul Preibisch

1
Gracias paul He actualizado la publicación del blog con una nota adicional, mencionando su solución. El "% 20" será especialmente útil para otros.
Nav

3

Integración continua con Jenkins, después de que el código se envíe al repositorio desde el comando / GUI de Git:

  1. Cree un trabajo en Jenkins con solo el nombre del trabajo y seleccione el tipo de estilo libre del proyecto. Haga clic OK. La siguiente página no agrega nada, solo haga clic Save.
  2. Vaya al repositorio local de Git donde tiene el código fuente y navegue a la .git/hookscarpeta.
  3. La hookscarpeta contiene los pocos archivos. Verifique el "post-commit". Si no está presente, cree un archivo, "post-commit" sin una extensión de archivo:

    C:\work\test\\.git\hooks\post-commit
    
  4. Edite el archivo "post-commit" con el siguiente comando. Asegúrese de que esté presente en su carpeta de enlaces de código fuente local.

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    Ejemplo:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5)

    userName: Nombre de usuario Jenkins

    jobName: Nombre del trabajo de la compilación

    apiToken: Para obtener su token API, vaya a su página de usuario Jenkins (arriba a la derecha en la interfaz). Está disponible en el menú "Configurar" a la izquierda de la página: "Mostrar token API"

  5. Realice cambios en su código fuente y confirme el código en el repositorio.

  6. Tu trabajo http://localhost:8080/jenkins/job/Gitcommittest/debería estar construyendo.


3

Necesita especificar la rama. Por defecto escucha cualquier cosa. Vea la publicación del blog Hudson: complementos de Git y Maven .


Recientemente configuré Jenkins en el trabajo para extraer cambios de git en una rama específica. Funciona bien. +1
Greg K

También he establecido esa configuración. Lo que estoy notando es que Jenkins recibe una notificación de cada empuje a github y reacciona, pero solo ejecuta los pasos de compilación si la rama maestra ha cambiado. Así que recibimos un montón de informes de compilación espurios que dicen "Sin cambios". ¿Estás observando este comportamiento también?
Ziggy

La pregunta original es sobre cómo resolver el desencadenante amplio e innecesario (que se activa cuando alguien presiona cualquier rama) configurado en su respuesta. Si tiene 5 trabajos jenkin con la misma configuración, excepto que el primer trabajo escucha la rama maestra, el segundo la rama de desarrollo, el tercero la rama FeatureX y así sucesivamente, cuando solo empuja a la rama FeatureX, todos los trabajos jenkins se activarán a sobrecarga de trabajo con construcciones muy lentas.
geoom

2

Complemento de desencadenante webhook genérico se puede configurar con filtros para lograr esto.

Cuando se configura con

  • Una variable llamada refy expresión$.ref .
  • Un filtro con texto $refy expresión de filtro como ^refs/heads/master$.

Entonces ese trabajo se activará por cada impulso a master . No hay encuestas.

Probablemente desee más valores del webhook para realizar la compilación. Simplemente agregue más variables, con JSONPath, para elegir lo que necesita.

Aquí hay algunos casos de uso: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


¿Qué es "achi" ?
Peter Mortensen

Es / fue un error ortográfico.
Tomas Bjerre

¿Cómo agarras el $ GITCOMMIT en Jenkins? Siempre parece ser nulo con un webhook. No se puede enviar el estado de nuevo para decir éxito o error.
user3520245

1

En mi organización actual, no hacemos esto en master pero lo hacemos tanto en desarrollo como en lanzamiento / ramas (estamos usando Git Flow), para generar compilaciones de instantáneas.

Como estamos usando una tubería de múltiples ramificaciones, hacemos esto en el archivo Jenkins con la sintaxis when {} ...

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

Esto se detalla en esta publicación de blog: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

Las respuestas anteriores son correctas, pero me dirijo a ellos que son novatos aquí por su simplicidad

especialmente para configurar el disparador de compilación para la canalización:

Considere que tiene dos ramas de Github: 1.master, 2.dev y Jenkinsfile (donde se escribe el script de canalización) y hay otros archivos disponibles en cada rama

Configurar nuevo proyecto de canalización (para rama de desarrollo)

## 1.Integración de código con git-plugin y enfoque basado en cron Prerrequisito Se debe instalar el complemento git y configurarlo con su nombre y correo electrónico

  1. Sección general. Marque la casilla de verificación - 'Este proyecto está parametrizado' y agregue Nombre-SBRANCH Valor predeterminado-'refs / remotes / origin / dev '
  2. Construya la sección de activadores "Casilla de verificación - 'Encuesta SCM' y programe según la necesidad de verificar confirmaciones, por ejemplo, '* / 1 * * * *' para verificar cada minuto
  3. Sección de definición de canalización Seleccione - Script de canalización desde SCM—> seleccione git—> add URL del repositorio—> agregue credenciales git—> elija avanzado—> agregue Name- origin, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev es la rama github) -> Ramas para construir - $ {SBRANCH} (Nombre del parámetro desde el primer punto de referencia) -> Ruta del script—> Jenkinsfile -> Desmarque Lightweightcheckout
  4. Aplicar—> guardar

## 2.Integración de código: github-plugin y enfoque webhook Requisito previo Se debe instalar el complemento Github y se debe configurar el servidor Github, se debe probar la conexión si no considera la siguiente configuración

Configurar el complemento Github con cuenta en Jenkins

Sección GitHub Agregue el servidor Github si no está presente URL de la API: https://api.github.com Credenciales: Agregue texto secreto (Haga clic en el botón Agregar: seleccione el tipo de texto secreto) con valor Token de acceso personal (Genere desde sus cuentas Github—> configuración -> configuración del desarrollador—> token de acceso personal—> agregar token—> verificar alcances—> copiar el token) Probar conexión—> Verificar si está conectado a su cuenta de Github o no Marcar la casilla de verificación con la subsección Administrar ganchos por adelantado simplemente seleccione credencial anterior para 'secreto compartido'

Agregue webhook si no lo agregó a su repositorio por

  1. Vaya a la configuración del repositorio de Github -> agregar webhook—> agregar URL
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. O si no tiene Public_IP use ngrok . Instale, autentique, obtenga IP pública del comando ./ngrok http 80 (use su jenkins_port) y luego agregue webhook -> agregue URL http: // Ngrok_IP / github-webhook /
  3. Pruébelo entregando carga útil desde la página webhook y verifique si obtiene el estado 200 o no.

Si tiene el complemento de solicitudes Github Pull, configúrelo también con la URL publicada de Jenkins.

  1. Sección general. Marque la casilla de verificación - 'Proyecto Github' agregue URL del proyecto - (enlace github que termina con '.git /')
  2. Sección general. Marque la casilla de verificación - 'Este proyecto está parametrizado' y agregue Nombre-SBRANCH Valor predeterminado-'refs / remotes / origin / dev '
  3. Casilla de verificación Build triggers.section.Check - 'GitHub hook trigger for GITScm polling'
  4. Sección de definición de canalización: Seleccione - Script de canalización desde SCM—> seleccione git—> add URL de repositorio—> agregue credenciales de git—> elija avanzado -> agregue Name- origin, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev es github branch) -> Sucursales para construir - $ {SBRANCH} (Nombre del parámetro desde el punto 1. ° de referencia) -> Ruta del script—> Jenkinsfile—> Desmarque Lightweightcheckout
  5. Aplicar—> guardar


0

Mi solución para un servidor git local: vaya al directorio de enlace del servidor git local, ignore el archivo update.sample existente y cree un nuevo archivo literalmente llamado "actualización", como:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

La declaración de eco se mostrará debajo del resultado de git push, el token se puede tomar de la configuración de trabajo de jenkins, navegue para encontrarlo. Si no se llama al archivo "actualizar", intente con otros archivos con el mismo nombre sin la extensión "muestra".

Eso es todo lo que necesitas

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.