LoginSignup
27
23

More than 5 years have passed since last update.

Gitで特定パスの変更時のみJenkinsのジョブを実行する

Posted at

背景

あるディレクトリ以下にあるファイルが変更されたときにjenkinsのジョブを実行して環境を反映したいということがありました。
リポジトリはgitを使っているのですが、ツール群が色々入っているリポジトリで、今回対象にしたいファイル郡も
それ専用にリポジトリを切るにはかなり小さい量だったので、リポジトリは変えずに特定パスのみをトリガにする方法を考えました。

やったこと

通常のSCMポーリングなんかを使うと、リポジトリの変更全てを拾ってしまいます。
でもいい感じにしてくれそうなpluginが見当たらない。
そこで今回はshellでトリガーをチェックする方法をとりました。

プラグイン導入

スクリプト設定

jenkinsのジョブが test-job、トリガーにしたいパスが src/hoge/fuga/として以下のように設定しました。

path_update_check.sh
#--------------------------
# 設定
#--------------------------
# workspaceパス
workspace=/var/lib/jenkins/jobs/test-job/workspace

# 更新チェック対象パス
check_path=src/hoge/fuga/

#--------------------------
# 実行
#--------------------------

# workspaceに移動
cd $workspace

# branch取得
branch=`git rev-parse --abbrev-ref HEAD`

# 現在のハッシュ値取得
old=`git log -n 1 --format=format:'%H'`

# pull
git pull origin $branch

# 更新後のハッシュ値取得
new=`git log -n 1 --format=format:'%H'`

# 該当パスに変更があるかチェック
# ハッシュ値間のコミットのファイルに対象パスでgrepをかける
git log $old..$new --format=format:'' --name-status | grep -e "^[ADM]\s\+$check_path"

ちょっと解説

やってることは単純で、pull前後のハッシュ値を取得して、ハッシュ間でコミットされたファイル一覧を取得。
ファイル一覧にチェックしたいパスをgrepしてるだけです。
grepの正規表現を工夫すれば複数パス指定なんかもできると思います。

grepの結果、終了コードが0になると変更があったファイルがヒットしたことになるので、
トリガーの設定の Exit Codeには 0 を設定します。

代替テキスト

最後に

上記でとりあえず、特定パスの変更ときにjenkinsを実行できるようになりました。
pluginとしてこの機能が導入されればもっと捗りそうです。
あまり需要ないかもしれませんが。

27
23
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
23