CI/CD関連ツールを連携する - Mattermostへの通知編 -

「[CI/CD関連ツールのユーザー情報をLDAPで一元管理してみる](https://qiita.com/kazuki43zoo/items/0d4e5c22d7c76fc3c76f)」と「[CI/CD関連ツールの認可をLDAPと連携して実現してみる(連携できないツールあり・・・)](https://qiita.com/kazuki43zoo/items/9fc765d314ee46d4222a)」で、CI/CD関連ツールの認証・認可についてメモったので、今回は各ツール上でのアクティビティをMattermost(Chatツール)に通知する方法をメモっておく。

# Mattermostと連携するツール

* GitLab
* Jenkins
* Redmine

> **NOTE:**
>
> * SonarQubeについては、Mattermost向けのPluginを見つけられなかったのでいったん保留。Slack用のPluginがあるようなので、時間が取れた時に試して見ようかな〜。
>
> * NEXUSについては、Mattermostとの連携が必要になるユースケースが思い浮かばなかったので対象から除外した。（仕組があるのかどうかも調べてない）

# 連携イメージ

「GitLab」「Jenkins」「Redmine」のアクティビティをMattermostに通知し、通知れたメッセージの中に含まれるリンクを押下することでアクティビティの詳細内容を確認できるようにする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/bba5bb65-e3cd-2ca7-1cf5-783c56508a7b.png)


# Mattermost

まず、通知を受けるMattermost側の設定を行う。

## Webhookの有効化

Webhookを使えるように設定を変更する。GUIおよび設定ファイルでの変更がサポートされている。

GUI:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/b1c2c648-2a8c-7f17-784e-a376a0d1b848.png)

設定ファイル:

```json:mattermost/config_docker.json
{
    "ServiceSettings": {
        "EnableIncomingWebhooks": true
    }
}
```

## 通知用のチャネルを追加

各ツールからの通知を受けるためのチャネルを追加する。

> **NOTE:**
>
> 本エントリではチャネルを一つだけにしたが、ツール毎にチャネルを分けた方がわかりやすい気はしてる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/0e85f82c-f201-acab-51ca-606c6b58dd81.png)

## Webhook受付用のエンドポイントを生成

Webhook受付用のエンドポイントを作成する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/3859c999-fd60-cee6-95d9-6b5bc79487fc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d6cf9356-ea1e-926c-e121-4920c2a9b6b8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/f59f198b-7e30-7ab7-effa-c5d30f71b8fc.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/e30c1564-bef1-a90a-af9a-2aa7e4ccab0b.png)

エンドポイントにアクセスするためのURLが生成されるので、このURLをコピーしておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/8427ed88-5944-dd15-245a-d6e482099dad.png)

> **NOTE:**
> 
> Dockerを使って環境構築している場合は、「ホスト名」と「ポート名」をDockerコンテナ内で通信できる値に置き換える必要がある。本エントリーでは・・・「localhost -> mattermost」「18065 -> 8065」に置き換える。
つまり・・・「http://mattermost:8065/hooks/dzmpwypaefbo3pt3cu69ebwk6w」 がWebhook受付用のエンドポイント(URL)になる。

# GitLab

## 外部アクセス用のURLの設定

外部からアクセスするためのURLを設定する。これを設定しないと・・・GitLabからMattermostへ通知するメッセージの中に含まれるURLが正しく組み立てられない。

docker-compose.ymlで指定する際の設定例:

```dockerfile
services:
  gitlab:
    build: ./gitlab
    container_name: cicd-gitlab
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        external_url 'http://localhost'
    ports:
      - '80:80'
      - '433:433'
    links:
      - "openldap:ldap"
```

gitlab.rbで指定する際の設定例:

```rb
external_url 'http://localhost'
```

## Mattermost notificationsサービスのセットアップ

GitLabに内臓されている連携サービス(Mattermost notificationsサービス)を利用して、Mattermostへメッセージ通知するための設定を行う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/26726e46-2a95-9fa0-a559-5143db2a9206.png)

Activeをチェックし、Webhook欄にWebhook受付用のエンドポイントのURLを指定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/5c75a2c9-f81b-5029-3e25-6f57286dde54.png)

「Test settings and Save changes」を押下すると・・・Mattermost側に以下のような通知が行われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/737aaaa5-4745-7ca1-f032-2651c544e664.png)

## Wikiを修正して通知を受ける

