koを採用しているプロジェクトでCloud RunにCDする
これは何?
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
用のイメージにgo
とko
をインストールするだけです。
GOBIN
の設定と、GOBIN
のPATH
への追加がポイントです。
(これをやっておかないと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