BitbucketのwebhookをGASで取得してチャットツールに投稿する


概要

SlackだとBitbucketのあれこれを通知してくれる便利な拡張機能があるそうですが、
Twistにはそういった拡張機能が無いようなので自作してみました。

webhookの受け口はサーバーレスで費用のかからないGASで実装することに。
このようなイメージです。
Bitbucket -> webhook -> GAS -> twistAPI

※ Bitbucketのwebhook取得について、LIGさんのこちらの記事を参考にさせていただきました。
Bitbucketにpushしたらチャットワークに通知できるようにしてみよう

GAS (Google Apps Script)

まずは受け口のGASを構築。
doPost()という名前で関数を作っておくことでPOSTを受け付けた際に実行されるようです。
せっかくGASで実装しているのでスプレッドシートと連携して簡易的なログ吐き出しもしてみました。

function doPost(e) {
  var post_data       = JSON.parse(e.postData.contents);
  var push            = post_data.push.changes[0];
  var repository_name = post_data.repository.name;
  var branch_name     = push['new']['name'];
  var user            = push['new']['target']['author']['user']['display_name'];
  var url             = push['new']['target']['links']['html']['href'];
  var message         = push['new']['target']['message'];

  // 取得した内容を元に各種WEBサービスへ送信
  // 今回はtwistのスレッドに投稿
  var content = url + "\n" + user + " " + message.replace("\n\n","\n");
  addCommentToTwist(9999,content);

  // シートにログに吐き出し
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet       = spreadsheet.getActiveSheet();
  var debug_flg   = sheet.getRange(1,2).getValue();
  if(debug_flg == 1){
      sheet.appendRow([repository_name,branch_name,post_data,push]);
  }
}
// twistに投稿する関数
function addCommentToTwist(thread_id,content) {
  var url = "https://api.twist.com/api/v3/comments/add";
  var apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  var idAdmin = true;
  var recipients = [];

  var headers = {
    "Authorization": apiKey,
    "Accept": "application/json",
    "Content-type": "application/json"
  };

  var payload = {
    "thread_id":thread_id,
    "send_as_integration":idAdmin,
    "recipients":recipients,
    "content":content
  };

  var options = {
    "method": "post",
    "payload": JSON.stringify(payload),
    "headers": headers
  };  

  var response = UrlFetchApp.fetch(url, options);
}

コードを書いたら以下の手順でURLを取得します。
公開 -> ウェブアプリケーションとして導入 -> 更新

プロジェクトバージョンはNewを選択しないとコードの変更が反映されません。
GASの地味に勝手が悪い仕様なので注意。

Bitbucket

続いてBitbucketのWebhooksに先ほど取得したGASのURLを登録します。
設定 -> Webhooks -> Add webhook

結果

以上で準備が完了です。
実際にコミットしてみると・・・

無事、twistに投稿できました!

デバッグモードもきちんと動いています。
シート内でフラグのON,OFFができるので、ビルド(Newバージョンで公開)の必要がありません。

所感

リポジトリやブランチ名が取得できたので、投稿するスレッドを切り分けもできそう。
ハードコーディングではなくて、スプレッドシートでマッピングを設定できたら便利ですね。

ちょっとした小物を作るのにGASはとっても便利。今後も色々勉強していきたいと思います。