JenkinsとGitBucketを連携させる

前回はJenkinsとRocket.Chatを連携し、ジョブの実行結果をチャンネルに表示できるようにしました。今回はJenkinsとGitBucketを連携し、masterブランチにpushされたらジョブを実行するようにします。

まずはGitBucketにリポジトリを作成します。画面右上の “+” ボタンから “New repository” を選択し、”Create a new repository” 画面を埋めて “create repository” ボタンで作成できます。リポジトリができたら画面左側の “Settings” から設定画面を開き、”Service Hooks” タブを開いておきましょう。

次にJenkinsの設定です。「Jenkinsの管理」から「プラグインの管理」を選択し、「利用可能」タブから “GitBucket Plugin” を選択し、前回の “RocketChat Notifier Plugin” と同様にインストールします。

プラグインをインストールしたらJenkinsのトップページに戻り、プロジェクトの一覧から前回作成した “jenkins-rocketchat” を選択します。画面左側の「設定」を開くと、”GitBucket”欄が追加されていますので、ここに先ほど作成したリポジトリのURLを入力し、その下の “Enable hyperlink to the issue” にチェックを入れます。

続いて「ビルド・トリガ」欄の “Build when a change is pushed to GitBucket” にチェックを入れたら設定を保存します。

これだけではまだ不十分です。画面右上のユーザ名からユーザページを開き、左側の「設定」を選択します。「APIトークンの表示…」ボタンをクリックするとAPIトークンが表示されますので、これをコピーします。

ここでGitBucketに戻ります。”Service Hooks”タブの “Add webhook” ボタンを選択してフィールドを埋めます。

  • Payload URL: 今回の設定では http://jenkins:8080/gitbucket-webhook/
  • Content type: application/x-www-form-urlencodedのまま
  • Security Token: ここにAPIトークンをペーストします
  • Which events would you like to trigger this webhook?: 今回はPushにチェック

入力したら、”Payload URL” 欄右側の “Test Hook” ボタンをクリックして設定を確認します。問題なければ “WebHook Test” ダイアログが表示され、 “Response” タブに “200” と表示されます。

問題なければダイアログを閉じ、”Add webhook” ボタンでWebHookを追加します。これで設定は完了です。

冒頭に作成したリポジトリをローカルにcloneし、README.mdあたりを編集してgit commit, masterリポジトリにpushしてみて下さい。Jenkinsの “jenkins-rocketchat” ジョブがスケジューリング後に実行され、履歴が表示されます。また、Rocket.Chatのjenkinsチャンネルにビルドの開始・終了が通知されていることと思います。

JenkinsとRocket.Chatを連携させる

Notofication from Jenkins
Jenkinsからの通知

前回の記事で連携のための準備はできていますので、さっそく連携させてみましょう。

Jenkinsで「新規ジョブ作成」からジョブを作成します。ここでは「フリースタイル・プロジェクトのビルド」を選択し、タスク名を “jenkins-rocketchat” としておきましょう。

Jenkins Job Setting of Rocket.Chat
Jenkinsジョブ設定 (Rocket.Chat)

連携の動作確認のためのジョブなので、実際のビルド等は実行させません。ジョブの設定画面最下部の「ビルド後の処理の追加」プルダウンから “RocketChat Notifications” を選択すると、通知できる項目が表示されます。今回はテストなのですべてにチェックを入れておきます。右側にある「高度な設定…」から投稿先のチャンネルを変更できたりしますが、今回は触らないで設定を保存します。

作成したジョブ (プロジェクト)のページが開きますので、「ビルド実行」を選択します。するとジョブが実行され、ビルド履歴が増えます。Rocket.Chatの “jenkins” チャンネルを開くと、Jenkinsのビルド開始と終了の通知メッセージが届いていることを確認できます。

JenkinsとRocket.Chatを連携させる準備をする

さて、ここまででGitBucket, Jenkins, Rocket.Chatの各サービスをインストール・設定してきました。個々のサービスを個別に使うだけでなく、連携させることでより便利なCIを実現できます。

今回はJenkinsとRocket.Chatを連携させて、Jenkinsで発生したイベントをRocket.Chatのチャンネルに自動的に通知するようにしてみます。

まずはRocket.ChatにJenkins用のアカウントを追加します。アカウントを作成したら、Jenkinsからの通知を受け取るチャンネルを作成します。このチャンネルに普段使っているアカウントと、今作成したJenkins用のアカウントを登録します。ここでは “jenkins” アカウントと “jenkins” チャンネルを作成したことにします。

次はJenkinsの設定です。「Jenkinsの管理」画面から「プラグンの管理」を選択し、「利用可能」タグから “RocketChat Notifier” にチェックを入れて「ダウンロードして再起動後にインストール」を選択します。ダウンロードが成功したら「インストール完了後、ジョブがなければJenkinsを再起動する」にチェックを入れるとJenkinsが再起動し、RocketChat Notifierプラグインがインストールされます。

インストールに成功したら再度「Jenkinsの設定」に戻り、「システムの設定」を開きます。ページ末尾に “Global RocketChat Notifier Settings” がありますので各フィールドを埋めて保存します。

