GitLab Mattermostの導入 - SSO設定、"webhook is blocked"対応

# はじめに
どうも！生産技術部のエンジニアです。私の所属する部署は仕事中にチャット？言語道断。という風潮が残されています。古き良き文化を捨て、新しい事に挑戦する事が「働き方改革」に繋がると信じています。ということで、今回は、GitLab Mattermostの導入を実施したいと思います。ここでは、GitLab Mattermostの有効化から、シングルサインオン(SSO)の設定、"webhook is blocked"エラーの対応方法を紹介します。

GitLabサーバを一から構築される方は、以下からご覧ください。
[「proxy環境下でDocker Composeを用いてCentOS7上にGitLab Dockerを作成」](https://qiita.com/TomoyukiSugiyama/items/ba7ef0ebab8242dbacb0)

# 環境
* CentOS : 7.6.1810
* Docker-CE : 19.03.1
* Docker Compose : 1.25.0
* GitLab-CE Docker : 12.2.0-ce.0

# 前提条件
Docker、GitLabの導入が実施済みであること。

[「proxy環境下でDocker Composeを用いてCentOS7上にGitLab Dockerを作成」](https://qiita.com/TomoyukiSugiyama/items/ba7ef0ebab8242dbacb0)
を参考に導入してください。

# GitLab Mattermostの有効化
GitLab MattermostはGitLabの同封されていますが、標準で無効化されています。下記の設定を追加後、`gitlab-ctl reconfigure`を実施する事で有効になります。
 
```ruby:gitlab.rb
mattermost_external_url 'http://gitlab.example.com:8001'
```
GitLabのDockerコンテナを利用している場合は、以下のコマンドを使用します。再設定が完了した後、`http://gitlab.example.com:8001`にアクセスし、GitLab Mattermostに接続できる事を確認して完了です。

```shell:
$ docker exec -it gitlab_web_1 gitlab-ctl reconfigure
```


# シングルサインオン(SSO)の設定
GitLabのアカウントを利用して、GitLab Mattermostにログインする場合は、SSOの設定が必要になります。まずは、GitLabの`Admin Area`->`Application`から新規のアプリケーションを追加します。既にGitLab Mattermostがある場合は、追加不要です。下記の項目を設定して下さい。

* Name  
 - `GitLab Mattermost`(任意の名前)  
* Redilect URI  
 - `http://<登録したMattermostのURL>/login/gitlab/complete`  
 - `http://<登録したMattermostのURL>/setup/gitlab/complete`
* Scope  
 - [x]  api

![sso_mattermost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/c7eba2d8-b2b0-6eb1-05f1-64140282398d.png)

登録したアプリケーションを選択し、`Application ID`と`Secret`の値を確認します。

![appid_mattermost.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/1c62e78b-95b0-cd03-3bc3-50ad6d3b014b.png)

設定内容は、[GitLabの公式ドキュメント][link-mattermost]に従います。`gitlab_id`と`gitlab_secret`には、先ほど確認した`Application ID`と`Secret`の値を登録します。設定後は、`gitlab reconfigure`を実施し完了です。

```ruby:gitlab.rb
mattermost['gitlab_enable'] = true
mattermost['gitlab_id'] = "12345656"
mattermost['gitlab_secret'] = "123456789"
mattermost['gitlab_scope'] = "api"
mattermost['gitlab_auth_endpoint'] = "http://<登録したGitLabのURL>/oauth/authorize"
mattermost['gitlab_token_endpoint'] = "http://<登録したGitLabのURL>/oauth/token"
mattermost['gitlab_user_api_endpoint'] = "http://<登録したGitLabのURL>/api/v4/user"
```
[link-mattermost]:https://docs.gitlab.com/omnibus/gitlab-mattermost/#manually-reauthorising-gitlab-mattermost-with-gitlab

# ”webhook is blocked”の対応方法
Gitlabからpush通知等をGitLab Mattermostに送りたい場合は、webhookの設定が必要になります。設定内容は省略しますが、[「GitLabとMattermostの連携」][link-webhook]を参考に設定させて頂きました。ここでは、以下のエラーが出た場合の対応方法を紹介します。エラー内容は、ローカル宛の外向きのwebhookは禁止と言う事のようです。

![webhook_block.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/0112a6a0-55e5-0500-a801-28f8a09e4d1b.png)

GitLabのバージョンにより設定項目の所在が変わるようですが、現在のバージョン(12.2.0-ce.0)では、`Admin Area`->`Settings`->`Network`の下記項目にチェックを入れる事で、ローカル宛のwebhookが可能になるようです。

 - [x]  Allow requests to the local network from web hook and services

![webhook_setting.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/451049/7515203f-e0b9-48fc-cea1-ef9c099f07e0.png)

[link-webhook]:https://qiita.com/naka46/items/520ea99d8a5e647ed543


# 最後に
GitLab Mattermostの導入が完了しました。恒久的に利用するかどうかは、周りの反応次第です。受け入れてもらえるかわかりませんが、楽しみです。

会社で堂々とチャットがしたいwww（本音）

# ご参考
* [GitLab 「GitLab Mattermost」](https://docs.gitlab.com/omnibus/gitlab-mattermost/)
* [「GitLabとMattermostの連携」](https://qiita.com/naka46/items/520ea99d8a5e647ed543)