Cómo configurar Git post commit hook

126

¿Cómo activar una compilación remotamente desde Jenkins?
¿Cómo configurar Git post commit hook?

Mi requisito es que siempre 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 activador de Jenkins, seleccioné la compilación del activador de forma remota.
En el .gitdirectorio, el directorio de ganchos está ahí en el que tenemos que configurar el archivo post commit.
Estoy confundiendo cómo desencadenar una compilación desde allí (conozco alguna parte que 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 mi directorio de enlaces de servidor git (post commit hook).
Cada vez que los cambios suceden en el repositorio, se ejecuta la compilación automatizada.

Quiero comprobar en el conjunto de cambios si en al menos un archivo Java está allí, la compilación debería comenzar.
Supongamos que los desarrolladores cambian solo archivos xml o archivos de propiedades que la compilación no debería comenzar.
Junto con xml, supongamos que los .javaarchivos están allí, la construcción debería comenzar.

phanikumar Raja
fuente
He editado mi respuesta para abordar la segunda parte de su pregunta.
VonC

Respuestas:

164

Como se menciona en "Las encuestas deben morir: desencadenar compilaciones de Jenkins desde un gancho de git ", puede notificar a Jenkins sobre una nueva confirmación:

Con el último complemento de Git 1.1.14 (que acabo de lanzar ahora), ahora puede hacerlo más fácilmente con solo ejecutar el siguiente comando:

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

Esto escaneará todos los trabajos configurados para verificar la URL especificada, y si también están configurados con sondeo, activará inmediatamente el sondeo (y si eso encuentra 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 múltiples repositorios en una sola aplicación de host de repositorio (como Gitosis), puede compartir un solo script de enlace posterior a la recepción con todos los repositorios. Finalmente, esta URL no requiere autenticación incluso para Jenkins seguro, porque el servidor no usa directamente nada que el cliente esté enviando. Ejecuta un sondeo para verificar que haya un cambio, antes de que realmente comience una compilación.

Como se mencionó aquí , asegúrese de usar 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 la /jenkinssiguiente:

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

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

Puede ser obvio, pero tuve problemas con:

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

El parámetro 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 usar un gancho simple posterior a la recepción, como en " Compilaciones basadas en inserción 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 usar un token de autenticación ( 1qaz2wsxen este ejemplo).

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


Quiero verificar en el conjunto de cambios si al menos un archivo java está allí, la compilación debería comenzar.
Supongamos que los desarrolladores cambian 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 "compilación" (ver git notes) en la primera llamada
  • en las llamadas posteriores, agarra la lista de confirmaciones entre HEADde su candidato para la rama de construcción y la confirmación hace referencia el git notes'construir' ( git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • su script puede analizar esa lista y decidir si necesita continuar con la compilación.
  • en cualquier caso, crea / mueve tu git notes' build' a HEAD.

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

simplemente podría usar curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENsi configura la configuración del disparador en su elemento

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 puede evitar la configuración manual de URL, especialmente si tiene muchos repositorios en un directorio común.
Por ejemplo, usé estas expansiones de parámetros para obtener el nombre del repositorio

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

y luego úsalo como:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VonC
fuente
hola von como dijiste en la primera llamada, tengo que poner una nota de compilación. mi primera llamada es leer el archivo .java cada vez que el desarrollador empuje los cambios a git repo. Soy nuevo en todas estas cosas, por eso estoy preguntando cada paso. por favor no te preocupes y tengo que completar esta tarea.
phanikumar Raja
Esto es muy útil para mí. He escrito Git hook con ayuda de este tema. Tnx chicos!
Kirill Bazarov
Tuve que agregar la llamada curl al archivo posterior a la recepción, que no está totalmente claro en esta respuesta. Muy útil de todos modos!
Magnilex
1
@IgorGanapolsky en la carpeta de ganchos de su repositorio desnudo que está recibiendo confirmaciones y que tiene que llamar a jenkins:yourRepo.git/hooks/post-receive
VonC
2
Puede ser obvio, pero tuve problemas con: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. El parámetro 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ó.
ptha
17

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

Es solo una cuestión de usar curlpara activar un trabajo de Jenkins usando los ganchos 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 oculta .git. 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 él.

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

Nav
fuente
Después de realizar la confirmación desde la máquina de desarrollo, se llama a post-recepción, no a post-commit. Verificado poniendo declaraciones de registro en ambos ganchos. ¿Estoy leyendo mal los documentos, no debería ser post-commit lo que se llama?
Shirish Hirekodi
@ Shirish: Eso es extraño. Tal vez estás haciendo algo diferente
Nav
esta es una compilación exitosa cuando presiono el último cambio de confirmación pero no compila cuando confirmo los cambios ...
3

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

#!/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, disparo trabajos de jenkins solo cuando presiono para dominar y no para otras ramas.

Zitrax
fuente
1
¿Cómo se vincula este script de Python con Jenkins? ¿O simplemente lo ejecutas una vez?
IgorGanapolsky
Jenkins no sabe acerca de este enlace, la parte principal es cargar la url notifyCommit en el servidor jenkins que desencadenará una encuesta. Creo que el sondeo está habilitado pero sin un horario en el lado de jenkins.
Zitrax
Entonces, ¿dónde reside este script de Python? Supongo que lo
vincula
1
Respuesta tardía, pero la ubicación del script estaría en el servidor git en ganchos / post-recepción. Lea sobre ganchos git para obtener más información.
Zitrax
3

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 de que el usuario anónimo necesita permiso de lectura.

Vi dos posibles soluciones:

1: Cambiar 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 funciona para mí. En la configuración de autenticación global, tuve que habilitar General> Leer para usuarios anónimos. En el proyecto que quería activar tuve que habilitar Job> Build and Job> Read for Anonymous.

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

anhoppe
fuente