🎃

個人開発の Cloud Run を手間をかけずに Skaffold と Ko で GitHub Actions からデプロイする

2024/04/28に公開

目標

GitHub Actions から Cloud Run をデプロイする際に極力手間をかけずに Skaffold と Ko を使ってデプロイします。

概要

Cloud Run は Google Cloud 上でアプリケーションをホスティングする際に利用できるサーバレスなマネージドコンピューティングサービスです。
https://cloud.google.com/run
料金も安く、スケールなどの機能も充実しているため個人開発でもよく利用させていただいています。
しかし、デプロイフローを考え始めると意外と構成が複雑になったり、コードの記述量が増えてきます。
そこで今回は、極限まで楽をして Cloud Run にアプリケーションをデプロイすることを目標とします。

手順

Skaffold

Cloud Run へのデプロイは Skaffold を利用します。
https://skaffold.dev/

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 へのデプロイも対応しているのでこちらを利用します。
https://skaffold.dev/docs/deployers/cloudrun/

Skaffold の設定ファイルは以下のように設定します。
build フェーズは後述します。
manifests.rawYaml に Cloud Run が利用する yaml ファイルへのパスを記述します。

Cloud Run に利用する yaml ファイル
main.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
skaffold.yaml
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 を利用します。
https://ko.build/

https://skaffold.dev/docs/builders/builder-types/ko/

ko を利用することで Dockerfile を記述することなくアプリケーションコンテナをビルドすることができます。
build.artifacts[].ko に ko でビルドを行う設定を記述します。

skaffold.yaml
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 を通す必要があります。

actions.yaml
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