DockerhubではDockerイメージの自動ビルドとそこからWebhook機能でPOSTリクエストを送信することができます。
しかしjsonの型が違うので、そのリクエストを直にSlackに送信することはできません。
Dockerイメージのビルドが完了したことをSlackに通知するために色々試行錯誤していましたが、結局Google Cloud Functions
(もしくはAWS Lambdaなどそれに準ずるもの)を使うのが一番手軽だという結論になりました。
GitHubに変更をプッシュしたら通知を待つだけなので結構便利ですが、あまりやっている人がいないように感じたので紹介したいと思います。
設定方法
Slack Incoming Webhook
- Incoming Webhooksを自分のSlackチームに登録します
-
Webhook
を1つ作成します。- 設定はすべてデフォルトでOKです。ユーザ名やアイコンも後に作成するリクエストに含めることができます。チャンネルだけ好きなものを設定しましょう。
Google Cloud Functions
- Cloud Functionsのページにアクセス
-
Function
を作成する - 以下のプロパティを入力
- Trigger: HTTP trigger
- Source code: 下記コード(先程作成した
Webhook
のURLを記述してください) - Function to execute: sendToSlack
- index.js
var request = require('request');
exports.sendToSlack = function sendToSlack(req, res) {
var slack_endpoint = "<WebhookのURL>";
var repo_name = req.body.repository.repo_name;
var pusher = req.body.push_data.pusher;
var desc = "New image was pushed to " + repo_name + " by " + pusher;
var repo_url = req.body.repository.repo_url;
var text = desc + "\n" + repo_url;
var username = "dockerhub";
var icon_emoji = ":whale:";
var post_data = {
"text": text,
"username": username,
"icon_emoji": icon_emoji
};
var options = {
uri: slack_endpoint,
form: JSON.stringify(post_data)
}
request.post(options, function (error, response, body) {
console.log(body)
if (!error && response.statusCode == 200) {
res.status(200).send('Success');
} else {
res.status(response.statusCode).send('Fail')
}
}
);
};
- package.json
{
"name": "sample-http",
"version": "0.0.1",
"dependencies": {
"request": "2.83.0"
}
}
Dockerhub
- Dockerhubページの
Build Settings
より、自動ビルドの設定を実施する -
Webhooks
より、先程作成したFunction
のURLを登録する
使い方
ただ変更をプッシュするだけです。
通知が来るのを待ちましょう。
ちなみに上記のコード通りに設定すると以下のようなメッセージがSlackに送信されます。
アイコンはとりあえずクジラの絵文字を使っていますが、もっとDocker
っぽいものにできるような気がします。
興味のある方は設定を変更してもっと格好よくしてみてください。
Google Cloud Fucntions
についてももっと面白い使い方があると思うので模索して見たいと思います。