💼

koを採用しているプロジェクトでCloud RunにCDする

2024/03/01に公開

これは何?

Dockerイメージのビルドにkoを採用しているプロジェクトで、Cloud Runに継続的デプロイ(CD)してみた記録です。

今回はPRがmainブランチにマージされた時、その修正が自動的にCloud Runにデプロイされるところまでやってみました。

読む前の想定状態

  • koの設定が完了済
  • サービスがCloud Runに手動デプロイ済

やってみる

Cloud Runへの継続的デプロイは、Cloud Buildでのビルドとデプロイの手順をyamlで記述し、それをCloud Build Trigger経由で実行させることで実現できます。

ビルド&デプロイのyamlでは、ステップごとに実行環境をDockerイメージで設定できます。
今回はkoでイメージビルドしたいので、gcloudコマンドとkoコマンドが使えるDockerイメージが欲しいですね。

また、Cloud Build Triggerに色々させるためのサービスアカウントが必要です。

まとめると

  • Cloud Build Trigger用のサービスアカウントの準備
  • Cloud Buildの実行環境用のイメージの準備(gcloudコマンドとkoコマンドが使えるもの)
  • Cloud Build Triggerの設定

をやっていく必要がありそうです。

Cloud Build Trigger用のサービスアカウントの準備

Cloud Build用のサービスアカウントを作成します。
ロールはCloud Build サービス アカウント Cloud Run 管理者 ログ書き込み をつけましょう。

また、あなたがCloud Runにデプロイしているサービスの実行用のサービスアカウントに、Cloud Build用のサービスアカウントをバインドする必要があります。

gcloud iam service-accounts add-iam-policy-binding <Cloud Runのサービスの実行用のサービスアカウント名> \
  --member='serviceAccount:<Cloud Build用のサービスアカウント名>' \
  --role=roles/iam.serviceAccountUser

これでデプロイ時に、このアカウントを実行用のサービスアカウントとして指定できるようになります。

Cloud Buildの実行環境用のイメージの準備

koコマンドが使えるCloud Build用のイメージは公式には無いようだったので、自分で用意する必要があります。

こんな感じのDockerイメージを用意して、Artifact Registryにプッシュしておきます。
(ここではasia-northeast1-docker.pkg.dev/arifact-registry/***/deployerというイメージ名でプッシュしたものとします)

FROM gcr.io/cloud-builders/gcloud

RUN apt update && \
    add-apt-repository ppa:longsleep/golang-backports && \
    apt update && \
    apt install -y golang-go
ENV GOBIN /root/go/bin
ENV PATH $PATH:$GOBIN
RUN go install github.com/google/ko@latest

内容としては、公式のgcloud用のイメージにgokoをインストールするだけです。
GOBINの設定と、GOBINPATHへの追加がポイントです。
(これをやっておかないとkoをインストールしてもcommand not foundとなって小ハマりしました...)

Cloud Build Triggerの設定

Cloud Build Triggerを新規作成し、構成はCloud Build 構成ファイル(yaml または json)を、ロケーションはリポジトリを選択します。

対象のリポジトリにcloudbuild.yamlを作ってください(リポジトリ内での置き場所はCloud Build 構成ファイルの場所で指定する場所に合わせてください)。中身はこんな感じ。

options:
  logging: CLOUD_LOGGING_ONLY
steps:
  # ↓ Cloud Buildの実行環境用のイメージの準備 で用意したもの
  - name: "asia-northeast1-docker.pkg.dev/arifact-registry/***/deployer" 
    env:
      - "KO_DOCKER_REPO=<your-app-arifact-registry-repository-name>"
    script: |
      gcloud run \
      deploy <サービス名> \
      --image $(SOURCE_DATE_EPOCH=$(date +%s) ko build ./) \
      --region asia-northeast1 \
      --service-account <Cloud Runのサービスの実行用のサービスアカウント名>
      <その他、cpuの設定、メモリの設定、認証の設定など、要件に合わせて適切に>

その他、トリガー名、イベントの設定、対象ブランチ等は、用途に合わせて適切に設定し、トリガーを保存します。

これで対象ブランチへのプッシュのたびにko build、およびイメージのデプロイが自動的に行われるようになりました。

動かしてみる

テスト用にHello world with koという文字列を返すサービスを作りました。
アクセスするとこんな感じで表示されます。

そして、こんな感じのMRを立ててマージします。

マージすると自動的にデプロイが走り始めました!

デプロイが終わると...

サービスが更新されました。素晴らしい👏

まとめ

  • koを使っているプロジェクトでCloud Runへの継続的デプロイをした
  • koが使える公式のイメージはないので、自分で作って管理する必要がある。ちょっとメンドウ
  • koはGoogleが作ったOSSなのだから、ぜひ公式のイメージを作って欲しいところ

動かしてみたサンプルはこちらにあります

Discussion