概要
circleciの設定で、失敗/復旧時だけビルド結果をslackに通知することができる。程よい通知量になってとてもよいが、 デプロイ時の通知は毎回来て欲しい。
設定だけだと、両立させるのが難しそうだったので、Google Apps Scriptで動くAPIを書いた。
前提
- developブランチにpushするとstaging環境にデプロイ。masterブランチにpushすると本番環境にデプロイされるとする
- slackのapiトークンが必要
- Slack BotをGASでいい感じで書くためのライブラリを作ったのライブラリーを使用
コード
Circle CIのビルド結果をHubotで通知 を参考にGoogle Apps Script上で動くようにした。
GAS上で以下スクリプトをWebAPI公開する
スクリプトのプロパティ「token」にslackのAPIトークを設定
function postMessage(room, message) {
var prop = PropertiesService.getScriptProperties().getProperties();
//slackApp インスタンスの取得
var slackApp = SlackApp.create(prop.token);
var channels = slackApp.channelsList().channels;
var channelId = 0;
for(var i = 0; i < channels.length; i++) {
if(channels[i].name == room) {
channelId = channels[i].id;
break;
}
}
//投稿
slackApp.postMessage(channelId, message, {
username : "circleci"
});
}
function doPost(e) {
var room = e.parameter.room
var req = JSON.parse(e.postData.contents);
var status = req.payload.status;
var subject = req.payload.subject;
var build_url = req.payload.build_url;
var branch = req.payload.branch;
var reponame = req.payload.reponame;
var username = req.payload.username;
var deploy_branch = {"master":1,"develop":1};
var header = (status == 'failed')?':no_good:':':ok_hand:';
var message = [
[header,"[",status.toUpperCase(),"]", subject, "["+username+"/"+reponame+"#"+branch+"]"].join(" "),
build_url
].join('\n');
if(branch in deploy_branch) {
postMessage(room, message);
}else {
if(status == "failed" || status == "fixed") postMessage(room, message);
}
}
circle.ymlのwebhookに公開したAPIを指定する。
machine:
timezone:
Asia/Tokyo
ruby:
version: 2.2.3
dependencies:
cache_directories:
- "vendor/bundle"
override:
- bundle -j4 --path=vendor/bundle
test:
override:
- bundle exec rake test
deployment:
staging:
branch: develop
commands:
- sh script/deploy-staging.sh
production:
branch: master
commands:
- sh script/deploy-production.sh
notify:
webhooks:
- url: https://script.google.com/macros/s/{公開したAPIのID}/exec?room={部屋の名前}