Help us understand the problem. What is going on with this article?

複数環境に向けて、GCP Cloudbuildスクリプトの構成

開発・ステージング・本番などの複数環境に向けて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

1. サンプルウェブアプリケーション準備

過去の記事用のウェブアップリケーションを再利用します。
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.Dockerfile
FROM 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 橋本

devs_hd
橋本は15年システム開発経験、現在DevSamurai株式会社でシステムアーキテクチャとして活躍しています。 開発と運用をラクとなるため、お客さんにGCP導入を支援しております。 ITプロセスおよびビジネスプロセスを自動化するソリューションを提供しております。 システム開発ライフサイクルで活用する最新技術や製品、ベストプラクティスなどの導入を支援致します。
dev-samurai
GCPクラウド技術を中心に取り扱う技術者集団
https://www.devsamurai.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした