Git ツリー内の特定のプロジェクトの変更に対してのみビルドをトリガーするよう Jenkins/Hudson に指示するにはどうすればよいですか?
9 に答える
Gitプラグインには、正規表現を使用して、コミット内のファイルが除外された領域の正規表現と一致するかどうかに基づいてビルドをスキップするかどうかを決定するオプション(除外された領域)があります。
残念ながら、現時点では、ストックGitプラグインには「インクルードリージョン」機能がありません(1.15)。ただし、誰かがGitHubに、必要な機能を実装するJenkinsとHudsonで動作するパッチを投稿しました。
構築するのは少し手間がかかりますが、宣伝どおりに機能し、私のGitツリーの1つに複数の独立したプロジェクトがあるため非常に便利です。
https://github.com/jenkinsci/git-plugin/pull/49
更新:Gitプラグイン(1.16)に「含まれる」リージョン機能が追加されました。
基本的に、2 つのジョブが必要です。1 つはファイルが変更されたかどうかを確認するためのもので、もう 1 つは実際のビルドを行うためのものです。
ジョブ #1
これは、Git リポジトリの変更時にトリガーする必要があります。次に、指定したパス (ここでは「src」) に変更があるかどうかをテストし、Jenkins の CLIを使用して 2 番目のジョブをトリガーします。
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
ジョブ #2
最初のジョブがビルドすることを選択したリビジョンを正確にビルドしていることを確認するために、パラメータ GIT_REVISION を取るようにこのジョブを構成します。
これは単一のジョブには影響しませんが、最新のコミットに変更が含まれていない場合は、このスクリプトを使用して特定の手順を無視できます。
/*
* 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
}
ファイルを選択するロジックが簡単でない場合は、変更ごとにスクリプトの実行をトリガーし、ビルドが本当に必要かどうかを確認するスクリプトを記述し、必要な場合はビルドをトリガーします。
私は別の投稿でこの質問に答えました:
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;
ジョブの exec シェルの先頭にチェックを直接追加できますexit 0
。変更が検出されない場合は追加されます...したがって、チェックインの最上位をいつでもポーリングして、ビルドをトリガーできます。