開発・ステージング・本番などの複数環境に向けて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.go
package 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.yaml
options:
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',
'.'
]
