Comment déclencher une compilation seulement si des changements se produisent sur un ensemble particulier de fichiers
Comment dire à Jenkins / Hudson de lancer un build uniquement pour des changements sur un projet particulier dans mon arbre à Gitans?
6 réponses
le plugin Git a une option (excluded region) d'utiliser regexes pour déterminer s'il faut sauter la construction en se basant sur le fait que les fichiers dans la propagation correspondent à la regex de la région exclue.
malheureusement, le plugin stock Git n'a pas de fonctionnalité" région incluse " en ce moment (1.15). Cependant, quelqu'un a posté des patches sur GitHub qui travaillent sur Jenkins et Hudson qui implémentent la fonctionnalité que vous voulez.
C'est un peu de travail à construire, mais il fonctionne comme annoncé et a été extrêmement utile depuis l'un de mes arbres Git a plusieurs projets indépendants.
https://github.com/jenkinsci/git-plugin/pull/49
mise à jour: le plugin Git (1.16) a maintenant la fonctionnalité de région "included".
en gros, vous avez besoin de deux emplois. Un pour vérifier si les fichiers ont changé et un pour faire la construction réelle:
Job # 1
ceci doit être déclenché lors de changements dans votre dépôt Git. Il teste ensuite si le chemin que vous spécifiez ("src" ici) a des modifications et utilise ensuite Jenkins' CLI pour déclencher une seconde tâche.
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
"151940920 de Travail" #2
Configure cette tâche pour prendre un paramètre GIT_REVISION comme cela, pour s'assurer que vous construisez exactement la révision que la première tâche a choisi de construire.
bien que cela n'affecte pas les travaux simples, vous pouvez utiliser ce script pour ignorer certaines étapes si la dernière propagation ne contient pas de changements:
/*
* 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 logique pour choisir les fichiers n'est pas triviale, Je déclencherais l'exécution du script à chaque changement et ensuite j'écrirais un script pour vérifier si en effet une construction est nécessaire, puis je déclencherais une construction si elle l'est.
j'ai répondu à cette question dans un autre post:
Comment obtenir une liste des fichiers modifiés depuis la dernière build dans 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;
vous pouvez ajouter le contrôle directement en haut du shell exec du travail, et il sera exit 0
si aucun changement n'est détecté... Par conséquent, vous pouvez toujours interroger le niveau supérieur pour que l'enregistrement déclenche une compilation.
vous pouvez utiliser Plugin Webhook générique de déclenchement pour cela.
avec une variable comme changed_files
et l'expression $.commits[*].['modified','added','removed'][*]
.
vous pouvez avoir un texte de filtre comme $changed_files
et un regexp de filtre comme "folder/subfolder/[^"]+?"
si folder/subfolder
est le dossier qui devrait déclencher des constructions.