🔧

Cloud BuildでgoのbuildをしてArtifact Registryにpushする

2024/02/24に公開

前回触れていなかったcloudbuild.yamlのことをまとめていきます

前回の記事はこちらになるのでもしよければ見てください!
https://zenn.dev/wataru777/articles/c9aa1c09bf51b4

やりたいこと

Cloud Buildを使ってGoのアプリケーションをbuildし、ImageをArtifact Registryにアップロードする

なので以下のファイルを作成します

  • Dockerfile
  • cloudbuild.yaml

Dockerfileの作成

Dockerfileは特に工夫せずGCPのサンプルから取ってきました
マルチステージビルドを使ってイメージサイズを下げています

FROM golang:1.21-alpine as builder

WORKDIR /app

COPY go.* ./
RUN go mod download

COPY . ./

RUN CGO_ENABLED=0 go build -v -o server

EXPOSE 8080

FROM debian:buster-slim
RUN set -x && apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \
    ca-certificates && \
    rm -rf /var/lib/apt/lists/*


COPY --from=builder /app/server /app/server
EXPOSE 8080

CMD ["/app/server"]

builderはビルド用のステージです
go関連のファイルをコピーしてgo mod downloadを行い、go.modファイルに記載されたすべてのモジュールをダウンロードします

CGO_ENABLED=0を指定しないとエラーが出るので指定しておきます
詳しくは以下の記事に書いてありそうです
https://alpha3166.github.io/blog/20230430.html

cloudbuild.yamlの作成

こちらも最小限

steps:
  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t',
         '$_GCR_HOSTNAME/$PROJECT_ID/$_SERVICE_NAME/image:$SHORT_SHA', '.']

  - name: 'gcr.io/cloud-builders/docker'
    args: ['push', '$_GCR_HOSTNAME/$PROJECT_ID/$_SERVICE_NAME/image:$SHORT_SHA']

  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['run', 'deploy', '$_SERVICE_NAME',
           '--image=$_GCR_HOSTNAME/$PROJECT_ID/$_SERVICE_NAME/image:$SHORT_SHA',
           '--region', '$_DEPLOY_REGION', '--platform', 'managed']

images:
  - $_GCR_HOSTNAME/$PROJECT_ID/$_SERVICE_NAME/image:$SHORT_SHA

substitutions:
  _GCR_HOSTNAME: hostname
  _DEPLOY_REGION: region-name
  _SERVICE_NAME: service-name

1つめのステップ: dockerイメージのbuild
2つめのステップ: Artifact Registryにpush
3つめのステップ: Cloud Runにデプロイ

まとめ

最小限の構成で今回はまとめましたが、アプリケーションの機能を実装していくうちにここからDockerfileだったりcloudbuild.yamlを書き足していくのかなとなんとなく思ってます

とはいえ今のところこれだけで回っているのでまた修正するタイミングがあれば勉強し直そうかと思います!

Discussion