Cómo configurar el gancho de confirmación posterior de Git
¿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 .git
el 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 .java
archivos están ahí y la compilación debería comenzar.
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 casossh://
, 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 (
1qaz2wsx
en 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
HEAD
candidato de su rama para compilación y la confirmación a la que hace referenciagit 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
' aHEAD
.
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_TOKEN
si configuras la configuración de activación en tu artículo
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
Espero que esto ayude: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html
Es solo cuestión de usarlo curl
para 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 someJob
está el nombre del trabajo de Jenkins.
Busque la hooks
carpeta en su carpeta .git oculta. Cambie el nombre del post-commit.sample
archivo a post-commit
. Ábralo con el Bloc de notas, elimine la : Nothing
lí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.
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.
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.