¿Cómo le digo a Jenkins / Hudson que active una compilación solo para cambios en un proyecto en particular en mi árbol de Git?
¿Cómo le digo a Jenkins / Hudson que active una compilación solo para cambios en un proyecto en particular en mi árbol de Git?
Respuestas:
El complemento de 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 la confirmación coinciden con la expresión regular de la región excluida.
Desafortunadamente, el complemento Git estándar no tiene una característica 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 como se anuncia 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'.
Ignored commit c6e2b1dca0d1885: No paths matched included region whitelist
. ¿Cualquier pista? Más detalles aquí: stackoverflow.com/questions/47439042/…
Básicamente, necesitas dos trabajos. Uno para verificar si los archivos cambiaron y otro para hacer la compilación real:
Trabajo # 1
Esto debería activarse ante cambios en su repositorio de Git. Luego prueba si la ruta que especifica ("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 # 2
Configure este trabajo para que tome un parámetro GIT_REVISION como este, para asegurarse de que está creando exactamente la revisión que eligió construir el primer trabajo.
$? || exit 0
... test $? -eq 0 || exit 0
¿quizás?
Si está utilizando una sintaxis declarativa de Jenkinsfile para describir su canalización de construcción, puede usar la condición de conjunto de cambios para limitar la ejecución de la etapa solo al caso en que se modifican archivos específicos. Esta es ahora una característica estándar de Jenkins y no requiere ninguna configuración / software adicional.
stages {
stage('Nginx') {
when { changeset "nginx/*"}
steps {
sh "make build-nginx"
sh "make start-nginx"
}
}
}
Puede combinar varias condiciones utilizando anyOf
o allOf
palabras clave para el comportamiento OR o AND según corresponda:
when {
anyOf {
changeset "nginx/**"
changeset "fluent-bit/**"
}
}
steps {
sh "make build-nginx"
sh "make start-nginx"
}
Si bien esto no afecta a trabajos individuales, puede usar este script 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
}
api/
carpeta). Si puede solucionar esto, me encantaría un cambio sugerido !
Puede utilizar Generic Webhook Trigger Plugin para esto.
Con una variable like changed_files
y expresión $.commits[*].['modified','added','removed'][*]
.
Puede tener un texto de filtro como $changed_files
y regexp de filtro como "folder/subfolder/[^"]+?"
si fuera folder/subfolder
la carpeta que debería activar 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 en la parte superior del shell ejecutivo del trabajo, y lo hará exit 0
si no se detectan cambios ... Por lo tanto, siempre puede sondear el nivel superior para que los registros activen una compilación.
Escribí este script para omitir o ejecutar pruebas si hay cambios:
#!/bin/bash
set -e -o pipefail -u
paths=()
while [ "$1" != "--" ]; do
paths+=( "$1" ); shift
done
shift
if git diff --quiet --exit-code "${BASE_BRANCH:-origin/master}"..HEAD ${paths[@]}; then
echo "No changes in ${paths[@]}, skipping $@..." 1>&2
exit 0
fi
echo "Changes found in ${paths[@]}, running $@..." 1>&2
exec "$@"
Entonces puedes hacer algo como:
./scripts/git-run-if-changed.sh cmd vendor go.mod go.sum fixtures/ tools/ -- go test