🐈

Cloud Run自動デプロイ簡単ガイド

2023/07/07に公開

Cloud Run 自動デプロイ

Flow

Githubのブランチにプッシュされると、イメージをビルドしてArtifact Registryに登録し、Cloud Runにデプロイします

Sample

Dockerfile,cloudbuild.yamlをリポジトリのルートディレクトリに配置します。

Dockerfile
# syntax=docker/dockerfile:1

##
## Build
##
FROM golang:1.16-buster AS build

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY *.go ./

RUN go build -o /docker-gs-ping

##
## Deploy
##
FROM gcr.io/distroless/base-debian10

WORKDIR /

COPY --from=build /docker-gs-ping /docker-gs-ping

EXPOSE 8080

USER nonroot:nonroot

ENTRYPOINT ["/docker-gs-ping"]
cloudbuild.yaml
steps:
 # Build the container image
 - name: 'gcr.io/cloud-builders/docker'
   args: ['build', '-t', '${_IMAGE_NAME}:$COMMIT_SHA', '.']
 # Push the container image to Container Registry
 - name: 'gcr.io/cloud-builders/docker'
   args: ['push', '${_IMAGE_NAME}:$COMMIT_SHA']
 # Deploy container image to Cloud Run
 - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
   entrypoint: gcloud
   args:
   - 'run'
   - 'deploy'
   - '${_SERVICE_NAME}'
   - '--image'
   - '${_IMAGE_NAME}:$COMMIT_SHA' 
   - '--set-cloudsql-instances' # CloudSQLProxyを使用しない場合は不要
   - ${_CLOUDSQL_NAME} # CloudSQLProxyを使用しない場合は不要
   - '--region'
   - '${_REGION}'
   - '--allow-unauthenticated'
   - '--set-env-vars' # プログラム内で使用する環境変数を設定
   - 'a=b'
 # トリガーで設定した代入変数
 substitutions:
   _CLOUDSQL_NAME: ${_CLOUDSQL_NAME} # CloudSQLProxyを使用しない場合は不要
   _IMAGE_NAME: ${_IMAGE_NAME} # Buildするイメージの名前
   _SERVICE_NAME: ${_SERVICE_NAME} # CloudRunのサービス名
   _REGION: ${_REGION} # リージョン
 images:
 - '${_IMAGE_NAME}:$COMMIT_SHA'

CloudBuildのトリガーを作成

  1. 名前
  2. リージョン
  3. イベント
  4. リポジトリ
  5. ブランチ
  6. 代入変数
変数名 意味
_CLOUDSQL_NAME CloudSQLの接続名 myproject:us-central1:myinstance
_IMAGE_NAME Artifact Registryに登録するイメージの名前(URL) us-central1-docker.pkg.dev/my-project/my-repo/my-app
_SERVICE_NAME Cloud Runのサービス名 my-service
_REGION リージョン us-central1

キャッシュされた Docker イメージの使用

https://cloud.google.com/build/docs/optimize-builds/speeding-up-builds?hl=ja#using_a_cached_docker_image

一度目

cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
  args: [
            'build',
            '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
            '.'
        ]
images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']

二度目

cloudbuild.yaml
steps:
+ - name: 'gcr.io/cloud-builders/docker'
+  entrypoint: 'bash'
+  args: ['-c', 'docker pull gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest || exit 0']
 - name: 'gcr.io/cloud-builders/docker'
  args: [
            'build',
            '-t', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
+            '--cache-from', 'gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest',
            '.'
        ]
images: ['gcr.io/$PROJECT_ID/[IMAGE_NAME]:latest']

Discussion