こちらの記事は2015年09月02日にQiitaに投稿したものを移植したものとなります。

Qiitaからの移植に当たって内容の精査は行っていません。
従って、記事は当時の私の知識や当時の技術そのままです。

やりたいこと


リモートリポジトリにpushした際に、pushしたブランチごとに異なるJenkinsのジョブを実行したい。

環境


Windows前提で書いていますが、それ以外でも同様の設定で動くと思います。

Jenkins側の設定


Jenkinsの各ジョブの設定で「ビルドトリガ」から「リモートからのビルド」を選んで認証トークンを設定します。これだけです。

git hooksの設定


サーバーサイドフックの「post-update」を使います。参考:Gitフック「post-update」を使えばpushしたブランチごとに処理を分岐させることができます。

リモートリポジトリの「.git/hooks」ディレクトリに「post-update」というファイルを作成して、下記を記述します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#どのブランチがpushされたか受け取る。
branch=$(git rev-parse --symbolic --abbrev-ref $1)

#ブランチごとに処理を分ける。
case $branch in
master)
wget --spider http://サーバーURL:ポート番号/job/ジョブ/build?token=設定した認証トークン
echo "Jenkins master build job is started."
;;
develop)
wget --spider http://サーバーURL:ポート番号/job/ジョブ/build?token=設定した認証トークン
echo "Jenkins develop build job is started."
;;
*)
echo "Jenkins job is nothing."
;;
esac
  • 「wget」コマンドの後「–spider」オプションでページの存在確認のみ行います。
  • サーバーのURL、ポート、ジョブ、設定した認証トークンを環境にあわせて記述します。
  • 「echo」に記述した内容はクライアント側に表示されます。
  • リモートリポジトリとJenkinsが同一サーバーにあってもサーバーURLに「localhost」と書かないほうがいいです。(理由は後述)

wgetの設定


ローカルリポジトリ側の端末でwgetを実行できるようにします。方法はWindowsでwgetする色々な方法を参考にさせて頂きました。

「post-update」フックはリモートリポジトリ側で設定しているので、サーバーのみ「wget」できるようにすればいいと思っていたのですが、コマンド自体(今回はwget)はローカルリポジトリ側の端末で実行される(?)ようです。

従って、リモートリポジトリとローカルリポジトリが異なる端末の場合、ローカル側の端末でも「wget」を実行できるようにしないとpushした際に「wgetコマンドが見つかりません。」と言われます。ここでしばらく詰まりました。

同様に、サーバーのURLに「localhost」と記述しているとページが見つからずにジョブが実行されません。また、どこかの記事でWindows環境で特に何もしなくても「post-update」から「wget」が実行できたという記述もありましたが、私の環境では無理でした。(普通は無理な気がする…)

参考リンク


Gitプッシュ時にJenkinsで自動ビルド