Cómo configurar el gancho de confirmación posterior de Git

Resuelto phanikumar Raja asked hace 54 años • 4 respuestas

¿Cómo activar una compilación de forma remota desde Jenkins?
¿Cómo configurar el gancho de confirmación posterior de Git?

Mi requisito es que cada vez que se realicen cambios en el repositorio de Git para un proyecto en particular, se iniciará automáticamente la compilación de Jenkins para ese proyecto.

En la sección de compilación del disparador de Jenkins, seleccioné la compilación del disparador de forma remota.
En .gitel directorio, el directorio de ganchos está ahí donde tenemos que configurar el archivo posterior a la confirmación.
Estoy confundiendo cómo activar una compilación desde allí (sé que en alguna parte deberíamos usar el comando curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

He colocado este comando en el directorio de enlaces de mi servidor git (enlace posterior a la confirmación).
Cada vez que ocurren cambios en el repositorio, se ejecuta la compilación automática.

Quiero verificar en el conjunto de cambios si en al menos un archivo Java hay una compilación que debería comenzar.
Supongamos que los desarrolladores cambiaron solo archivos xml o archivos de propiedades y la compilación no debería iniciarse.
Junto con xml, supongamos que los .javaarchivos están ahí y la compilación debería comenzar.

phanikumar Raja avatar Jan 01 '70 08:01 phanikumar Raja
Aceptado

Como se menciona en " El sondeo debe morir: activar compilaciones de Jenkins desde un gancho de git ", puedes notificar a Jenkins sobre una nueva confirmación:

Con el último complemento de Git 1.1.14 (que acabo de lanzar ahora), ahora puedes hacer esto más fácilmente simplemente ejecutando el siguiente comando:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Esto escaneará todos los trabajos que están configurados para verificar la URL especificada, y si también están configurados con sondeo, activará inmediatamente el sondeo (y si eso encuentra que un cambio que vale la pena construir, se activará una compilación a su vez. )

Esto permite que un script permanezca igual cuando los trabajos van y vienen en Jenkins.
O si tiene varios repositorios en una única aplicación host de repositorio (como Gitosis), puede compartir un único script de enlace posterior a la recepción con todos los repositorios. Finalmente, esta URL no requiere autenticación ni siquiera para Jenkins seguro, porque el servidor no usa directamente nada de lo que envía el cliente. Ejecuta un sondeo para verificar que hay un cambio, antes de comenzar una compilación.

Como se menciona aquí , asegúrese de utilizar la dirección correcta para su servidor Jenkins:

Dado que estamos ejecutando Jenkins como servidor web independiente en el puerto 8080, la URL debería haber estado sin el /jenkins, así:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Para reforzar ese último punto, ptha agrega en los comentarios :

Puede que sea obvio, pero tuve problemas con:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

El parámetro de URL debe coincidir exactamente con lo que tiene en la URL del repositorio de su trabajo de Jenkins.
Al copiar ejemplos omití el protocolo, en nuestro caso ssh://, y no funcionó.


También puede utilizar un gancho posterior a la recepción simple como en " Compilaciones basadas en push usando Jenkins y GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Configure su trabajo de Jenkins para poder "activar compilaciones de forma remota" y utilizar un token de autenticación ( 1qaz2wsxen este ejemplo).

Sin embargo, este es un guión específico del proyecto y el autor menciona una forma de generalizarlo.
La primera solución es más sencilla ya que no depende de la autenticación ni de un proyecto específico.


Quiero comprobar en el conjunto de cambios si hay al menos un archivo Java y debería comenzar la compilación.
Supongamos que los desarrolladores cambiaron solo archivos XML o archivos de propiedades, entonces la compilación no debería comenzar.

Básicamente, su script de compilación puede:

  • poner notas de 'construcción' (ver git notes) en la primera llamada
  • en las llamadas posteriores, tome la lista de confirmaciones entre el HEADcandidato de su rama para compilación y la confirmación a la que hace referencia git notes'compilación' ( git show refs/notes/build) git diff --name-only SHA_build HEAD:.
  • su secuencia de comandos puede analizar esa lista y decidir si es necesario continuar con la compilación.
  • en cualquier caso, cree/mueva su git notes' build' a HEAD.

Mayo de 2016: cwhsu señala en los comentarios la siguiente URL posible:

podrías usarlo curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENsi configuras la configuración de activación en tu artículo

http://i.imgur.com/IolrOOj.png


Junio ​​de 2016, polaretto señala en los comentarios :

Quería agregar que con solo un poco de script de shell puedes evitar la configuración manual de URL, especialmente si tienes muchos repositorios en un directorio común.
Por ejemplo, utilicé estas expansiones de parámetros para obtener el nombre del repositorio.

repository=${PWD%/hooks}; 
repository=${repository##*/} 

y luego usarlo como:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VonC avatar Oct 09 '2012 07:10 VonC

Espero que esto ayude: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Es solo cuestión de usarlo curlpara activar un trabajo de Jenkins usando los ganchos de git proporcionados por git.
El comando

curl http://localhost:8080/job/someJob/build?delay=0sec

Puede ejecutar un trabajo de Jenkins, donde someJobestá el nombre del trabajo de Jenkins.

Busque la hookscarpeta en su carpeta .git oculta. Cambie el nombre del post-commit.samplearchivo a post-commit. Ábralo con el Bloc de notas, elimine la : Nothinglínea y pegue el comando anterior en ella.

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

Nav avatar Feb 07 '2014 19:02 Nav

Como la respuesta anterior mostró un ejemplo de cómo podría verse el enlace completo, aquí está el código de mi enlace posterior a la recepción en funcionamiento:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

En este caso, activo trabajos de jenkins solo cuando presiono para master y no para otras ramas.

Zitrax avatar Apr 24 '2013 12:04 Zitrax

Quiero agregar a las respuestas anteriores que se vuelve un poco más difícil si la autorización de Jenkins está habilitada.

Después de habilitarlo, recibí un mensaje de error que indicaba que un usuario anónimo necesita permiso de lectura.

Vi dos posibles soluciones:

1: Cambiando mi gancho a:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: configuración de autorización basada en proyecto.

Las soluciones anteriores tienen la desventaja de que tuve que exponer mi contraseña en el archivo de enlace. Inaceptable en mi caso.

El segundo me funciona. En la configuración de autenticación global tuve que habilitar General>Leer para usuarios anónimos. En el proyecto que quería activar, tenía que habilitar Trabajo>Crear y trabajar>Leer para anónimo.

Esta todavía no es una solución perfecta porque ahora puedes ver el proyecto en Jenkins sin iniciar sesión. Podría haber una solución aún mejor utilizando el enfoque anterior con inicio de sesión http, pero no lo he descubierto.

anhoppe avatar Dec 16 '2015 15:12 anhoppe