Dockerで構築したRedmineとRocket.Chatを連携させてDevOpsっぽさを出す

Pocket

はじめに

皆さんはバグ管理システムは何をお使いですか?

当社ではRedmineを使うケースがしばしばあります。Redmineはチケットが割り当てられたときなどに通知をメールで送信してくれますが、メールだとどこかスピード感に欠けると感じたことがあるのではないでしょうか。

昨今、「DevOps」という単語がトレンドとして上がってきていることもあってか、チャットを採用している開発チームが増えてきていますし、Redmineの通知もチャットを通じて送信してくれないかな、と感じることもあると思います。しかし、チャットを導入しようにも、セキュリティの都合などからクラウドサービスは採用できないというケースもあるでしょう。

そこで今回は、DockerによるRedmineとRocket.Chat(*1)の構築と、RedmineとRocket.Chatの連携の設定をしていきます(*2)。

*1 オープンソースソフトウェアのウェブチャットサーバ。インターネット上で提供されているSlackのようなチャットサービスを、プライベートな独自のプラットフォーム上で構築することができます。

*2 前提として、AWSのEC2インスタンス(CentOS)上に構築します。別環境の場合は適宜読み替える箇所が出てくると思いますが、ご了承ください。AWSマネジメントコンソールの画面は2019/02/26時点のものです。

CentOSにDockerでRedmineを構築する

それではまず、CentOSにDockerでRedmineを構築します。念の為インスタンスの作成から手順を載せておきます。

インスタンスの作成

1.AWSマネジメントコンソールにログインし、「EC2」→サイドメニューの「インスタンス」→「インスタンスの作成」の順に選択する。

2.「コミュニティ AMI」の「Cent OS」にチェックを入れ、検索窓に「CentOS 7.6.1810 x86_64 with cloud-init (HVM) – ami-00fff3eb6cfbbc19f」と入力し、出てきたAMIの「選択」をクリックする

 3.「インスタンスの詳細の設定」→「ストレージの追加」→「タグの追加」→「セキュリティグループの設定」を適宜行い、インスタンスを作成する

DockerによるRedmineのインストール

Tera Termにて、作成したインスタンスに接続して、Dockerのインストールと、DockerによるRedmineのインストールをします。
1.rootユーザに変更する

2.Dockerをインストールする

3.起動時の設定をする

4.docker-composeをインストールする

5. SELinuxを無効にする。

6.Redmine用のディレクトリを作成し、docker-compose.ymlファイルを作成する

7.ユーザ権限を変更する

8.docker-composeでRedmineを立ち上げる

9.RedmineとMySQLの設定をする

10.下記URLにアクセスし、Redmineのホーム画面が表示されることを確認する
 http://[インスタンスのパブリックIPアドレス]:3000/

Rocket.Chatとの連携プラグインのインストール

次に、Rocket.Chatとの連携プラグインをインストールします。
1.必要なライブラリをインストールする

2.Chatとの連携プラグインをインストールする

3.コンテナを再起動する

4.Redmineの管理者ユーザでログインし、ヘッダーメニューの「管理」→「プラグイン」にアクセスし、「Redmine Messenger」プラグインが表示されていることを確認する
 ※管理者ユーザは最初、下記情報でログインすることができます。
  ユーザID : admin
  パスワード : admin

CentOSにDockerでRocket.Chatを構築する

次に別のCentOSにDockerでRocket.Chatを構築します。
CentOSのインスタンス作成手順はRedmineのものとほぼ(追加したタグ「Name」の値以外)同じなので、割愛します。

DockerによるRocket.Chatのインストール

Tera Termにて、作成したインスタンスに接続して、Dockerのインストールと、DockerによるRocket.Chatのインストールをします。
1.rootユーザに変更する

2.Dockerをインストールする

3.起動時の設定をする

4.docker-composeをインストールする

5.MongoDBのコンテナイメージを取得する

6.Rocket.Chatのコンテナイメージを取得する

7.Rocket.Chat用のディレクトリを作成し、docker-compose.ymlファイルを作成する

8.ユーザ権限を変更する

9.docker-composeでRocket.Chatを立ち上げる

10.下記URLにアクセスし、Rocket.Chatのセットアップウィザード画面が表示されることを確認する
 ※セットアップウィザード画面は初期表示時のみで、それ以外の場合はホーム画面が表示される
 http://[インスタンスのパブリックIPアドレス]:3000/

Rocket.Chatの初期設定をする

1.下記の通りに管理者情報を入力し、「次へ」をクリックする
 名前      : 任意の名前
 ユーザ名    : [姓]-[名] ※姓と名は先頭のみ大文字のアルファベット
 組織の電子メール: 任意のメールアドレス
 パスワード   : 任意のパスワード

2.組織情報はスキップできるので、今回はそのまま「次へ」をクリックする
 ※任意で設定してください。

3.サーバ情報もスキップできるので、今回はそのまま「次へ」をクリックする
 ※任意で設定してください。

4.今回は、サーバーを登録する項目で「次を自分で実施し、スタンドアローン利用する」を選択し、「次へ」をクリックする

5.「ワークスペースを開く」をクリックする

6.Rocket.Chatのユーザホーム画面が表示されることを確認する

RedmineとRocket.Chatの連携設定をする

以上でインストールが完了したので、ついにRedmineとRocket.Chatの連携設定をします。

Rocket.Chatの設定

1.サイドメニューの[新しいチャンネルを作成]をクリックする