テストだとやや心もとないので・・・Wikiページを編集してみると・・・

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d71836a3-1229-0e00-7b93-87cd7288fefd.png)

Mattermost側に以下のような通知が行われ、Wikiページが更新されたことを検知することができる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/3f7dde81-2d20-4dcc-0534-8cce2a3f5857.png)

> **NOTE:**
>
> 冒頭で紹介したexternal_urlの指定がないと・・・メッセージ内のリンクを押しても正しいページに遷移することができないケースがある。

# Jenkins

## Mattermost Notification Pluginのセットアップ

Jenkinsビルドの内容をMattermostに通知する場合は、Mattermost Notification Pluginを利用する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/eca79685-1f75-1b61-fd22-20fac590cbfb.png)

Mattermost Notification Pluginインストール後に、Mattermost Notification Pluginのグローバル設定を行う。Build Server URLに外部からアクセスするためのURLを設定する。これを設定しないと・・・JenkinsからMattermostへ通知するメッセージの中に含まれるURLが正しく組み立てられない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/76f2db52-96a9-0490-1394-944b3815465f.png)

## Jobの作成

ビルド内容を通知するJobを作る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/84072f35-8ee5-08c1-bd16-0029fba0705c.png)

Post-build Actionsで「Mattermost Notifications」を選んで通知設定を行う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/588d697f-8e8d-e992-f6f4-d7331d8b5017.png)

「Test Connection」を行うと以下のような通知が行われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/7152a31b-7090-c96e-0f7f-af286aa1e5f0.png)

## Job実行して通知を受ける

実際にJobを実行してみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/8c601480-e26f-35db-71ac-68bdfa7e590a.png)

Jobが成功すると、以下のような通知が行われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/fe530d9b-0cc8-547f-1e5d-9b284f29b4e1.png)

Jobが失敗すると、以下のような通知が行われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/5757404d-ae3b-e1a9-c7c2-16e9951fe35d.png)


# Redmine

## Redmine Messanger Pluginのセットアップ

Redmine上でのアクティビティをMattermostに通知する場合は、Redmine Messanger Pluginを利用する。

まず、Dockerコンテナに入る。

```
$ docker exec -i -t cicd-redmine bash
```

GitHubからソースをダウンロードする。

```
root@f70b7347f503:/usr/src/redmine# git clone https://github.com/AlphaNodes/redmine_messenger.git plugins/redmine_messenger
Cloning into 'plugins/redmine_messenger'...
remote: Counting objects: 645, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 645 (delta 5), reused 19 (delta 2), pack-reused 622
Receiving objects: 100% (645/645), 404.02 KiB | 467.00 KiB/s, done.
Resolving deltas: 100% (280/280), done.
Checking connectivity... done.
root@f70b7347f503:/usr/src/redmine# 
```

Redmine Messanger Pluginをビルドしてインストールする。

```
root@f70b7347f503:/usr/src/redmine# bundle exec rake redmine:plugins:migrate RAILS_ENV=production
Migrating redmine_messenger (Redmine Messenger)...
== 1 CreateMessengerSettings: migrating =======================================
-- create_table(:messenger_settings)
   -> 0.0124s
== 1 CreateMessengerSettings: migrated (0.0126s) ==============================

== 2 AddDefaultMentions: migrating ============================================
-- add_column(:messenger_settings, :default_mentions, :string)
   -> 0.0010s
== 2 AddDefaultMentions: migrated (0.0011s) ===================================

root@f70b7347f503:/usr/src/redmine#
```

Redmineを再起動してPluginページを開くと、Redmine Messanger Pluginが認識されていることが確認できる。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/4ad3f12f-d907-98fb-344c-1dc227900f12.png)

「Configure」リンクを押下して、Redmine Messanger Pluginの設定を行う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/bc1c2ca3-f8d7-9d72-cfda-1c995bff2651.png)

## 外部アクセス用のURLの設定

「Host name and path」に外部からアクセスするためのURLを設定する。これを設定しないと・・・RedmineからMattermostへ通知するメッセージの中に含まれるURLが正しく組み立てられない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/e263eedc-1287-4424-e904-5228b814adb7.png)

## Issueを作って通知を受ける

Issueを作る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/d4d6f7fd-6cda-30fa-effd-325deeb898f7.png)

Issueの作成を行うと、以下のような通知が行われる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/9c413f7c-3d52-4211-0b73-3452114e2156.png)