概要
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を取得します。
公開 -> ウェブアプリケーションとして導入 -> 更新
プロジェクトバージョンはNewを選択しないとコードの変更が反映されません。
GASの地味に勝手が悪い仕様なので注意。
Bitbucket
続いてBitbucketのWebhooksに先ほど取得したGASのURLを登録します。
設定 -> Webhooks -> Add webhook
結果
以上で準備が完了です。
実際にコミットしてみると・・・
無事、twistに投稿できました!
デバッグモードもきちんと動いています。
シート内でフラグのON,OFFができるので、ビルド(Newバージョンで公開)の必要がありません。
所感
リポジトリやブランチ名が取得できたので、投稿するスレッドを切り分けもできそう。
ハードコーディングではなくて、スプレッドシートでマッピングを設定できたら便利ですね。
ちょっとした小物を作るのにGASはとっても便利。今後も色々勉強していきたいと思います。