Github Actions で自作コンテナを CloudRun にデプロイ

概要

前回 GCR 上にホストされているイメージを CloudRun へデプロイした。

今回は自作コンテナをデプロイする。

チュートリアル

Github 用サービスアカウント作成

ワークロード ID フェデレーションが推奨されているが、今回はサービスアカウントで。

IAM -> サービスアカウントの作成より、以下の Role で作成。

  • Cloud Run 管理者
  • Cloud Run サービスエージェント
  • ストレージ管理者

作成したサービスアカウントを選択 -> キー -> 鍵を追加 -> JSON を選択し、ダウンロードしておく。 後で Github Secrets に登録する。

Github リモートリポジトリ作成

以降はローカルの作業スペースで操作していく。

mkdir test_gha_docker
cd test_gha_docker

Github にリポジトリを作成し、以下までやっておく。

echo "# cloudrun-github-actions" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/runble1/test_gha_docker.git
git push -u origin main

Go アプリ作成

GCP 公式の Go サンプルを利用する。

vi main.go
  • http サーバが起動
  • “Hello World” が返却
package main

import (
	"fmt"
	"log"
	"net/http"
	"os"
)

func main() {
	log.Print("starting server...")
	http.HandleFunc("/", handler)

	// Determine port for HTTP service.
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("defaulting to port %s", port)
	}

	// Start HTTP server.
	log.Printf("listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

func handler(w http.ResponseWriter, r *http.Request) {
	name := os.Getenv("NAME")
	if name == "" {
		name = "World"
	}
	fmt.Fprintf(w, "Hello %s!\n", name)
}

Dockerfile 作成

GCP 公式 の Dockerfile を利用する。

vi Dockerfile
FROM golang:1.17-buster as builder

# Create and change to the app directory.
WORKDIR /app

# Retrieve application dependencies.
# This allows the container build to reuse cached dependencies.
# Expecting to copy go.mod and if present go.sum.
COPY go.* ./
RUN go mod download

# Copy local code to the container image.
COPY . ./

# Build the binary.
RUN go build -v -o server

# Use the official Debian slim image for a lean production container.
# https://hub.docker.com/_/debian
# https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds
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 the binary to the production image from the builder stage.
COPY --from=builder /app/server /app/server

# Run the web service on container startup.
CMD ["/app/server"]

go.mod を利用するため作成しておく。

vi go.mod
module github.com/GoogleCloudPlatform/golang-samples/run/helloworld

go 1.13

Github Actions 作成

Github Actions 用のワークフロー作成

mkdir .github
mkdir .github/workflows
vi .github/workflows/deploy.yml
name: Deploy

on: 
  push:
    branches:
      - main

env:
  GCP_CREDENTIALS: ${{ secrets.GCP_CREDENTIALS }}
  GCP_PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
  IMAGE: gcr.io/${{ secrets.GCP_PROJECT_ID }}/test-image:${{ github.sha }}
  SERVICE_NAME: test-cloudrun
  PORT: 80
  GCP_REGION: us-central1
  
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # リポジトリをチェックアウト
      - name: 'Checkout the repository'
        uses: actions/[email protected]

      # GCP 認証
      - id: 'auth'
        uses: 'google-github-actions/[email protected]'
        with:
          credentials_json: $GCP_CREDENTIALS

      # gcloud コマンドの設定
      - name: 'Set up Cloud SDK'
        uses: 'google-github-actions/[email protected]'

      # Docker に gcloud コマンドの Credential を使わせる
      - name: 'Configure docker to use the gcloud cli'
        run: gcloud auth configure-docker --quiet

      # Docker イメージを作成
      - name: 'Build a docker image'
        run: docker build -t $IMAGE .

      # Docker イメージを Container Registry に Push
      - name: 'Push the docker image to Container Registry'
        run: docker push $IMAGE

      # Container Registry から Cloud Run へデプロイ
      - name: 'Deploy to Cloud Run'
        run: |
            gcloud run deploy $SERVICE_NAME \
              --image $IMAGE \
              --port $PORT \
              --project $GCP_PROJECT_ID \
              --region $GCP_REGION \
              --platform=managed \
              --allow-unauthenticated \
              --quiet

Github リモートリポジトに Secrets 登録

以下を Github の Secrets に登録する。

  • GCP_PROJECT_ID
  • GCP_CREDENTIALS

手順

  1. リポジトリの Setting
  2. 左サイドバー Secrets → Actions
  3. New repository secret

デプロイ

今回は git push がトリガー。

git add .
git commit -m "fix"
git push

Github コンソールの Actions で結果を確認する。

確認

GCR にイメージが登録された。

Cloud Run にもデプロイされた。

Cloud Run の発行された URL にアクセスすると、Go アプリによる Hello World!! が出力される。

まとめ

Github Actions を利用した自作コンテナを Cloud Run へデプロイできた。

コードはこちら。

GitHub - runble1/test_gha_docker
Contribute to runble1/test_gha_docker development by creating an account on GitHub.

参考

Cloud Run と GitHub Actions を使って Pull Request 単位でプレビュー環境を立ち上げる - wadackel.me
はじめに 最近 Google Cloud Platform の Cloud Run が GA となったのが話題に上がりました。また gcloud コマンドを GitHub Actions 上で簡単に扱うための GoogleCloudPlatform/github-actions…
GitHub Actions から Cloud Run へデプロイする
GitHub Actions から Cloud Run へデプロイする方法です
GitHub ActionsからCloud Runを叩く
GitHub ActionsとCloud Runは便利だがCI/CDの設定で今回陥った罠についてツラツラと書く
GCP Container Registry に Docker ImageをPushする - Qiita
はじめに GCPでDocker Imageを管理します。Container Registry を使用します。 PUSH後には、Docker Imageが参照できます 手順 1. gcloud config を確認 ...

コメント

タイトルとURLをコピーしました