git - tipos - Cómo desencadenar una creación solo si ocurren cambios en un conjunto particular de archivos
¿para qué nos sirve el sha-1 cuando creamos tags? (6)
Básicamente, necesitas dos trabajos. Una para verificar si los archivos han cambiado y uno para hacer la compilación real:
Trabajo n. ° 1
Esto debería activarse en los cambios en su repositorio de Git. Luego prueba si la ruta especificada ("src" aquí) tiene cambios y luego usa la CLI de Jenkins para activar un segundo trabajo.
export JENKINS_CLI="java -jar /var/run/jenkins/war/WEB-INF/jenkins-cli.jar"
export JENKINS_URL=http://localhost:8080/
export GIT_REVISION=`git rev-parse HEAD`
export STATUSFILE=$WORKSPACE/status_$BUILD_ID.txt
# Figure out, whether "src" has changed in the last commit
git diff-tree --name-only HEAD | grep src
# Exit with success if it didn''t
$? || exit 0
# Trigger second job
$JENKINS_CLI build job2 -p GIT_REVISION=$GIT_REVISION -s
Trabajo n. ° 2
Configure este trabajo para tomar un parámetro GIT_REVISION como tal, para asegurarse de que está compilando exactamente la revisión que el primer trabajo eligió construir.
¿Cómo le digo a Jenkins / Hudson que active una compilación solo para cambios en un proyecto en particular en mi árbol Git?
El complemento Git tiene una opción (región excluida) para usar expresiones regulares para determinar si se debe omitir la construcción en función de si los archivos en el compromiso coinciden con la expresión regular de región excluida.
Lamentablemente, el plugin Git de stock no tiene una función de "región incluida" en este momento (1.15). Sin embargo, alguien publicó parches en GitHub que funcionan en Jenkins y Hudson que implementan la función que desea.
Es un poco trabajo de construir, pero funciona según lo anunciado y ha sido extremadamente útil ya que uno de mis árboles Git tiene múltiples proyectos independientes.
https://github.com/jenkinsci/git-plugin/pull/49
Actualización: El complemento Git (1.16) ahora tiene la función de región ''incluida''.
Puede usar el complemento genérico Trigger Webhook para esto.
Con una variable como changed_files
y expresión $.commits[*].[''modified'',''added'',''removed''][*]
.
Puede tener un texto de filtro como $changed_files
y filter regexp como "folder/subfolder/[^"]+?"
Si la folder/subfolder
es la carpeta que debe desencadenar las compilaciones.
Respondí esta pregunta en otra publicación:
Cómo obtener una lista de archivos modificados desde la última compilación en Jenkins / Hudson
#!/bin/bash
set -e
job_name="whatever"
JOB_URL="http://myserver:8080/job/${job_name}/"
FILTER_PATH="path/to/folder/to/monitor"
python_func="import json, sys
obj = json.loads(sys.stdin.read())
ch_list = obj[''changeSet''][''items'']
_list = [ j[''affectedPaths''] for j in ch_list ]
for outer in _list:
for inner in outer:
print inner
"
_affected_files=`curl --silent ${JOB_URL}${BUILD_NUMBER}''/api/json'' | python -c "$python_func"`
if [ -z "`echo /"$_affected_files/" | grep /"${FILTER_PATH}/"`" ]; then
echo "[INFO] no changes detected in ${FILTER_PATH}"
exit 0
else
echo "[INFO] changed files detected: "
for a_file in `echo "$_affected_files" | grep "${FILTER_PATH}"`; do
echo " $a_file"
done;
fi;
Puede agregar el cheque directamente a la parte superior del shell de ejecución del trabajo, y saldrá de exit 0
si no se detectan cambios ... Por lo tanto, siempre puede sondear el nivel superior para que los check-in generen una compilación.
Si bien esto no afecta a trabajos individuales, puede utilizar esta secuencia de comandos para ignorar ciertos pasos si la última confirmación no contiene ningún cambio:
/*
* Check a folder if changed in the latest commit.
* Returns true if changed, or false if no changes.
*/
def checkFolderForDiffs(path) {
try {
// git diff will return 1 for changes (failure) which is caught in catch, or
// 0 meaning no changes
sh "git diff --quiet --exit-code HEAD~1..HEAD ${path}"
return false
} catch (err) {
return true
}
}
if ( checkFolderForDiffs(''api/'') ) {
//API folder changed, run steps here
}
Si la lógica para elegir los archivos no es trivial, desencadenaría la ejecución del script en cada cambio y luego escribiría un script para verificar si realmente se requiere una compilación, y luego desencadenaría una compilación si fuera así.