個人開発の Cloud Run を手間をかけずに Skaffold と Ko で GitHub Actions からデプロイする
目標
GitHub Actions から Cloud Run をデプロイする際に極力手間をかけずに Skaffold と Ko を使ってデプロイします。
概要
Cloud Run は Google Cloud 上でアプリケーションをホスティングする際に利用できるサーバレスなマネージドコンピューティングサービスです。
しかし、デプロイフローを考え始めると意外と構成が複雑になったり、コードの記述量が増えてきます。
そこで今回は、極限まで楽をして Cloud Run にアプリケーションをデプロイすることを目標とします。
手順
Skaffold
Cloud Run へのデプロイは Skaffold を利用します。
Skaffold は Kubernetes へのデプロイを行うための CI/CD ツールとして Google から発表されました。
Skaffold is a command line tool that facilitates continuous development for Kubernetes applications. You can iterate on your application source code locally then deploy to local or remote Kubernetes clusters. Skaffold handles the workflow for building, pushing and deploying your application. It also provides building blocks and describe customizations for a CI/CD pipeline.
この Skaffold が Cloud Run へのデプロイも対応しているのでこちらを利用します。
Skaffold の設定ファイルは以下のように設定します。
build
フェーズは後述します。
manifests.rawYaml
に Cloud Run が利用する yaml ファイルへのパスを記述します。
Cloud Run に利用する yaml ファイル
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
annotations:
run.googleapis.com/ingress: all
labels:
cloud.googleapis.com/location: asia-northeast1
name: xxx
namespace: xxx
spec:
template:
spec:
containers:
- image: xxx
ports:
- containerPort: 8080
name: http1
apiVersion: skaffold/v4beta10
kind: Config
build:
...
manifests:
rawYaml:
- main.yaml
deploy:
cloudrun:
projectid: xxx
region: asia-northeast1
deploy.cloudrun
を利用することで Skaffold で Cloud Run へデプロイを行えます。
Cloud Run へのデプロイは以下のコマンドを実行するだけです。
skaffold run
これだけで Cloud Run へのデプロイフローは完成しました。
次に、デプロイに利用するアプリケーションコンテナのビルドを行います。
ko
今回はビルドも極力を楽にしたいので Skaffold のビルドにも利用できる ko
を利用します。
ko を利用することで Dockerfile
を記述することなくアプリケーションコンテナをビルドすることができます。
build.artifacts[].ko
に ko でビルドを行う設定を記述します。
apiVersion: skaffold/v4beta10
kind: Config
build:
local:
push: true
platforms:
- linux/amd64 # amd64 向けにビルドします
artifacts:
- image: xxx # Cloud Run 用のマニフェストで指定した image と同じものを記述する
context: xxx # Go のコードへのパスを記述します
ko:
main: ./cmd # package main へのディレクトリを記述します
manifests:
rawYaml:
- main.yaml
deploy:
cloudrun:
projectid: xxx
region: asia-northeast1
以下のコマンドを実行することで、イメージのビルド & プッシュを行うだけも可能です。
skaffold build
GitHub Actions
上記の Skaffold / ko の仕組みを GitHub Actions で実行することで Cloud Run へのデプロイを行うことができます。
skaffold
は実行バイナリがないので手動でインストールを行い PATH を通す必要があります。
name: backend
permissions:
contents: read
id-token: write
on:
push:
branches:
- main
paths:
- backend/**
jobs:
build_deploy:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Install skaffold
run: |
curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64
chmod +x skaffold
echo $PWD >> $GITHUB_PATH
- name: Push image
run: |
gcloud auth configure-docker asia-northeast1-docker.pkg.dev
skaffold run
まとめ
今回は GitHub Actions から Google Cloud への認証などは省いていますが、 2 つのファイル ( Skaffold / Cloud Run マニフェスト ) を記述するだけで Cloud Run を構築し、デプロイフローまで組むことができました。
Discussion