it-swarm.com.de

Auslösen eines Builds nur, wenn Änderungen an bestimmten Dateigruppen vorgenommen werden

Wie kann ich Jenkins/Hudson anweisen, einen Build nur für Änderungen an einem bestimmten Projekt in meinem Git-Baum auszulösen?

76
xavier.seignard

Das Git-Plugin verfügt über eine Option (ausgeschlossene Region), mit der mithilfe von Regexes bestimmt werden kann, ob die Erstellung basierend darauf übersprungen werden soll, ob die Dateien im Commit mit der Regex der ausgeschlossenen Region übereinstimmen.

Leider verfügt das Standard-Git-Plugin derzeit nicht über eine Funktion zum Einbeziehen von Regionen (1.15). Allerdings hat jemand Patches auf GitHub gepostet, die auf Jenkins und Hudson funktionieren und die gewünschte Funktion implementieren.

Es ist ein wenig Arbeit, aber es funktioniert wie angekündigt und war äußerst nützlich, da einer meiner Git-Bäume mehrere unabhängige Projekte hat.

https://github.com/jenkinsci/git-plugin/pull/49

Update: Das Git-Plugin (1.16) verfügt nun über die Funktion "Eingeschlossene Region".

61
Aaron Kushner

Grundsätzlich benötigen Sie zwei Jobs. Eine, um zu prüfen, ob Dateien geändert wurden, und eine, um den eigentlichen Build durchzuführen:

Job # 1

Dies sollte bei Änderungen in Ihrem Git-Repository ausgelöst werden. Anschließend wird geprüft, ob sich der von Ihnen angegebene Pfad ("src" hier) geändert hat, und anschließend wird mit Jenkins 'CLI ein zweiter Job ausgelöst.

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

Job # 2

Konfigurieren Sie diesen Job so, dass ein Parameter wie GIT_REVISION verwendet wird, um sicherzustellen, dass Sie genau die Revision erstellen, die der erste Job erstellt hat.

Parameterized build string parameterParameterized build Git checkout

32
peritus

Dies hat zwar keine Auswirkungen auf einzelne Jobs, aber Sie können dieses Skript verwenden, um bestimmte Schritte zu ignorieren, wenn der letzte Commit keine Änderungen enthielt:

/*
 * 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
}
5
FrankerZ

Wenn die Logik für die Auswahl der Dateien nicht trivial ist, würde ich bei jeder Änderung die Skriptausführung auslösen und dann ein Skript schreiben, um zu prüfen, ob tatsächlich ein Build erforderlich ist, und dann einen Build auslösen, wenn dies der Fall ist.

2
Uri Cohen

Sie können hierfür Generic Webhook Trigger Plugin verwenden.

Mit einer Variablen wie changed_files und Ausdruck $.commits[*].['modified','added','removed'][*].

Sie können einen Filtertext wie $changed_files und filtere reguläre Ausdrücke wie "folder/subfolder/[^"]+?" ob folder/subfolder ist der Ordner, der Builds auslösen soll.

1
Tomas Bjerre

Ich habe diese Frage in einem anderen Beitrag beantwortet:

Liste der seit dem letzten Build in Jenkins/Hudson geänderten Dateien abrufen

#!/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;

Sie können das Häkchen direkt oben in die Exec-Shell des Jobs einfügen, und es wird exit 0 wenn keine Änderungen festgestellt werden ... Daher können Sie immer die oberste Ebene für Eincheckvorgänge abfragen, um einen Build auszulösen.

1
hhony