GitLabとRocket.Chatを連携させる

GitLabとRocket.Chatを連携させる。

## やりたいこと
* GitLabアカウントでRocket.Chatにログインする
* GitLabのイベントをRocket.Chatに表示する

## 環境
GitLab：8.4.4
Rocket.Chat：0.17.0

## 準備
GitLabとRocket.Chatを用意する。
以下の例ではDocker上に構築するが、そうでなくても勿論構わない。

[GitLab] (https://hub.docker.com/r/gitlab/gitlab-ce/)
運用時はちゃんと建てた方が良いが、ここでは簡単に。

```bash:GitLab
# docker run --name=gitlab -d -p 80:80 gitlab/gitlab-ce
```

[Rocket.Chat] (https://hub.docker.com/r/rocketchat/rocket.chat/)
こちらはdocker-composeを使うのが手っ取り早い。

```bash:Rocket.Chat
# curl -O https://raw.githubusercontent.com/RocketChat/Rocket.Chat/develop/docker-compose.yml
# docker-compose up -d
```


## GitLabアカウントでRocket.Chatにログインする
GitLab, Rocket.Chat共にOAuthが実装されている。

### Rocket.ChatにGitLabのURLを指定
Rocket.Chatにログインし、メニューから「管理」->「API」を開き「GitLab URL」にGitLabのURLを指定する（指定しなければgitlab.comに接続する）。
![ClipboardImage.png](https://qiita-image-store.s3.amazonaws.com/0/64309/95ad276a-a9bf-4f86-4951-9a7daac22faa.png)


### GitLabにアプリケーションを登録する

rootでログインし、メニューから「Applications」->「New Application」をクリック。
 ![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/aa2ec23f-6900-505d-10ff-5697743a9ab6.png)

アプリケーション名とRocket.ChatのコールバックURLを入力する。URLは http://[hostname][:port]/_oauth/gitlab 。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/49bec887-d268-837d-8aa6-c2b75691b13c.png)

Application ID と Secret が取得できる。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/e75f1049-119f-59ea-844a-f73f4a3d7ab9.png)
これをRocket.Chatに登録。

### Rocket.Chat に アプリケーションを登録する

Rocket.Chatのメニューから「監理」->「Accounts」->「Gitlab」を開く。
「OAuth Enabled」を True に、「Gitlab Id」「Clienet Secret」にGitLabで取得したものを設定する。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/d6c82a4a-f79f-b43d-2c32-739dddd39fc5.png)


### 完成
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/60d207c4-fea7-5d53-6cca-6699fe05aaca.png)

GitLabのアイコンをクリックすると...
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/61abd1ba-ce7e-af49-5b42-0b9165297ca5.png)

GitLabのログイン画面が表示され...
※ログイン済みであれば省略

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/d072c82b-15cc-1c94-20cd-d1a69658572e.png)

確認画面を経て...
※初回のみ

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/6011ef45-3704-9dd3-fd9e-f96d559b9588.png)

ログイン！！
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/c7865a16-66df-1634-7729-be66034ce7e7.png)


## GitLabのイベントをRocket.Chatに流す

これも双方でWebHookの仕組みが実装済みなので、設定するだけ。

### Rocket.ChatでWebHookを受け入れる

管理者でログインし、メニューから「管理」->「Integrations」を開き、「NEW INTEGRATION」をクリック。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/ff1c6f31-fc89-3e96-bfe3-f32c20db64d5.png)

リクエストを受け入れる方なので「Incoming WebHook」を選択。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/79c9f140-a992-c370-b3eb-62b12eb845b6.png)

名前とチャンネルを登録。チャンネルは事前に作成しておくこと。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/3d316719-5db4-3c82-8be7-236d737b736d.png)

登録してから再度Integrationを選択するとWebHookのURLが表示される。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/222edcd5-82a5-54f0-1ff8-1433f4b80f07.png)

つまり、このURLにJSONのリクエストを送ると「Post as」で指定したユーザーがしゃべる。実際にcurlでテストしてみると良いでしょう。

### GitLabでWebHookを設定する
Slack用の実装がそのまま使える。
連携させたいプロジェクトのメニューから「Settings」->「Services」で「Slack」を選択し、Aciveにする。
URLには前述のRocket.ChatのWeb Hook URL を指定し、Username, ChannelもRocket.Chatに合わせて指定。
Triggerはお好みで。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/c67fd969-e8a1-c7b1-5e29-153fba7f9429.png)


で、当該プロジェクトにアクションを起こすと...
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/d8c11538-4f5d-cab9-a9fe-1d22b8201c41.png)

しゃべった！！


## おわりに
今回はGitLabのSlack向けの実装をそのまま利用したが、RESTでJSONを喰わせればRocket.Chatはしゃべるので自作アプリでの利用も極めて容易である。
Rocket.Chatで結合設定をする際にJSONのサンプルが例示がされるので参考にすると良い。
![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/64309/ee298417-e976-4bcc-a11c-51623a6d27eb.png)


## 参考
https://github.com/RocketChat/Rocket.Chat/issues/861
OAuthがRocket.Chatに実装されているGitlabプロバイダで上手くいかない場合に。