Cloud Buildを使ってCloud Runの継続的デプロイ環境を作成する

こんにちはかみむらです。以前こんな記事を書きました。

code-log.hatenablog.com

この記事では手動でCloud Runにデプロイしてました。しかし、実際に運用していく場合はCIを使ったテストやデプロイの自動化が必須になってきます。そこで今回はGCPのサービスの一つであるCloud Buildを使って、コンテナイメージのビルドとデプロイの自動化をしていきます。

ベースとなるプロジェクトは、以前の記事で使ったリポジトリを使用します。こちらからcloneしてください。

github.com

前提

Cloud SDKがインストールされている

もしMacを使ってる場合は、こちらの記事も参照してください。
code-log.hatenablog.com

APIの有効化

GCPダッシュボードからAPIとサービス > ライブラリから検索できます。下の3つのAPIを有効化します。

  • Cloud Run API
  • Container Registry API
  • Resource Manager API
ドキュメント

Cloud Runのドキュメント
cloud.google.com

Cloud Buildのドキュメント
cloud.google.com

Cloud Buildの設定ファイルを追加

まずはCloud Buildの設定ファイルを作成します。こちらがファイルの全体像です。いくつか重要なところにコメントアウトしたので、見ていきましょう。

cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/yarn'
  args: ['install']

#Build image
- name: 'gcr.io/cloud-builders/docker'
  dir: .
  args: [
         'build',
         '-t', 'gcr.io/$PROJECT_ID/${_IMAGE_NAME}:${_TAG}',
         '.'
        ]

#Push image
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", 'gcr.io/$PROJECT_ID/${_IMAGE_NAME}']

#Deploy image
- name: 'gcr.io/cloud-builders/gcloud'
  id: 'deploy-cloud-run'
  args: ['beta', 'run', 'deploy', '${_SERVICE_NAME}', '--image', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}', '--region', '${_REGION}','--platform', 'managed','--allow-unauthenticated']
  
substitutions:
  _REGION: us-central1
  _SERVICE_NAME: node-image 
  _IMAGE_NAME: node-image 
  _TAG: latest
コンテナイメージのビルド
#Build image
- name: 'gcr.io/cloud-builders/docker'
  dir: .
  args: [
         'build',
         '-t', 'gcr.io/$PROJECT_ID/${_IMAGE_NAME}:${_TAG}',
         '.'
        ]

コンテナイメージは-tフラグを付けることで、名前付きでビルドができます。これは下記のコマンドと同じになります。$PROJECT_IDはデフォルトで、プロジェクトIDが置換されます。

$ docker build -t gcr.io/$PROJECT_ID/node-image:latest
コンテナイメージの登録

ビルドしたコンテナイメージをContainer Registryに登録します。

#Push image
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", 'gcr.io/$PROJECT_ID/${_IMAGE_NAME}']
コンテナイメージのデプロイ

そして、Cloud Runにコンテナイメージをデプロイします。

#Deploy image
- name: 'gcr.io/cloud-builders/gcloud'
  id: 'deploy-cloud-run'
  args: ['beta', 'run', 'deploy', '${_SERVICE_NAME}', '--image', 'gcr.io/$PROJECT_ID/${_SERVICE_NAME}', '--region', '${_REGION}','--platform', 'managed','--allow-unauthenticated']
substitutionsの登録

substitutionsで特定の変数を置換することができます。例えば、substitutionsで定義した_REGION${_REGION}として扱うことができます。変数値はアンダースコアで始まり、大文字と数字のみを使用できます。

substitutions:
  _REGION: us-central1
  _SERVICE_NAME: node-image 
  _IMAGE_NAME: node-image 
  _TAG: latest

ここまでcloudbuild.yamlの内容を見てきましたが、実際にやってることは非常に単純です。次にCloud Buildでデプロイするための権限設定を行います。

権限設定

Cloud Runへデプロイするためには権限を設定する必要があります。GCP
ダッシュボードからCloud Build > 設定のページにいきます。そして、Cloud Runを有効にします。

ここではすべてのサービスアカウントにアクセス権を付与します。しかし、すべてのアカウントに権限を与えるのはあまりよくありません。実際にはIAMを使って、権限を振り分けます。IAMについては下記のリンクを参照してください。

f:id:kamimura-dev:20191217151622p:plain

cloud.google.com

Cloud Buildでデプロイ

これでデプロイするための準備ができました。gcloudで下記のコマンドを実行します。

$ gcloud builds submit --config cloudbuild.yaml

ビルドに成功した後、GCPダッシュボードからCloud Runのページを見てみると、無事デプロイに成功してることが確認できます。

f:id:kamimura-dev:20191216184251p:plain

GitHubとの連携

最後にGitHubと連携していきます。まずは今回作成したプロジェクトをGitHubにプッシュしてください。

そして、GCPダッシュボードからCloud Buildのページに移動して、リポジトリを接続をクリックします。

f:id:kamimura-dev:20191216204317p:plain

GitHubを選択後、GitHubリポジトリを編集から今回プッシュしたリポジトリを選択してください。そしてリポジトリを接続をクリックします。

f:id:kamimura-dev:20191216204547p:plain

そして、pushトリガーを作成をクリックします。

f:id:kamimura-dev:20191216204706p:plain

トリガーを作成することができました。実際にトリガーを実行をクリックして実行してみましょう。

f:id:kamimura-dev:20191216204828p:plain

これでGitHubと連携ができました。現在の設定では、いずれかのブランチにプッシュするとCloud Buildが開始して、最新のコンテナイメージをCloud Runにデプロイすることができます。