LoginSignup
6
5

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-09-26

概要

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) {
  let post_data       = JSON.parse(e.postData.contents);
  let push            = post_data.push.changes[0];
  let repository_name = post_data.repository.name;
  let branch_name     = push['new']['name'];
  let user            = push['new']['target']['author']['user']['display_name'];
  let url             = push['new']['target']['links']['html']['href'];
  let message         = push['new']['target']['message'];

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

  // シートにログに吐き出し
  let spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  let sheet       = spreadsheet.getActiveSheet();
  let 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) {
  let url = "https://api.twist.com/api/v3/comments/add";
  let apiKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
  let idAdmin = true;
  let recipients = [];
  
  let headers = {
    "Authorization": apiKey,
    "Accept": "application/json",
    "Content-type": "application/json"
  };
  
  let payload = {
    "thread_id":thread_id,
    "send_as_integration":idAdmin,
    "recipients":recipients,
    "content":content
  };
  
  let options = {
    "method": "post",
    "payload": JSON.stringify(payload),
    "headers": headers
  };  
  
  let response = UrlFetchApp.fetch(url, options);
}

コードを書いたら以下の手順でURLを取得します。
公開 -> ウェブアプリケーションとして導入 -> 更新
gas1.png
プロジェクトバージョンはNewを選択しないとコードの変更が反映されません。
GASの地味に勝手が悪い仕様なので注意。
gas2.png

Bitbucket

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

結果

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

無事、twistに投稿できました!
twist.png
デバッグモードもきちんと動いています。
シート内でフラグのON,OFFができるので、ビルド(Newバージョンで公開)の必要がありません。
debug_mode.png

所感

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

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

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5