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?

55
demandé sur Peter Mortensen 2011-03-09 12:20:00

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".

52
répondu Aaron Kushner 2018-07-19 16:11:46

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.

Parameterized build string parameter Parameterized build Git checkout

26
répondu peritus 2018-07-19 16:18:27

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
}
2
répondu FrankerZ 2017-11-16 15:01:58

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.

1
répondu Uri Cohen 2011-03-09 12:39:25

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.

1
répondu hhony 2018-07-19 16:20:01

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.

0
répondu Tomas Bjerre 2018-04-01 06:40:57