2.下記の通りにチャンネル情報を入力し、「作成」をクリック
 プライベートグループ : 任意(デフォルトはオン)
 読み取り専用チャンネル: デフォルト
 放送チャンネル    : デフォルト
 チャンネル名     : 任意
 ユーザを招待     : 任意(自分以外に招待したい人を追加する。後で追加することもできる。)

3.チャンネルが作成されていることを確認する

4.サイドメニューの「オプション」→「管理」→「サービス連携」の順にクリックする

5.「新しいサービス連携」をクリックする

6.「着信WebHook」をクリックする

7.下記の通りに項目を設定し、「変更を保存」をクリックする
 有効       : 「はい」を選択
 名前(オプション): 任意の名前
 投稿先チャンネル : 投稿先のチャンネルを指定
 ※上記以外はデフォルトでもOKです。

8.「WebHook URL」をコピーする

Redmineの設定

1.ヘッダーメニューの「管理」→「プラグイン」の順にクリックし、「Redmine Messenger」の「設定」をクリックする
 ※ここで設定した内容が、各Redmine上のプロジェクトでデフォルトとなります。

2.下記の通りに項目を設定し、「適用」をクリックする
 メッセンジャーのURL    : コピーしたWebHook URL(ホスト名がlocalhostになっている場合は、適宜置き換える)
 メッセンジャーのチャンネル : 通知先のRocket.Chatのチャンネル名
 ウォッチャーを表示する   : チェックを入れる(有効にする)
 ※上記以外はデフォルトでもOKです。

動作確認をする

動作確認のため、Redmineでプロジェクトとチケットを作成してみます。

Rocket.Chatを見てみると、作成したチャンネルに投稿が来ている!


しかし、少し味気ないような気がします。せめて担当者やウォッチャーにメンション(通知)を飛ばしたいですね。ということで、スクリプトを少しいじってみましょう。

Redmine Messengerで担当者とウォッチャーに通知が来るようにカスタマイズする

Redmine Adminユーザだけではわかりづらいので、RedmineとRocket.Chatにそれぞれ下記のユーザを追加しました。

【Redmine】
 1人目
  ログインID: yamauchi
  名    : Kentaro
  姓    : Yamauchi
 2人目
  ログインID: mirai
  名    : Sou
  姓    : Mirai

【Rocket.Chat】
 1人目
  名前  : 未来 創
  ユーザ名: Mirai-Sou

 

Redmineの設定の変更

メンションを送る際にRedmineが送信する名前の情報がデフォルトだと「名 姓」になっているので、変更します。
「名 姓」のままがいい場合はRocket.Chatのユーザ名を「名-姓」にすれば問題なく設定できます。
1.ヘッダーメニューの「管理」→「設定」→「表示」タブにアクセスし、下記項目の設定を変更し、「保存」をクリックする
 デフォルト言語  : 「Japanese(日本語)」
 ユーザ名の表示形式: 「姓 名」

Redmine Messengerのカスタマイズ

Redmine Messengerはチケットの更新時などにウォッチャーを送信しないようになっているようです。そこで、Redmine Messengerのソースコード(Ruby)を少しカスタマイズします。
1.「/usr/src/redmine/plugins/redmine_messenger/lib/redmine_messenger/patches/issue_patch.rb」をコンテナ内からホストにコピーしてくる

2.ホストで「issue_patch.rb」を編集

3.ホストからコンテナ内に「issue_patch.rb」をコピー

4.コンテナを再起動する

Rocket.Chatのカスタムスクリプト

最後に、Rocket.Chat側に送信されたメッセージを通知させるようにカスタマイズします。
1.サイドメニューの「オプション」→「管理」→「サービス連携」の順にクリックする
2.先程作成した「着信WebHook – [任意の名前]」をクリックする

3.下記の通りに項目を設定し、「変更を保存」をクリックする
 スクリプトを有効にする: はい
 Script: 次の内容

 

動作確認をする

再度動作確認のため、Redmineでチケットの更新をしてみます。

Rocket.Chatを見てみると、作成したチャンネルに今度は通知が来ている!デスクトップ通知も来てほしかったのですが、証明書がない場合はChromeだとブロックされてしまうようです。Firefoxやデスクトップアプリの場合は、デスクトップ通知も問題なく来ました。担当者とウォッチャーにメンションが飛んでいることも確認できました!

 

ちなみに、Rocket.Chatでは、自分宛てにメンションがついている投稿だけを表示する機能があるので、埋もれても問題なく表示することができます。

おわりに

いかがでしたでしょうか。今回はRedmineとRocket.Chatの構築と連携の設定に加えて、少しプラグインをカスタマイズしてみました。RedmineのプラグインはRuby、Rocket.ChatのカスタムスクリプトはJavaScript(Meteor)で書くことができるので、比較的ネットでも記事を見つけやすく、意外と簡単にカスタマイズできると思います。複数環境を用意する場合も、docker-compose.ymlがあれば構築は簡単ですし、Dockerイメージファイルを作成すれば環境の複製も比較的容易になります。今後は、これらの環境の構築や連携の設定などを自動化し、GUIベースで簡単に環境構築できるようにしていきたいと考えています。

お問い合わせ先

執筆者プロフィール

Yamauchi Kentaro
Yamauchi Kentarotdi デジタルイノベーション技術部
社内の開発プロジェクトの技術支援や、Javaにおける社内標準フレームワークの開発を担当しています。Spring BootとTDDに手を出しつつ、LINE Botとかもいじったりしています。最近はマイクロサービスを勉強しつつ、クラウドアプリケーションを開発できるエンジニアの育成にも力を入れてます!
Pocket

関連記事