Kekeの日記

エンジニア、読書なんでも

Cloud Pub/SubでCloud Buildのビルド通知を受け取ってCloud Functionsをトリガーする

f:id:bobchan1915:20181005060103p:plain

本記事

本記事はCloud Buildのビルド通知をCloud Pub/Subに送ってCloud Functionsをトリガーするというタイトルで、実際のCIの現場で、Buildのビルド後として関数を走らせたいと思います。

目的

Cloud Buildによってビルドが走ると、何かしら処理をしたいときがあります。

もともとCloud BuildはビルドごとにCloud Pub/Subにメッセージが送信されるように設定できるので、それを利用してCloud Functionsを使っていこうかなと思います。

アーキテクチャ

f:id:bobchan1915:20181005011101p:plain

流れ

GCP上でのアーキテクチャの流れを簡略化すると以下の通りです。

f:id:bobchan1915:20181005060103p:plain

必要性

Cloud BuildのビルドリクエストにBash Shellなどを用いて軽量なステップ(例えばWebhookに送信)するなどできますがビルドの結果などは受け取れません。なのでCloud BuildとCloud Pub/Subを使ってCloud Functionsを使う必要があります。

本題

前提

Githubなど、何かしらのプロバイダからトリガーを発火してコンテナイメージが使えるような状態であることを前提とします。

また、今回はCloud Pub/SubのPush式を使って構築します。

設定方法の一例を以下の記事にしています。

www.1915keke.com

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が取得できてます。

f:id:bobchan1915:20181005010300p:plain

また、メッセージ本体は以下のようになっています。

"{ 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と連携したので便利になりました。

f:id:bobchan1915:20181005183006j:plain

参考文献

Sending Build Notifications  |  Cloud Build  |  Google Cloud