Gitlab Merge Request Builder Pluginは、GitlabにMergeRequestが作られたことを検出してジョブを実行するJenkinsプラグインです。
MRがマージされた後のソースコードをワークスペースに作成してからビルド(テスト)を実行できるため、マージ元ブランチだけに行うよりも精度の高いCIができます。
また、該当のMRのコメント欄に結果を投稿してくれる機能もあります。(このへんの魅力は後述のくりにっきさんを見るとわかりやすいです)
Reference
この記事で説明しないこと
くりにっきさんで説明されていることは極力説明しません。
本記事では、くりにっきさんと本家のドキュメントを見比べながら試行した内容について説明します。
書き終わってから気づいたこと
中途半端に日本語化されたJenkinsを元に書いたので、フル英語のJenkinsをお使いの皆様は適宜読み替えてください。ごめんなさい。
対象システム
JenkinsとGitLab両方に設定を行います。
このドキュメント内では
- Jenkins内でMR処理のために作成したジョブのことを「ジョブX」
- GitLab内でMRを作成するプロジェクトのことを「プロジェクトX」
-
GroupX/ProjectX
の場合も
-
と呼称します。
バージョン
- Jenkins 1.626
- Gitlab: 7.13.4
- Gitlab Merge Request Builder: 1.2.2
前提条件
- プロジェクトXのVisibility Levelが
Internal
またはPublic
になっていること- Privateなリポジトリが相手だと動き出しませんでした。
- ジョブXでGitLabからソースコードをフェッチしてくるときの認証は、GitLabのDeployKeyの仕組みを使って行われていること
- まあセキュアならなんでもいいとは思います
- JenkinsへのGitlab Merge Request Builder Pluginの導入は済んでいること
- Jenkinsのシステム設定画面で、Gitlabのホスト名の指定やアカウントやAPIキーの登録が済んでいること
プロジェクトXの設定
- ジョブXで使っているDeployKeyを、プロジェクトXでEnableにする
- Jenkinsのシステム設定で入力したGitLabアカウントを、プロジェクトXのメンバーに入れる
- このとき、権限は
Guest
で構わない
- このとき、権限は
以上。
ジョブXの設定
ソースコード管理
- Git
- Repositories
- Repository URL:
${gitlabSourceRepository}
- Credentials: プロジェクトAでEnableにしたやつ
- Name:
${gitlabSourceName}
- Repository URL:
- Branches to Build
- Branch Specifier:
refs/remotes/${gitlabSourceName}/${gitlabSourceBranch}
- Branch Specifier:
- Additional Behaviors:
Merge Before Build
- Name of repository:
origin
- Branch to merge to:
${gitlabTargetBranch}
- Merge Strategy:
default
- Fast-forward mode:
--no-ff
(筆者の好みです。お好きにどうぞ。)
- Name of repository:
ビルド・トリガ
- Gitlab Merge Requests Builder
- Gitlab Project Path:
GroupX/ProjectX
- Crontab line:
H/2 * * * *
(筆者の好みです。お好きにどうぞ。)
- Gitlab Project Path:
ビルド
お好きにどうぞ。
ビルド後の処理
お好きにどうぞ。
ジョブを実行する
- プロジェクトXにMergeRequestを作成する
- 最大2分待つ
- 1で作ったMergeRequestにビルド状況のコメントが付く
- ☆-(ノ゚Д゚)八(゚Д゚ )ノイエーイ
オマケ: ジョブ単体の動作確認をしたい
通常、マージリクエストを検出した上で実行されたジョブの中では、${gitlabSourceBranch}
や${gitlabTargetBranch}
などの変数はマージリクエストから得られた情報によって解決されます。一方、任意のタイミングでビルドを実行したい場合には変数の解決ができません。
そんな場合は、「ビルドのパラメータ化」で下記の値を設定することで、任意のタイミングでのビルド実行ができます。
- gitlabSourceRepository: マージ元リポジトリ(フォークしている場合)
- gitlabSourceName: マージ元リポジトリのリモート名(originみたいなやつ)
- gitlabSourceBranch: マージ元ブランチ
- gitlabTargetBranch: マージ先ブランチ
- gitlabMergeRequestId: マージリクエストのID(
!999
の数字部分)
gitlabSourceName
は1つのリポジトリ内でMRを作っている場合はorigin
ですが、フォークしたブランチからマージリクエストを作成した場合にどんな名前になるのか追いきれませんでした。(誰か教えて)
まとめ
ほぼ本家のREADMEのつまみ食いみたいな感じになりました。プロジェクトのVisibility LevelがInternal
またはPublic
じゃないと動かないのはしばらくハマりましたね。。。
それにしても、botがMergeRequestのコメント欄で動き出すと楽しいですね! Let's自動化!!!