下記の環境の通りGitLab・Redmine・JenkinsからMattermostにWebhookを利用して通知しているのですが、Mattermostを4.0以上に上げたら通知時のアバターと表示名がWebhookの作成者になってしまいました…。

環境


  • Mattermost 4.0~4.1.0
  • GitLab 9.4.3
  • redmine_messenger 0.9.9
  • Jenkins Mattermost Plugin(バージョンちょっとわからん)

Mattermostで内向きのWebhookを作成し、それをGitLabとRedmine・Jenkinsそれぞれのプラグイン側からWebhookを利用してMattermostに通知しています。

現象


Mattermost 3.10までだと、アバターと表示名は各々のアプリケーション側(GitLabとRedmine・Jenkinsそれぞれのプラグイン側)で指定したものが表示されていたのですが、Mattermost4.0以降ではなぜかWebhookの作成者で表示されるようになってしまいました。

これによって、各々のアプリケーションからの通知が全てあたかもWebhook作成者である私が行ったかのようになってしまいました…。

原因


Mattermost3.5Mattermost4.0のAPIドキュメントをみた感じでは、該当部分のAPIが変わっているようには見えないですし、いきなりAPIを変えるというよりは段階的に廃止するはず(実際に4.0のドキュメントには3.xのAPIは廃止予定と書いてるのでそれまでは3.xのAPIで動くはず)です。API以外の挙動が変わってしまったのでしょうか…。

また、MattermostのIssueを軽く漁ったところそれらしいものは上がっておらず、ハッキリした原因がわからないです。

対処方法


Webhookの作成者の情報が表示されてしまうので、Mattermostに各々のアプリケーションの通知専用ユーザを作成する必要があります。その上で対処方法は2つあると思います。

  • 作成した通知専用ユーザでWebhookを作成する
  • Webhookは別ユーザで作成し、Webhookの作成者をデータベースを直接更新して通知専用ユーザに変更する

今回は下記の理由でデータベースを直接変更する方法をとりました。

  • Webhookの作成は管理者でしかできない(たぶん)ので余計なユーザ(通知専用ユーザ)に管理者の権限を与えたくない
  • Webhookを新規作成するとURLも変更になってしまうので、連携するアプリケーションの設定値を全て書き換えないといけない

以下はデータベースの値を直接変更する方法を書いてます。直接変更しておかしくなっても責任とれません。ちゃんと動いてるのでたぶん問題ないと思うけど。

修正作業


通知専用ユーザを作成

Webhook通知で表示するために通知専用のユーザを作成します。今回は仮に名前をJenkinsとします。

DB接続

おもむろにMattermostのデータベースに接続します。データベースはPostgreSQLでデータベース名はmattermostとします。

1
psql -d mattermost

Mattermost公式のDockerイメージを使用している場合はpostgresというユーザが存在するのでそのユーザに切り替えてから作業します。

ユーザID確認

Webhookの作成者の値を通知専用ユーザに変更するためusersテーブルで変更後のユーザIDを確認します。今回はJenkinsユーザの値にするのでasdfkawieui9834nkjnasdh12fになります。

1
2
3
4
5
6
mattermost=# select id, firstname from users;

id | firstname |
----------------------------+--------------|
kuihiuweajr823u4jniadyhfiu | YoshinoriN |
asdfkawieui9834nkjnasdh12f | Jenkins |

対象のWebhook確認

incomingwebhooksというテーブルがあるのでそこで対象のWebhookを確認します。

1
2
3
4
5
6
mattermost=# select * from incomingwebhooks;

id | ... | userid | channelid | ...
----------------------------+-----+----------------------------+----------------------------+-
9iojkh889audjft4o5kpllmbsd | ... | kuihiuweajr823u4jniadyhfiu | oioj07892hjihniojoijokjakl | ...
mmhauwyeuoi2837hjadafdas35 | ... | kuihiuweajr823u4jniadyhfiu | 98ksauhvllk3i4j1jbjabidhjk | ...

このテーブルのuseridがWebhookの作成者のidです。これを通知専用のユーザ(今回のサンプルだとJenkins)に変更します。

UPDATE

後はUPDATEするだけです。

1
2
mattermost=# update incomingwebhooks set userid = 'asdfkawieui9834nkjnasdh12f'
where id = 'mmhauwyeuoi2837hjadafdas35';

動作確認


後は、変更後ユーザの情報で通知されていればOK。ただし、変更前の通知は当然変わらない。

その他


これ、Webhook作成するたびにやらないといけないので正直めんどくさいのですが、他に対処方法はないのか、それとも何か壮大な勘違いをしているのか、…。