Docker Hub の Auto Build でイメージをビルドしたい。 ただし、latest タグは別ビルドにしたくない。
そこで、webhook で build 完了を検知して GitLab の pipeline から latest タグを push する。
CONTENTS
ENVIRONMENTS
- DockerHub webhook
- Node.js : 10.16.0
- GitLab trigger
- Slack
できあがったもの
DockerHub で webhook を設定する
前提として、対象のリポジトリに対して Auto Build の設定は完了済みである。
Docker Hub Webhooks : Docker Docs を参考にして webhook を設定する。 特に何か設定が必要な項目はなく、build 完了時に叩かれる URL を指定するだけ。
リクエストは以下のような json で post される。 (上記ドキュメントから転載)
{ "callback_url": "https://registry.hub.docker.com/u/svendowideit/testhook/hook/.../", "push_data": { "images": [ "..." ], "pushed_at": 1.417566161e+09, "pusher": "trustedbuilder", "tag": "latest" }, "repository": { "comment_count": 0, "date_created": 1.417494799e+09, "description": "", "dockerfile": "...", "full_description": "Docker Hub based automated build from a GitHub repo", "is_official": false, "is_private": true, "is_trusted": true, "name": "testhook", "namespace": "svendowideit", "owner": "svendowideit", "repo_name": "svendowideit/testhook", "repo_url": "https://registry.hub.docker.com/u/svendowideit/testhook/", "star_count": 0, "status": "Active" } }
これに応じて GitLab のトリガーを起動するようにする。
webhook で GitLab の pipeline をトリガーする
AWS Lambda に getto-systems/psycher-dockerhub をデプロイした。
GitLab の pipeline は、サイン済みイメージを push することが目的だ。 以下の手順で作業する。
- build されたイメージを pull
- Docker Content Trust-ed なイメージであれば push 済みなので何もしない
- build されたタグを Docker Hub にサイン済みで再 push
- 同じイメージを latest タグで push
こうすると、webhook からの post は以下のタイミングで行われる。
- 最初の build 完了
- サイン済みの push が行われた
- latest の push が行われた
このフローでは、最初の build 完了と、サイン済み push で pipeline をトリガーする。 latest の push では pipeline はトリガーしなくて良い。
サイン済みの push で pipeline をトリガーするのは、webhook の post body からは、サイン済みで push されたものかどうかの判断ができないため。
ビルド完了で Slack に通知する
ビルドが完了したことを Slack に通知したい。 GitLab の pipeline の目的はサイン済みイメージの push だが、webhook のデータからはこの完了が判断できない。
そこで、GitLab の pipeline で、Docker Hub に push したあと、getto-systems/psycher-getto を使用して Slack へ通知するようにした。
まとめ
Docker Hub の Auto Build から latest タグの push と、Slack への通知までのフローを組んでみた。