目次

Redmine の通知を Mattermost で受け取るには?

背景

今回の現場は、ちょっと特殊な環境。

一方、よくあるパターンで、「進捗管理は数多ある Excel で」「質疑や依頼、相談などは『Excel の管理表』+ 2 段目の環境にあるチャット(Mattermost)で」という体制。これはものすごく非効率なので(特にコミュニケーション手段がオンライン会議以外で「チャット」と「直接会話」しかないのがつらい)、強く要望してなんとか Redmine を導入してもらった。

ところで、Redmine の強力な武器は、メールによる通知。しかし、メールは 1 段目の環境でしか読めず、通常の作業は 2 段目でのみ行うことになっていることもあって、メールで通知したとしても気付けない。Redmine のサーバ自体は 2 段目の環境内にあってブラウザで読み書きできるので、通知も Mattermost で受け取りたい……

ということで、Redmine と Mattermost との連携を模索してみた。

Mattermost 側の仕込み

まずは Mattermost で通知を受け取れるようにならないと話にならない。調べたところ、「Incoming Webhook」による方法と「パーソナルアクセストークン」による方法があることが判った。

メッセージを投稿できるようになるまで(Incoming Webhooks 編)

  1. システムコンソールの「統合機能>統合機能管理」で「内向きのウェブフックを有効にする」を「有効」に設定
  2. システムコンソールの「統合機能>統合機能管理」で「統合機能によるユーザー名の上書きを許可する」と「統合機能によるプロフィール画像アイコンの上書きを許可する」を「有効」に設定
    • これをやっておかないと、3. で投稿元ユーザ名の指定ができず、仮に投稿元ユーザ名を指定してあっても Webhook の作成者名に強制される
  3. 「統合機能」で「内向きのウェブフック」を選択し、「内向きのウェブフックを追加する」を押して Incoming Webhook を追加する
    • 「チャンネル」の指定は何でもいいが、「このチャンネルに固定する」にはチェックしないこと
    • 「ユーザ名」に通知元ユーザ名を設定しておくと、実際の投稿時に username の指定を省略可能
  4. 以下のようにすると投稿できる
    • チャンネル宛
      curl -i -X POST -d 'payload={"text": "<テキスト>", "username": "<通知元ユーザ名>", "channel": "<投稿先チャンネル名>"}' <Webhook の URI>
    • DM(Mattermost クライアントのサードバーでは、投稿者名に関わらず、Incoming Webhook の作成者から DM が届いたように見える)
      curl -i -X POST -d 'payload={"text": "<テキスト>", "username": "<通知元ユーザ名>", "channel": "<「@」+通知先ユーザ名>"}' <Webhook の URI>
  5. 必要に応じて、システムコンソールの「環境>投稿頻度制限」の設定をする

メッセージを投稿できるようになるまで(パーソナルアクセストークン編)

  1. 通知の投稿に使用するオフラインユーザを登録する
    sudo -u mattermost mmctl --local user create --username="redmine" --email="メールアドレス" --password="パスワード"
  2. 登録したユーザをチームに招待する
  3. システムコンソールの「統合機能>統合機能管理」で「パーソナルアクセストークンを有効にする」を「有効」に設定
  4. システムコンソールの「ユーザー管理>ユーザー」で 1. のユーザのメニューから「ロールの管理」を選択し、以下のように設定
    • 「このアカウントがパーソナルアクセストークンを生成できるようにする」にチェック
    • 「投稿:全て」にチェック
  5. 1. のユーザでログイン
  6. 右上のユーザアイコンを押して表示されるメニューから「プロフィール」(またはユーザアイコンとユーザ名の項目)をクリック
  7. 表示されたメニューの「セキュリティー」タブで「パーソナルアクセストークン」の項の「編集する」をクリック
  8. 「トークンを生成する」をクリックし、「トークンの説明」を記入後に「保存する」をクリックして、表示されたアクセストークンを控える
    • 「トークンID」は再表示可能だが、「アクセストークン」は再表示不可。紛失した場合は、一旦トークンを削除して再作成。
  9. 投稿する
    • チャネルへの投稿
      1. 投稿先のチャネルを表示し、ヘッダに表示されているチャネル名(左側の一覧ではない)のメニューから「情報を表示する」を選び、ID を見る
      2. その ID を使って以下のようにする
        curl -i -H 'Authorization: Bearer <投稿元ユーザのアクセストークン>' -H 'Content-Type: application/json' -d '{"channel_id": "<チャネルの ID>", "message": "<メッセージ>"}' http://mattermost.gotanda.or.jp:8065/api/v4/posts
    • DM の投稿
      送信元ユーザ ID と送信先ユーザ ID を指定して「ダイレクトチャンネル」を作成し、そのチャンネルの ID を指定して送信する必要があるらしい。めんどくちゃい。

結論

こと DM の送信に関しては、Incoming Webhook を使うのが圧倒的に楽。で、Redmine 側のプラグインがどうだか調べたところ、(その範囲では)すべて Incoming Webhook を使用していた。これで、万一希望に沿うように改造することになっても、障壁は低い (^^;

Redmine 側の仕込み

Redmine 側のプラグインとしてとりあえず 3 つ見つかったが……

というわけで、以下に redmine_messenger との組み合わせについて雑にまとめておく。

なお、設定項目にある「ユーザー名をその人についての投稿(@ユーザー名)に変換する」「ウォッチャーを表示する」「チケットの更新」の効果は、よく判らない……