Jenkins Setting of RocketChat
JenkinsのRocket.Chat設定
  • Rocket Server URL: docker-compose.ymlの設定に合わせて http://rocket.chat:3000
  • Login Username: この記事の冒頭で設定したアカウント “jenkins”
  • Login password: アカウント “jenkins” に設定したパスワード
  • Channel: この記事の冒頭で設定したチャンネル “jenkins”
  • Build Server URL: 空欄のままでOK

右下にある “Test Connection” で “Success” と表示されれば疎通OKですので、設定を保存しておきましょう。これで連携のための準備は完了です。

Rocket.Chatを初期設定する

続いてRocket.Chatも設定します。docker-compose.ymlの設定に従って、ブラウザで8082番ポートにアクセスすると、ログイン画面が表示されます。インストール直後はアカウントが作成されていませんので、「新しいアカウントを登録」へ進みます。

新規アカウントの登録フォームを埋めて登録すると、管理アカウントとして登録されます。その後、ROOT_URLの設定が間違っていれば修正するかの確認があり、問題なければユーザ名を登録確認して利用開始です。

さて、この状態では登録フォームから自由にアカウントを作成できるようになっています。これを無効にしましょう。画面左上のユーザ名が表示されているプルダウンを選択し、「管理」から「アカウント」選択し、”Registration”の”EXPAND”で展開される項目から「登録フォームへのアクセス」の値を「無効」に変更し、「変更を保存」でOKです。

Jenkinsを初期設定する

Unlock Jenkins
Unlock Jenkins

先の記事ではJenkinsをDockerイメージとして起動しましたが、当然このままでは使えません。設定に従ってブラウザで8081番ポートにアクセスすると、”Unlock Jenkins”という画面が表示されてパスワードの入力を求められます。

このパスワードは自動生成されて、初回起動時にターミナルに出力されます。docker-composeで起動したログを確認すると、冒頭の方に * で囲まれた32桁のランダム文字列が表示されていると思います。

jenkins        | Jenkins initial setup is required. An admin user has been created and a password generated.
jenkins        | Please use the following password to proceed to installation:
jenkins        | 
jenkins        | ********************************
jenkins        | 
jenkins        | This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

見逃がしていた場合でも、この出力にあるように /var/jenkins_home/secrets/initialAdminPassword に保存されていますのでご安心を。以下のようにdockerコマンドを使ってファイルの中身を確認できます。

$ docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
********************************

が、イメージ上のボリューム /var/jenkins_homeは ./jenkins/home がマウントされたものですので、直接 ./jenkins/home/secrets/initialAdminPassword を確認することもできます。

$ cat ./jenkins/home/secrets/initialAdminPassword********************************

ここで確認できたパスワードをJenkinsのUnlock Jenkins画面の入力欄にコピペすれば、晴れてJenkinsを使えるようになります。

Unlockできたらカスタマイズ画面 (プラグインの選択)が表示されます。ここでは無難に “Install suggested plugins” を選択しておきましょう。自動で複数のプラグインがインストールされ、管理アカウントの作成画面になります。フィールドを埋めてアカウントを作成したら、いよいよJenkinsが利用可能になります。

JenkinsとRocket.ChatもDockerで動かす

GitBucketをDockerで動かせましたので、続いてJenkinsRocket.ChatもDockerで動かしましょう。いずれも公式のDockerイメージが公開されていますので、それを利用させて頂きましょう。

ここでは、GitBucketは8080番、Jenkinsは8081番、Rocket.Chatは8082番の各ポートで動作するよう設定します。設定ファイル docker-compose.yml はこんな感じになります。

version: '2'

services:
  gitbucket:
    image: takezoe/gitbucket
    container_name: gitbucket
    volumes:
      - ./gitbucket/data:/gitbucket
    environment:
      - TZ=JST-9
    ports:
      - 8080:8080
      - 29418:29418

  jenkins:
    image: jenkins:alpine
    container_name: jenkins
    volumes:
      - ./jenkins/home:/var/jenkins_home
      - ./jenkins/executors.groovy:/usr/share/jenkins/ref/init.groovy.d/executors.groovy
    environment:
      - JAVA_OPTS=-Duser.timezone=Asia/Tokyo
    ports:
      - 8081:8080
      - 50000:50000

  db:
    image: mongo:3.0
    container_name: db
    volumes:
      - ./db/data:/data/db
    command: --smallfiles

  rocket.chat:
    image: rocket.chat:latest
    container_name: rocket.chat
    environment:
      - ROOT_URL=http://localhost:8082
    links:
      - db
    ports:
      - 8082:3000

Rocket.ChatはMongoDBに依存していますので、mongodbの設定もあります。command行で --smallfiles の指定がないと./db/data以下に巨大なファイルが作成されますのでご注意を。また、ROOT_URLの値は環境に合わせて適宜変更して下さい。

設定ファイルを編集・保存し終えたら docker-compose up で各サービスが起動します。ブラウザから各サービスにアクセスしてみましょう。

2016/02/21追記: environmentによるタイムゾーンの設定を追加しました。