web-dev-qa-db-ja.com

特定のファイルセットで変更が発生した場合にのみビルドをトリガーする方法

Gitツリー内の特定のプロジェクトの変更に対してのみビルドをトリガーするようにJenkins/Hudsonに指示するにはどうすればよいですか?

76
xavier.seignard

Gitプラグインには、コミット内のファイルが除外された領域の正規表現と一致するかどうかに基づいて、正規表現を使用してビルドをスキップするかどうかを決定するオプション(除外された領域)があります。

残念ながら、現時点では、ストックGitプラグインには「包含領域」機能がありません(1.15)。しかし、誰かがGitHubにパッチを投稿して、あなたが望む機能を実装するJenkinsとHudsonで動作するようにしました。

ビルドするのは少し手間がかかりますが、宣伝どおりに機能し、Gitツ​​リーの1つに複数の独立したプロジェクトがあるため、非常に便利です。

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

更新:Gitプラグイン(1.16)に「含まれる」領域機能が追加されました。

61
Aaron Kushner

基本的に、2つのジョブが必要です。ファイルが変更されたかどうかを確認するものと、実際のビルドを行うもの:

ジョブ#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パラメーターを取得します。これにより、最初のジョブで作成することを選択したリビジョンを正確に作成することができます。

Parameterized build string parameterParameterized build Git checkout

32
peritus

これは単一のジョブには影響しませんが、最新のコミットに変更が含まれていない場合、このスクリプトを使用して特定の手順を無視できます。

/*
 * 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

ファイルを選択するためのロジックが簡単でない場合、変更ごとにスクリプトの実行をトリガーし、実際にビルドが必要かどうかを確認するスクリプトを記述し、必要であればビルドをトリガーします。

2
Uri Cohen

このために Generic Webhook Trigger Plugin を使用できます。

changed_filesや式$.commits[*].['modified','added','removed'][*]などの変数を使用します。

$changed_filesのようなフィルターテキストと、"folder/subfolder/[^"]+?"がビルドをトリガーするフォルダーの場合、folder/subfolderのようなフィルター正規表現を使用できます。

1
Tomas Bjerre

私は別の投稿でこの質問に答えました:

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変更が検出されない場合...したがって、ビルドをトリガーするためのチェックインのトップレベルをいつでもポーリングできます。

1
hhony