Messengerプラグインを使ってRedmineとMattermostを連携する

Redmineのチケットの更新時などにMattermostへ書き出すプラグインを日本語化したので使い方を説明する。
スクリーンショットはこんな感じ
<img width="1095" alt="Screen Shot 2017-08-05 at 14.32.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/49abb24a-fed0-9213-4125-c027b46e06ee.png">

# Messengerプラグイン
Messenger plugin for Redmine
https://github.com/AlphaNodes/redmine_messenger

[AlphaNodes](https://github.com/AlphaNodes)というドイツの会社が作っているらしい、というのがMattermost 3.10の[What's new](https://about.mattermost.com/mattermost-3-10/#redmine-plugin)に出ていた。Mattermostだけでなく、SlackやRocket.Chatにも書き出せるらしい(そちらは試していない)。既に多言語対応していたのでロケールファイルを日本語化してマージしてもらった。

# 前提環境
Redmine 3.4.2.stable
Mattermost Team Edition 4.0.0  (4.0.2)
どちらも既に日本語で動いているとする。Mattermostのバージョン表記が4.0.0なのか4.0.2なのかよくわからないが、GitLabに付属してたやつだからだろうか。3.10以降であれば動くと思う(たぶん)。

# インストール方法
インストールはいつもの通りコマンドで

```
cd $REDMINE_ROOT
git clone git://github.com/alphanodes/redmine_messenger.git plugins/redmine_messenger
bundle exec rake redmine:plugins:migrate RAILS_ENV=production
```
とした後でRedmineを再起動すると有効化される。以下のように[管理]->[プラグイン]にRedmine Messengerが見えていればOK。
<img width="1067" alt="Screen Shot 2017-08-05 at 20.18.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/133646c5-3aa0-2fd2-9a0e-886dd20eb893.png">

# 設定方法
まずMattermost側の内向きのウェブフックを有効化する。
[システムコンソール]->[カスタム統合機能]の[内向きのウェブフックを有効にする]のところで[有効]を選択して保存する。
<img width="1055" alt="Screen Shot 2017-08-05 at 20.17.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/29840475-ee8f-ab24-abdc-a56d073a21ee.png">

次に内向きのウェブフックを作成する。書き出したいチャンネルがあるチームのメニューから[統合機能]->[内向きのウェブフック]をクリックする。

<img width="1053" alt="Screen Shot 2017-08-05 at 20.20.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/db14732c-ad28-e704-3ff9-4e10414219ec.png">

~~しかしこんなにキレイに日本語化されていて隔世の感がある~~
<img width="1051" alt="Screen Shot 2017-08-05 at 20.20.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/7ea1e97f-eab7-43fc-d271-f0e169111a6d.png">

表示名はなんでもよいので適当につける。説明は不要。[チャンネル]で書き出し先のチャンネルを選択し[保存する]
<img width="1035" alt="Screen Shot 2017-08-05 at 20.23.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/34aeac92-335d-6105-50c1-fc06c72da841.png">

[セットアップが成功しました]と表示されたら[完了]。これでMattermost側の設定は終わり。
<img width="763" alt="Screen Shot 2017-08-05 at 20.24.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/d49db0cd-7ff8-bf2e-96ce-d40a01b16186.png">

続いてRedmine側の設定を行う。
[管理]->[プラグイン]->[Redmine Messenger]の[設定]からデフォルトの設定を入れる。
[メッセンジャーのURL]に先ほど作成した内向きのウェブフックのURLを入れ、[チャンネル]に書き出し先のチャンネルを入れる。([SSL証明書の検証]は環境によっては外す)
<img width="819" alt="Screen Shot 2017-08-05 at 20.29.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/f3f711d5-f422-1388-ea5f-8a85801a217a.png">
（もしdockerなどを使っていて、同じマシンの違うコンテナでRedmineとMattermostが動いている場合、localhostの所はコンテナ名を使うこと。localhostを指定するとコンテナ内の7080番ポートに接続してしまう。）

Mattermost側でチャンネル名が日本語になっている場合でも[チャンネル]は英数字で指定する。該当のチャンネルの[チャンネル情報]を見ると指定すべき文字列が.../channels/の後に見えている。この場合はtest。
<img width="617" alt="Screen Shot 2017-08-05 at 20.34.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/8c5b765d-e724-b917-87e5-8d60f1714a2c.png">

ここでデフォルトの設定を入れると、全てのプロジェクトの変更が指定されたチャンネルに書き出される。プロジェクト毎に書き出し先チャンネルを変更したい場合はプロジェクトの設定に[メッセンジャー]タブが増えているのでそこから設定する。(以下参照)
<img width="1072" alt="Screen Shot 2017-08-05 at 20.39.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/2a9de1a1-4ca9-9296-8e11-66355c1163ee.png">

デフォルトの書き出し先を指定せず、かつプロジェクトの設定でも書き出し先を指定しない場合はどこにも書き出されない。この辺りの運用は現場に合わせて調整して欲しい。

# 動作例
デフォルトではチケットが作成/更新された際にチャンネルへ書き出すようになっている。例えば、下記のようなチケットを作成すると
<img width="1071" alt="Screen Shot 2017-08-05 at 21.16.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/859a8101-9944-3a3c-d3a4-9a55fd33eed6.png">
Mattermost側に以下のように書き出される。
<img width="835" alt="Screen Shot 2017-08-05 at 21.17.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/134738/f09ecf0a-262e-9f19-faea-c00d40be5cea.png">

# その他(余談など)
Mattermostのウェブフックの説明は下記にある。動作しない場合、下記ページにあるように`curl`で直接webhookを叩くなどすると問題の切り分けができると思う。上でも書いたがコンテナを使っていると微妙に引っかかりやすい場合もあるので注意。

Incoming Webhooks
https://docs.mattermost.com/developer/webhooks-incoming.html

訳語はIncoming webhookを「内向きのウェブフック」とするなど、MattermostとRedmineの既存の日本語訳に合わせた。Incomingを内向きと訳すのは・・・どうなんだろうか？ちょっと分かりにくい気もするのだがそういうわけなのでご了承されたい。その他でわかりにくい所などあればコメントいただけると修正できるかもしれない。