概要
前回 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
- main ブランチへの push で実行
setup-gcloud
GitHub Action で GCP 認証- GCR のレジストリのホスト名は gcr.io で米国リージョン
- docker push で GCR に登録
- gcloud run deploy で Cloud Run へデプロイ
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/checkout@v2
# GCP 認証
- id: 'auth'
uses: 'google-github-actions/auth@v0'
with:
credentials_json: $GCP_CREDENTIALS
# gcloud コマンドの設定
- name: 'Set up Cloud SDK'
uses: 'google-github-actions/setup-gcloud@v0'
# 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
手順
- リポジトリの Setting
- 左サイドバー Secrets → Actions
- 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 上で簡単に扱うための …
GitHub Actions から Cloud Run へデプロイする
GitHub Actions から Cloud Run へデプロイする方法です
Just a moment...
GCP Container Registry に Docker ImageをPushする - Qiita
はじめにGCPでDocker Imageを管理します。Container Registry を使用します。PUSH後には、Docker Imageが参照できます手順1. gcloud con…
Bitly
Amazon.co.jp
コメント