背景
あるディレクトリ以下にあるファイルが変更されたときにjenkinsのジョブを実行して環境を反映したいということがありました。
リポジトリはgitを使っているのですが、ツール群が色々入っているリポジトリで、今回対象にしたいファイル郡も
それ専用にリポジトリを切るにはかなり小さい量だったので、リポジトリは変えずに特定パスのみをトリガにする方法を考えました。
やったこと
通常のSCMポーリングなんかを使うと、リポジトリの変更全てを拾ってしまいます。
でもいい感じにしてくれそうなpluginが見当たらない。
そこで今回はshellでトリガーをチェックする方法をとりました。
プラグイン導入
-
shell をトリガーにするためにまず以下のプラグインを導入しました。
https://wiki.jenkins-ci.org/display/JENKINS/ScriptTrigger+Plugin -
あと、gitを使っているので、以下のプラグインも導入し該当のjobにgitリポジトリの設定をしておきます。
https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
スクリプト設定
jenkinsのジョブが test-job
、トリガーにしたいパスが src/hoge/fuga/
として以下のように設定しました。
#--------------------------
# 設定
#--------------------------
# 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としてこの機能が導入されればもっと捗りそうです。
あまり需要ないかもしれませんが。