Google Cloud DeployとCI/CDパイプラインの構築

2023-01-10

Julius SilverによるPixabayからの画像

#はじめに

Google Cloud Deployを利用してGitHubにPushしたら自動でデプロイされるCDパイプラインを構築してみようと思います。

#Google Cloud Deployとは

フルマネージドのデプロイメント パイプライン サービスです。
内部ではSkaffoldを利用しており、GKEやCloudRunなどを対象にデプロイすることができます。

参考:https://cloud.google.com/deploy

OSSだと、ArgoCDやTektonなどが分類的に近いと思います。

#料金

Google Cloud Deploy のお客様には、アクティブなパイプラインごとに毎月管理費が請求されます。毎月、請求先アカウントごとに最初のアクティブなデリバリー パイプラインは無料です。追加の配信パイプラインごとに月額 $15.00 が課金されます。

毎月、請求先アカウントごとに最初のアクティブなデリバリー パイプラインは無料という一風変わった料金体系になっています。無料枠があると気軽に試せるので良いですね。

#ハンズオン

動作確認するための最低限の設定を用意します。
今回は、デプロイターゲットはGKEとします。
マニフェストのレンダリングには、Helmを利用します。

流れを図にすると以下のようになります。

GitHubのトリガーを機に実行されるCloud Buildの設定ファイルです。

steps:  
  - name: 'gcr.io/cloud-builders/gcloud'
    id: build-image
    entrypoint: "/bin/bash"
    args:
      - '-c'
      - |-
        set -x
        curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
        gcloud auth configure-docker asia-northeast1-docker.pkg.dev
        skaffold build --interactive=false --default-repo=asia-northeast1-docker.pkg.dev/$PROJECT_ID/example --file-output artifacts.json

  - name: 'gcr.io/cloud-builders/gcloud'
    id: trigger-deploy
    args: [ "deploy", "releases",  "create",  "release-$SHORT_SHA", "--delivery-pipeline",  "example", "--region", "asia-northeast1", "--build-artifacts", "artifacts.json" ]

Cloud Deployの設定ファイルです。
ターゲットとしてDev環境とProd環境を用意します。
<PROJECT_ID>はプレースホルダです。実際の環境に合わせて設定する必要があります。

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: example
description: main application pipeline
serialPipeline:
 stages:
 - targetId: dev
   profiles: []
 - targetId: prod
   profiles: []
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: dev
description: A Dev cluster
gke:
  cluster: projects/<PROJECT_ID>/locations/asia-northeast1/clusters/autopilot-cluster-1

---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
  name: prod
description: A Prod cluster
requireApproval: true
gke:
  cluster: projects/<PROJECT_ID>/locations/asia-northeast1/clusters/autopilot-cluster-2

Helmのチャートを作成します。今回は作成したものをそのまま使います。

helm create deployments/helm/example

skaffoldの設定ファイルです。
ビルドとデプロイの設定を記述します。

apiVersion: skaffold/v2beta29
kind: Config
build:
  artifacts:
  - image: example
deploy:
  helm:
    releases:
      - name: example
        chartPath: deployments/helm/example

今回は、こちらのリポジトリにファイルを配置しています。

https://github.com/wonyx/gcp-deploy-pipeline

#リソースを準備する

実際に動かすためのGCPリソースを作成します。

#GKEクラスタを作成する

export PROJECT=$(gcloud config get-value project)
export LOCATION=asia-northeast1

export CLUSTER_1=autopilot-cluster-1
gcloud container clusters create-auto ${CLUSTER_1} \
--region ${LOCATION} \
--release-channel "regular"

export CLUSTER_2=autopilot-cluster-2
gcloud container clusters create-auto ${CLUSTER_2} \
--region ${LOCATION} \
--release-channel "regular"

#Cloud Deployのパイプラインを作成する

gcloud deploy apply --file=clouddeploy.yaml --region=asia-northeast1

#Cloud Buildのトリガーを設定する

GCPコンソールからCloud Buildsのトリガー設定を行なってもOKです。

gcloud beta builds triggers create github \
    --repo-name gcp-deploy-pipeline \
    --repo-owner wonyx \
    --branch-pattern '^main$' \
    --name gcp-deploy-pipeline \
    --build-config cloudbuild.yaml

#デプロイ

これで、GitHubにpushすると、Cloud Buildがトリガーされ、Cloud Deployが実行されます。

#Devにデプロイする


#プロモートする

プロモートボタンを押すと、Prodのデプロイが可能になります。Prodは承認を必要とするよう設定しましたので、承認するまでデプロイは始まりません。

#Prodにデプロイする

確認ボタンを押すと、承認画面が表示される。


承認ボタンを押すと、Prodにデプロイが始まります。

最終的なCloudDeployのコンソール画面

#Pros/Cons

Cloud Deployを利用してみて感じたPros/Consです。

#Pros

#Cons

#まとめ

Google Cloud Deployを利用してGitHubにPushしたら自動でデプロイされるCDパイプラインを構築してみました。
簡単なサンプルなので、すぐに構築できましたが、もっと実用的なパイプラインでは、CI/CD, Dev, Staging, Productionの環境をプロジェクトを分けて用意して、それぞれの環境にデプロイするようになるでしょう。
これから新しくデプロイパイプラインをGCP上で構築する場合は、選択肢の一つになりそうです。