GitLabの通知をWebhookでDiscordに送信する

# はじめに
[Discord](https://discordapp.com/)はGitHubからのWebhookには対応していますが、GitLabからのWebhookには対応していません。
そこで、[Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法](https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3)を参考に、GitLabからのWebhookをGoogle Spread Sheetでいったん受け取り、Discordに対応した形に整形してからPOSTする、ということをやってみました。

# できたこと
GitLabの`Job events`をトリガーにこんな感じでDiscordにメッセージを送信できました。ここでは、とりあえずジョブの名前とステータスだけ表示させていますが、もちろん他の情報も表示させることはできます。

![スクリーンショット 2018-03-19 22.34.00.png](https://qiita-image-store.s3.amazonaws.com/0/222294/2f3e2781-d154-b69a-4aec-8f2ec2ac7a00.png)


# 中継サーバとなるGoogle Spread Sheetを準備する

ここの内容はほとんど[Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法](https://qiita.com/kunichiko/items/7f64c7c80b44b15371a3)にあるとおりです。詳しくはこちらの記事をご参照ください。

## Google Spread Sheetに空のシートを作る

http://spreadsheet.google.com にアクセスして空のシートを作ってください。

## スクリプトエディタを開く

「ツール」-「スクリプト エディタ」を選んでスクリプトエディタを開いてください。

<img width="841" alt="スクリーンショット 2018-03-19 22.46.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/1f3635f0-4494-ab3d-3731-9d7773c2f9c5.png">


## doPost()関数の用意

以下のようにスクリプトを記述します。

```java:コード.gs
function doPost(e) {
  if (e == null || e.postData == null || e.postData.contents == null) {
    return;
  }
  var requestJSON = e.postData.contents;
  var requestObj = JSON.parse(requestJSON);
  
  date = new Date();
  mimeType = e.type;
  
  var payload = {
    "content": "```\n" + "name: " + requestObj["build_name"] + "\n" + "status: " + requestObj["build_status"] + "```"
  };
  
  var options = {
    "method": "post",
    "contentType": "application/json",
    "payload": JSON.stringify(payload)
  };
  var url = "DsicordのWebhook　URL"
  UrlFetchApp.fetch(url, options);
}
```

`var url = "DsicordのWebhook　URL"`のところはあとで説明します。

他のイベントやRequest bodyに関する情報は[GitLabの公式ページ](https://docs.gitlab.com/ce/user/project/integrations/webhooks.html#events)よりご確認ください。
`object_kind`に応じて場合分けすれば、`Job Events`以外のイベントをトリガーにできるかと思います。
また、Discordに送信したい内容に応じて、`payload`の`content`を加工してください。

[Discord側の仕様](https://discordapp.com/developers/docs/resources/webhook#execute-webhook)としては、とりあえず`content`内にメッセージを突っ込んでおけばよさそうです。

## Webアプリとして公開

「公開」メニューから「Webアプリケーションとして導入...」を選んでください。

<img width="1207" alt="スクリーンショット 2018-03-19 22.58.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/2e27f29b-a8d3-1d3a-4cb3-d07b10e148f3.png">


すると以下のようなダイアログが出てきます。

<img width="425" alt="スクリーンショット 2018-03-19 23.00.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/0f15ebd9-b0cf-9059-c7c5-46404fe4c87c.png">

* 変更内容の説明は適当に
* アプリケーションにアクセスできるユーザーは**全員（匿名ユーザーを含む）**に

変更して導入をクリックしてください。
成功すると、作成したWebアプリのURLが表示されます。

<img width="435" alt="スクリーンショット 2018-03-19 23.02.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/222294/607df19a-72bb-8ac2-23f0-4b87e514a6f3.png">

# GitLabのWebhook設定

「Settings」-「Integrations」からWebhookの設定をします。

![スクリーンショット 2018-03-19 23.09.08.png](https://qiita-image-store.s3.amazonaws.com/0/222294/6e406be9-a781-8706-aa47-75cd0b7ccbe1.png)

* URLを先ほど表示されたURLに
* Triggerを、トリガーにしたいイベント（今回は`Job events`のみ）に

設定してAdd webhookをクリックしてください。

# DiscordのWebhook設定

「サーバー設定」-「Webhooks」からWebhookの設定をします。
![スクリーンショット 2018-03-13 22.15.56.png](https://qiita-image-store.s3.amazonaws.com/0/222294/2be85325-82cf-a415-6801-fe25849065c0.png)

Webhookを作成をクリックして、以下のとおりオプション設定をしてください。

![スクリーンショット 2018-03-19 23.19.30.png](https://qiita-image-store.s3.amazonaws.com/0/222294/a4abfca0-3ba9-3c25-43ac-87fdad390c08.png)


* チャンネル：メッセージを投稿するチャンネルの選択
* 名前：メッセージを投稿する際のユーザ名
* WEBHOOK ICON：メッセージを投稿する際のユーザのアバターの編集

順番が前後してしまいますが、WEBHOOK URLを上で作ったスクリプトの`var url = "DsicordのWebhook URL"`のところにペーストしてください。

# おわりに

以上でGitLabのJobが走ればDiscordに通知されると思います。
GitLabのWebhookの設定ページからテスト送信ができるので確認してみてください。

GitlabのWebhookを中継してDiscordに送信したいなとは思っていましたが、肝心の中継サーバーをどうするか考えていたらちょうどいいタイミングですばらしい記事を見つけることができました。
それにしてもGoogle Spread Sheetすごいですね。。。