くりにっき

ドリコムのプリキュアの人です

J( 'ー`)し「たかしへ。Gitlab Merge Request Builder Pluginを入れてみたわよ」

Gitlab Merge Request Builder PluginはGitlabのMergeRequest(以降MR)をビルドして結果をレスしてくれるJenkinsプラグインです

Travis CIとかCircle CIのGitlab + Jenkins版

以前社内で発表したことを社内Gitlabでやりたいなぁと思って探したら見つかりました

便利そうなんだけど図入りの説明がなかったので(主に社内用に)導入方法まとめています。

forkされたリポジトリからのMRは設定手順増えるので割愛。(だいたいアプリのリポジトリ内にfeatureブランチ作ってるMRやり取りすることが多いので)

1. インストール

Jenkinsの管理 -> プラグインの管理 -> 利用可能で検索

f:id:sue445:20141009224815p:plain

2. プラグイン全般の設定

Jenkinsの管理 -> システムの設定

f:id:sue445:20141009225115p:plain

説明

  • Jenkins Username, Jenkins API Token
    • MRにコメントするアカウント
      • このアカウントが実際にプロジェクトにJOINしていないとダメ
      • ボットアカウントをJOINさせる場合はGuestでOK
      • f:id:sue445:20141009224906p:plain

  • Crontab line
    • このプラグインはwebhookを受けてリアルタイムにビルドするのではなく、一定間隔でポーリングしてるっぽい*1
    • デフォルトの5分おきだとちょい長いので2分おきにした
  • Default success message, Default unstable message, Default failure message
    • ビルド終了後Gitlabに通知される時のメッセージのフォーマット
    • markdownや絵文字使えるんだけどデカイ画像を貼り付けるとフィードを圧迫するので自重した方がいいと思うw

悪い例

f:id:sue445:20141009225407p:plain

良い例

f:id:sue445:20141009225708p:plain

:broken_heart: でテストが落ちた様子を、 :green_heart: でテストが通った様子を表しています。

Jenkinsの管理 -> グローバルセキュリティの設定

マークアップ記法をSafe HTMLにする

f:id:sue445:20141009230741p:plain

公式だと「Raw HTML.」のままだったので分からずちょっとハマった

3. ジョブごとの設定(MRをビルドするためのジョブを追加)

このプラグインを使うと

  1. 既存のジョブに設定追加
  2. MRをビルドするためのジョブを追加

の2通りのやり方があるけど2でいきます。(MRをビルドするブランチは途中がレッドでも最終的にグリーンになっていればいいけど、masterやdevelopをビルドするジョブは常にグリーンになっててほしいので)

既存ジョブをコピー

f:id:sue445:20141009230924p:plain

MRビルドに不要な処理があれば削除する(ドキュメント生成やデプロイなど)

ジョブ設定

ソースコードの管理

「Branches to build」(mergeする時の元branch)を origin/${gitlabSourceBranch} にする

f:id:sue445:20141009231228p:plain

「Additional Behaviours」で 「Merge before build」を追加して

  • Name of repository: origin
  • Branch to merge to ${gitlabTargetBranch} (mergeする時のマージ対象のbranch)

にする

f:id:sue445:20141009231248p:plain

ビルド・トリガ

Gitlab Merge Requests BuilderにGitlab上のパスを追加 (Host URL以降)

f:id:sue445:20141009231414p:plain

その他

チャットに通知するメッセージにビルドしたbranch名を含めたければ $GIT_BRANCH を使う

Building a software project - Jenkins - Jenkins Wiki

注意点

  • 1つのジョブで複数のbranchをテストするため、前のビルドの影響をうけないようにする必要がある
    • 例)誰かがMRでカラム削除してると同時進行しているMRでカラムがなくてエラーになるので毎回 rake db:migrate:reset するのがいいと思う
  • 1つのジョブで順番に複数のMRをビルドするため、1つの辺りのビルド時間とMRの量が多くなると捌ききれなくなる

カーチャン J( 'ー`)し 連携

弊社のGitlabにはカーチャン J( 'ー`)し がいるので連携してみた

f:id:sue445:20141009224633p:plain

カーチャン J( 'ー`)しの由来はこちら

f:id:sue445:20141009233013p:plain

https://twitter.com/chiastolite/status/448026802099736576

カーチャン連携してみたらこんな感じ

f:id:sue445:20141009231658p:plain

1週間運用してみたけど、テストが通ってることを確認してmergeすると安心感があります。

「Build triggered.」でもカーチャンからメールが飛んでちょっとうざかったので後でOFFにしています。(最初に動作確認してしまえばいらない気がする)

Github + Jenkinsは?

GitHub Pull Request Builder Plugin があるっぽい

説明見る感じ使い方はだいたい同じ? *2

*1:本当はwebhook使いたいところだけどissueがずっと放置されてるのであまり期待していない

*2:むしろGitlab Merge Request Builder Pluginの方が真似してそう