Cloud Pub/SubでCloud Buildのビルド通知を受け取ってCloud Functionsをトリガーする
本記事
本記事はCloud Buildのビルド通知をCloud Pub/Subに送ってCloud Functionsをトリガーするというタイトルで、実際のCIの現場で、Buildのビルド後として関数を走らせたいと思います。
目的
Cloud Buildによってビルドが走ると、何かしら処理をしたいときがあります。
もともとCloud BuildはビルドごとにCloud Pub/Subにメッセージが送信されるように設定できるので、それを利用してCloud Functionsを使っていこうかなと思います。
アーキテクチャ
流れ
GCP上でのアーキテクチャの流れを簡略化すると以下の通りです。
必要性
Cloud BuildのビルドリクエストにBash Shellなどを用いて軽量なステップ(例えばWebhookに送信)するなどできますがビルドの結果などは受け取れません。なのでCloud BuildとCloud Pub/Subを使ってCloud Functionsを使う必要があります。
本題
前提
Githubなど、何かしらのプロバイダからトリガーを発火してコンテナイメージが使えるような状態であることを前提とします。
また、今回はCloud Pub/SubのPush式を使って構築します。
設定方法の一例を以下の記事にしています。
Cloud Pub/Subビルドの更新通知の登録方法
Cloud Pub/Subでcloud-builds
の名前のトピックを作成します。
Cloud Functionsのデプロイ
以下のようなコマンドでトピックをイベントとしたCloud Functionsをデプロイします。
gcloud beta functions deploy TestPubSub --trigger-resource cloud-builds --trigger-event google.pubsub.topic.publish
これで準備完了です。
Cloud Buildを手動ビルドする
以下のコマンドで手動ビルドします。
トリガーとして設定されてあるので特に何かを指定する必要はありません。
gcloud builds submit --config=cloudbuild.yaml
するとCloud Loggingにて以下のように確認できました。Build ID
が取得できてます。
また、メッセージ本体は以下のようになっています。
"{ id: '7946b3dc-a35b-484f-b870-bd68eb2c5daf', projectId: 'hogehoge', status: 'SUCCESS', source: { repoSource: { projectId: 'hogehoge', repoName: 'github-keisukeyamashita-test-cloud-build', branchName: 'master' } }, steps: [ { name: 'gcr.io/cloud-builders/docker', args: [Object], timing: [Object], pullTiming: [Object], status: 'SUCCESS' } ], results: { images: [ [Object], [Object] ], buildStepImages: [ 'sha256:1488cb1aa30e7b7216ef04ea1d385b50958c857cb1e497b19fbe29dc61a42cc7' ], buildStepOutputs: [] }, createTime: '2018-10-21T08:20:28.468858362Z', startTime: '2018-10-21T08:20:29.274963967Z', finishTime: '2018-10-21T08:20:44.663421Z', timeout: '600s', images: [ 'asia.gcr.io/hogehoge/test-cloud-build-project-1:latest' ], artifacts: { images: [ 'asia.gcr.io/hogehoge/test-cloud-build-project-1:latest' ] }, logsBucket: 'gs://hogehoge.cloudbuild-logs.googleusercontent.com', sourceProvenance: { resolvedRepoSource: { projectId: 'hogehoge', repoName: 'github-keisukeyamashita-test-cloud-build', commitSha: '4ab87620740eb7dead25fe6ea08e96449d7870bb' } }, buildTriggerId: '7d313df8-593a-4805-91f8-f1b47abc6ce1', options: { substitutionOption: 'ALLOW_LOOSE', logging: 'LEGACY' }, logUrl: 'https://console.cloud.google.com/gcr/builds/7946b3dc-a35b-484f-b870-bd68eb2c5daf?project=1078175040609', tags: [ 'event-489248c2-0d95-4362-89bc-7e97ce652fee', 'trigger-7d313df8-593a-4805-91f8-f1b47abc6ce1' ], timing: { BUILD: { startTime: '2018-10-21T08:20:33.994204547Z', endTime: '2018-10-21T08:20:35.093418971Z' }, FETCHSOURCE: { startTime: '2018-10-21T08:20:30.851412855Z', endTime: '2018-10-21T08:20:33.900611726Z' }, PUSH: { startTime: '2018-10-21T08:20:35.093454589Z', endTime: '2018-10-21T08:20:44.152165913Z' } } }"
まとめ
これを設定すれば、ビルドに対してフィードバックを送ることができるのでかなり便利だと思います。
以下のようにLine Botと連携したので便利になりました。