Jenkinsで1つのジョブで複数のGitリポジトリをビルドする方法

Jenkinsのジョブ1つに対して複数のGitリポジトリを登録してビルドする方法について調べたのでメモ。簡単にできると思いきや意外とハマってしまった。。。

確認した環境

  • Jenkins 1.456
  • Jenkins Git Plugin 1.1.16
  • Jenkins Multiple SCMs plugin 0.2

Jenkins Git Pluginのみではできない!?

まずはJenkins Git Pluginの設定のみでできないか試してみたのだが、残念ながらこの方法は失敗。一応設定方法を紹介すると以下の通り。

  • ジョブの設定で、ソースコード管理システムにGitを選択しつつ、Repository URLにGitリポジトリのURLを設定する。
  • さらに、Repository URLの下にある追加ボタンをクリックするとRepository URLの入力項目を増やすことができるので、ここに別プロジェクトのGitリポジトリURLを設定する。以下のように、2つのGitリポジトリが設定された形となる。

f:id:Hirohiro:20120324231812p:image:w640
これでビルドしてみると、残念なことに同一ディクレクトリに複数のプロジェクトがcloneされてしまった orz...

HUDSONのIssueだが、[#HUDSON-8082] git plugin multi-repo can't work - Hudson JIRAを見ると、どうもこの設定で複数リポジトリを登録する目的はバックアップ用??
という訳でこの方法では実現できない。

Multiple SCMs Pluginと組み合わせてみる

諦めずに「jenkins git multi repository」とかでググってみると、Multiple SCMs Pluginと組み合わせるとできるよ〜という情報をゲット。ということで早速Jenkinsの管理画面からMultiple SCMs Pluginをインストールして試してみる。

  • このプラグインを入れると、ジョブの設定>ソースコード管理システムにMultiple SCMsが選択可能になる。
  • これを選択してAdd SCMsからGitを選ぶ。そうすると、従来のGitリポジトリの設定画面が表示されるので、ここに1つ目のGitリポジトリURLを設定する。
  • さらに、Add SCMsから再びGitを選ぶと、2つ目のGitリポジトリの設定画面が追加される。ここに2つ目のGitリポジトリURLを設定する。以下のように、2つのGitリポジトリが設定された形となる。

f:id:Hirohiro:20120324231813p:image:w640

これでできそう!と思いきやこれだけでは実は駄目。この状態でジョブを実行しても、相変わらず同じディレクトリにcloneされる...

高度な設定に隠れた項目が実は超重要!

Gitリポジトリの設定の中にある、高度な設定が実は重要な設定だった。
リポジトリ・ブラウザ」の上にある高度な設定ボタンを押すと色々項目が表示されるのだが、ここにLocal subdirectory for repo (optional)という項目があることに気づく。
このオプションは、リポジトリのclone先にサブディレクトリを設定するためのもの。つまり、複数のリポジトリ設定に対して別々のサブディレクトリを指定してあげれば、同一ディレクトリにcloneされるという問題を防ぐことができるわけだ。

早速これを両方のリポジトリ設定に対して試してみると、今度は無事に別々のディレクトリにcloneされた!

...しかし、これだけではまたもや落とし穴があることが判明。この状態でしばらく様子を見ていると、Gitには何もpushはしていないのにSCMポーリングの度に毎回ビルドされてしまっていることに気づく。
Multiple SCMsのポーリングログを確認すると、前回ビルド時のリビジョン(GitなのでSHA1 ハッシュ値)には1つ目のリポジトリの物が必ず使われているようで、1つ目のリポジトリは更新なしと判断されてOKだが、2つ目のリポジトリでは常に異なるため、ビルドが実行されてしまっていた。うーん惜しい。

高度な設定でもう1つ設定が実は必要

なぜ1つ目のリポジトリのリビジョンが比較対象となってしまっているのかよくわからないので、結局Git Pluginのソースを確認してようやく判明。

同じ高度な設定の中にある、Unique SCM name (optional)が実は必要でした。この値をリポジトリごとにユニークに設定してあげないと、SCMポーリングでの更新チェックで1つ目のリポジトリのリビジョンが使われてしまう。

  • 以下のように、1つ目のリポジトリに対してSCM nameを設定する。

f:id:Hirohiro:20120324231814p:image:w640

  • 同様に、2つ目のリポジトリ設定に対しても設定する。注意点として、1つ目の設定値とは異なるようにすること

f:id:Hirohiro:20120324231815p:image:w640

これでジョブを実行すると、ようやく期待通りに動作するようになりました。

まとめ

まとめると、必要な設定としては以下になる。

  • Jenkins Multiple SCMs pluginをインストールする。
  • リポジトリの種類はAdd SCMsからGitを複数追加する。
  • 各Gitリポジトリの設定で以下を登録する。サブディレクトリとSCM nameはリポジトリごとにユニークになるように設定すること。
    • Repository URL
    • Local subdirectory for repo (optional)
    • Unique SCM name (optional)