GMO NIKKOのS.Tです。
BacklogのイベントをSlackに送信する機会があったので紹介します。
流れとしては Backlogの課題の追加等のイベント発生 → Cloud Functions(GCP)で中継 → Slackに送信 のようにしました。
BacklogにWebhookが用意されているのでイベント発生時に指定URLへBacklogデータを送信してくれますが、 そのままでは使えないので加工する処理を入れる必要があります。
GCPのCloud Functionsがサーバーレスで簡単に用意でき、Webhookに最適なので使用しました。
Backlogの設定
詳細は公式にわかりやすい説明があるので省略しますが、私がつまずいた点だけ紹介します。
Webhook – Backlog ヘルプセンター
課題の追加等のイベント発生時の処理を設定するにはインテグレーションでWebhookを追加する必要がありますが、
一般ユーザーだとインテグレーションが表示されず選択できないので、管理者かそのプロジェクトの管理者になる必要がありました。
Webhookを追加すると下記のような入力欄が表示されるのでWebhook名と説明を適当に入力し
Webhook URLはこの後設定するCloud FunctionsのURLを設定します。
URLパラメーターにtoken=Slackアプリのアクセストークン、channel=送信先チャンネルをURLエンコードして設定します。
これは受信するGCPのコード次第なので渡し方は自由に決めて構いません。
1 |
Cloud FunctionsのURL?token=Slackアプリのアクセストークン&channel=送信先チャンネル |
URLはこのようになります。
さらに通知するイベントも設定します。公式に説明があるので詳細は省略しますが送信テストも用意されているので非常に便利ですね。
GCPの設定
①構成
トリガーのタイプをHTTPにするとURLが表示されるので、これを先ほどのBacklogのWebhook URLに設定してください。
関数名は適当にsendSlack、リージョンは東京にしました。他は特に設定は変えていません。
②コード
PHPでSlackにメッセージ送信ブログで作成したコードをそのまま使いたかったのでPHP7.4にしました。
Slackアプリもこのブログの内容の設定ができているのが前提となります。
エントリポイントはmainとしています。
この設定でデプロイしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php use Google\CloudFunctions\FunctionsFramework; use Psr\Http\Message\ServerRequestInterface; function main(ServerRequestInterface $request) { // 受信データの整合性チェック if ($request->getMethod() != 'POST') { return; } if (substr($request->getHeaderLine('content-type'), 0, 16) != 'application/json') { return; } $requestTarget = urldecode($request->getRequestTarget()); if (!preg_match('/(\?|&)token=(.+?)($|&)/', $requestTarget, $result)) { return; } $appToken = $result[2]; if (!preg_match('/(\?|&)channel=(.+?)($|&)/', $requestTarget, $result)) { return; } $channelId = $result[2]; // 送信 $body = json_decode($request->getBody()->getContents(), true); $message = '[summary]' . $body['content']['summary'] . "\r\n[createdUser]" . $body['createdUser']['name'] . "\r\n[base]" . $body['content']['base'] . "\r\n[branch]" . $body['content']['branch'] . "\r\n[created]" . $body['created']; $option = array( CURLOPT_URL => 'https://slack.com/api/chat.postMessage', CURLOPT_HTTPHEADER => array('Content-Type: application/x-www-form-urlencoded;charset=UTF-8'), CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query(array('text' => $message, 'token' => $appToken, 'channel' => $channelId, 'parse' => 'none')) ); $ch = curl_init(); curl_setopt_array($ch, $option); $result = json_decode(curl_exec($ch), true); print_r($result); curl_close($ch); } |
Backlogの公式の説明によると「Webhookでは、指定されたURLにデータをJSON形式でPOSTします。」とあるので始めに受信データをチェックしてそれ以外のデータは無視します。
getRequestTarget()で取得できるURLパラメーターからSlackアプリのアクセストークンと送信先チャンネルを取得しています。
JSON形式で受信したBacklogデータをメッセージとしてSlackに送信しています。
送信テスト
下記はプルリクエストの追加のテスト結果ですが、
設定した各イベント発生時に自動的に送信されるようになります。