開発・ステージング・本番などの複数環境に向けてGCP Cloudbuildの構成を紹介したいと思います。
シンプルのウェブアプリケーションを使ってビルドを行います。
ワークフォルダの構成
cloudbuild_multi_env ├── README.md ├── build │ ├── cloudbuild │ │ ├── _base │ │ │ └── cloudbuild.simplewebapp.yaml │ │ ├── dev │ │ │ └── cloudbuild.simplewebapp.yaml │ │ ├── prod │ │ │ └── cloudbuild.simplewebapp.yaml │ │ └── staging │ │ └── cloudbuild.simplewebapp.yaml │ └── dockerfile │ └── simplewebapp.Dockerfile └── webapp ├── handler │ └── simplewebapp_handler.go └── simplewebapp.go
目次
Toggle1. サンプルウェブアプリケーション準備
過去の記事用のウェブアップリケーションを再利用します。 GKE上にwebアプリケーションを構築する方法 simplewebapp.gopackage main import ( "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/itdevsamurai/gke/simplewebapp/webapp/handler" ) // Default Server Port const DEFAULT_SERVER_PORT = ":80" func main() { // Echo instance e := echo.New() // Middleware e.Use(middleware.Logger()) e.Use(middleware.Recover()) e.Use(middleware.CORS()) // Route => handler e.GET("/", handler.SimpleWebHandler{}.Index) e.GET("/ping", handler.SimpleWebHandler{}.Ping) // Start server e.Logger.Fatal(e.Start(DEFAULT_SERVER_PORT)) }simplewebapp_handler.go
package handler import ( "net/http" "github.com/labstack/echo/v4" ) type SimpleWebHandler struct { } func (sh SimpleWebHandler) Index(c echo.Context) error { return c.String(http.StatusOK, "Hello, World!n") } func (sh SimpleWebHandler) Ping(c echo.Context) error { return c.String(http.StatusOK, "Pong!n") }
2. Dockerfileの準備
simplewebapp.DockerfileFROM alpine:latest WORKDIR /app COPY ./simplewebapp /app EXPOSE 80 ENTRYPOINT ["./simplewebapp"]
3. Cloudbuildスクリプトの準備
各種環境の共有スクリプト
_base/cloudbuild.simplewebapp.yamloptions: env: - GO111MODULE=on volumes: - name: go-modules path: /go steps: # go test - name: golang:1.12 dir: . args: ['go', 'test', './...'] # go build - name: golang:1.12 dir: . args: ['go', 'build', '-o', 'simplewebapp', 'webapp/simplewebapp.go'] env: ["CGO_ENABLED=0"] # docker build - name: 'gcr.io/cloud-builders/docker' dir: . args: [ 'build', '-t', '${_GCR_REGION}/${_GCR_PROJECT}/${_GCR_IMAGE_NAME}:${_GCR_TAG}', '-f', 'simplewebapp.Dockerfile', '--cache-from', '${_GCR_REGION}/${_GCR_PROJECT}/${_GCR_IMAGE_NAME}:${_GCR_TAG}', '.' ] # push image to Container Registry - name: 'gcr.io/cloud-builders/docker' args: ["push", '${_GCR_REGION}/${_GCR_PROJECT}/${_GCR_IMAGE_NAME}'] substitutions: # # GCR region name to push image _GCR_REGION: asia.gcr.io # # Image name _GCR_IMAGE_NAME: ds-cloudbuild-test # # Image tag _GCR_TAG: latest
各種環境別スクリプト
こつは「–substitutions」を使って環境別の設定を指定します。今回はプロジェクトIDだけとなりますが、他の設定があったらコマ区切りで追加する。 例:'--substitutions=_GCR_PROJECT=ds-abc123-dev,_ENV=dev'開発環境:dev/cloudbuild.simplewebapp.yaml
steps: - name: 'gcr.io/cloud-builders/gcloud' args: [ 'builds', 'submit', '--config=build/cloudbuild/_base/cloudbuild.simplewebapp.yaml', '--substitutions=_GCR_PROJECT=ds-abc123-dev', '.' ]ステージング環境:staging/cloudbuild.simplewebapp.yaml
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args: [
'builds',
'submit',
'--config=build/cloudbuild/_base/cloudbuild.simplewebapp.yaml',
'--substitutions=_GCR_PROJECT=ds-abc123-staging',
'.'
]
本番環境:prod/cloudbuild.simplewebapp.yaml
steps:
- name: 'gcr.io/cloud-builders/gcloud'
args: [
'builds',
'submit',
'--config=build/cloudbuild/_base/cloudbuild.simplewebapp.yaml',
'--substitutions=_GCR_PROJECT=ds-abc123-prod',
'.'
]
4. Cloudbuild実施
サンプルウェブアプリケーションのイメージビルドを行います。 開発環境cd cloudbuild-multi-env-folder # build image for dev env gcloud builds submit --config build/cloudbuild/dev/cloudbuild.simplewebapp.yaml
ステージング環境cd cloudbuild-multi-env-folder # build image for staging env gcloud builds submit --config build/cloudbuild/staging/cloudbuild.simplewebapp.yaml
本番環境cd cloudbuild-multi-env-folder # build image for prod env gcloud builds submit --config build/cloudbuild/prod/cloudbuild.simplewebapp.yaml
本記事で利用したソースコードはこちら
https://github.com/itdevsamurai/gke/tree/master/cloudbuild_multi_env
最後まで読んで頂き、どうも有難う御座います! DevSamurai 橋本
- name: 'gcr.io/cloud-builders/gcloud'
args: [
'builds',
'submit',
'--config=build/cloudbuild/_base/cloudbuild.simplewebapp.yaml',
'--substitutions=_GCR_PROJECT=ds-abc123-prod',
'.'
]