GCPのCloud Buildを活用しよう
こんにちは、株式会社QualiArts技術開発室でゲーム基盤を担当している曹 (ジョ)です。今回の記事は先日紹介したGCPのCloud Buildを使おうという記事の後編で、Cloud Buildを活用してプロジェクトのCI/CDを完全に自動化することを目指します。
始める前に
今回の活用編でもGCPのCloud Buildを利用する為、下記のものを事前に準備しておく必要があります。
※下記、設定方法は省略させて頂きます。
-
Gcloud SDK(可能であればCloud Shell利用をおすすめします。)
-
ソースレポジトリ(下記のいずれか一つ。この記事ではgithubを利用します。)
今回の内容について
今回はCloud Buildを利用して、ソースリポジトリにPushすると自動的にDeployまでできることを目標にします。その目標を達成する為、説明する内容は下記となります。
※今回のソースリポジトリは前回の記事で利用してリポジトリを再利用します。
※自分のgithubのアカウントに今回使ったsample(ソース、devops)を公開しておきましたので、参照してください。
- ソースリポジトリに各環境のブランチの設定
- Devopsリポジトリの準備
- 各環境用のGKE Clusterを作成と設定
- ソースリポジトリとDevopsリポジトリの連携
- ソースリポジトリへPushされた場合、DockerイメージをBuild & Pushできるように設定
- DevopsリポジトリにTagが登録された場合、そのTagを利用してアプリをDeployできるように設定
- 修正内容をソースリポジトリのdevelopブランチにPush後、Depoy結果確認
- ソースリポジトリのstagingブランチへマージ後、Depoy結果確認
- ソースリポジトリのmasterブランチへマージ後、Depoy結果確認
- おまけ:手動でDEPLOYする方法
今回、話す内容を図として表すと下記となります。
この図に目を通しておくて、今回の記事の内容がもっと理解しやすいと思います。
ソー スリポジトリに各環境のブランチの設定
ソースリポジトリはGCPのCloud Buildを使おうで利用した「cb-sample-server」を再利用します。そのリポジトリに各環境で利用するブランチを用意します。
- develop : 開発環境で利用します。
- staging : ステージング環境で利用します。
- master : 本番環境で利用します。
上記、3つのブランチをgithubのソースレポジトリに追加してください。
※masterブランチはすでにあると思いますので、その場合、developとstagingの追加で結構です。
Devopsリポジトリの準備
ソースと各環境の設定(開発環境, ステージング環境, 本番環境)を分離して運用したいのでDevopsリポジトリを用意します。その名前は「cb-sample-server-devops」としましょう。Devopsリポジトリの役割は下記となります。
※devopsリポジトリ作成手順は省略致します。
- 各環境の設定ファイルの管理
- Deployで利用するためのタグ登録
各環境の設定ファイルの準備
まずは各環境で利用する設定ファイルを下記のように用意します。
このconfig設定ファイルは単純で各環境を表示する設定が入ってます。
開発環境の設定ファイル(dev-config.yaml)
serverInfo:
envName: dev
ステージング環境の設定ファイル(stg-config.yaml)
serverInfo:
envName: stg
本番環境の設定ファイル(prd-config.yaml)
serverInfo:
envName: prd
Deploy関連ファイルの準備
アプリをdeployするときにdeployment.yamlとservice.yamlを利用しますので、追加しておきます。
deployment.yamlの追加
config.yamlの設定場所はKubernetesのVolumeになりますので、関連情報をあらかじめ追加しておきましょう
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: cb-sample-server
spec:
replicas: 1
selector:
matchLabels:
name: cb-sample-server
template:
metadata:
labels:
name: cb-sample-server
cluster_name: cb-sample-server
spec:
containers:
- name: cb-sample-server
image: gcr.io/${PROJECT_ID}/cb-sample-server:latest
ports:
- containerPort: 8080
protocol: TCP
# config用volumeMount追加
volumeMounts:
- mountPath: /usr/local/config
name: config
# config用volume設定
volumes:
- name: config
configMap:
name: server-config
revisionHistoryLimit: 100
service.yamlの追加
cb-sample-serverリポジトリにあるものをそのまま利用します。
追加後構成は下記のような感じです。
$ tree
.
├── config
│ ├── dev-config.yaml
│ ├── prd-config.yaml
│ └── stg-config.yaml
├── deployment.yaml
└── service.yaml
1 directory, 5 files
各環境用のGKE Clusterを作成と設定
今回は開発、ステージング、本番、3つの環境を利用しますので、予め、各GKE clusterを作成して、設定しておきましょう。
※clusterはGCP上のGKEを利用します。GKE cluster作成の手順は省略致します。
開発用cluster作成
- name : dev-cb-sample-server
- location type : Zonal
- zone : asia-northeast1-a
configファイル利用のためのconfigmap作成
$ cd ~/cb-sample-server-devops/config
$ gcloud container clusters get-credentials dev-cb-sample-server --zone asia-northeast1-a --project [PROJECT_ID]
$ kubectl create configmap server-config --from-file=config.yaml=dev-config.yaml
ステージング用Cluster作成
- name : stg-cb-sample-server
- location type : Zonal
- zone : asia-northeast1-b
configファイル利用のためのconfigmap作成
$ cd ~/cb-sample-server-devops/config
$ gcloud container clusters get-credentials stg-cb-sample-server --zone asia-northeast1-b --project [PROJECT_ID]
$ kubectl create configmap server-config --from-file=config.yaml=stg-config.yaml
本番用Cluster作成と設定
- name : prd-cb-sample-server
- location type : Zonal
- zone : asia-northeast1-c
configファイル利用のためのconfigmap作成
$ cd ~/cb-sample-server-devops/config
$ gcloud container clusters get-credentials prd-cb-sample-server --zone asia-northeast1-c --project [PROJECT_ID]
$ kubectl create configmap server-config --from-file=config.yaml=prd-config.yaml
ソースリポジトリとDevopsリポジトリの連携
ソースリポジトリに更新内容をPushするとCloud Buildの該当トリガーが実行されアプリのTestとBuildしたあと、Docker ImageのBuildとPushを行います。そのあと、devopsリポジトリにtagを登録すると、Cloud Buildの該当トリガーが実行されアプリをdeployします。なので、ソースリポジトリを利用するCloud Buildのトリガーの設定ファイル にdevopsリポジトリにアクセスと書き込み権限を設定する必要があります。その設定は下記となります。
- ssh鍵(private keyとpublic key)の用意
- public keyをdevopsリポジトリのdeploy keyとして登録
- GCPのKMS設定
- ソースリポジトリのcloudbuild.yamlファイルにdevopsリポジトリ取得ステップの設定追加
1から3の手順はこちらを参照してください。
RSA鍵生成とkms関連設定は下記となります。
$ ssh-keygen -t rsa -b 4096 -C "devops@casampleserver.com"
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa): cb-sample-server-devops-github-rsa
$ gcloud kms keyrings create cb-sample-server-devops-keyring --location=global
$ gcloud kms keys create cb-sample-server-devops-github-key --location=global --keyring=cb-sample-server-devops-keyring --purpose=encryption
$ gcloud kms encrypt --plaintext-file=cb-sample-server-devops-github-rsa --ciphertext-file=cb-sample-server-devops-github-rsa.enc --location=global --keyring=cb-sample-server-devops-keyring --key=cb-sample-server-devops-github-key
$ ssh-keyscan -t rsa github.com > known_hosts
※githubのdevopsリポジトリ にdeploy KEYを登録するときは書き込み権限にチェックすることはお忘れずに
ソースリポジトリのcloudbuild.yamlファイルにdevopsリポジトリ取得ステップの設定追加
1~3で設定した内容の上でcloudbuild.yaml下記を追加します。詳細は後述のcloudbuild設定を参照してください。
steps:
- id: Decrypt ssh key
name: 'gcr.io/cloud-builders/gcloud'
args:
- kms
- decrypt
- --ciphertext-file=cb-sample-server-devops-github-rsa.enc
- --plaintext-file=/root/.ssh/cb-sample-server-devops-github-rsa
- --location=global
- --keyring=cb-sample-server-devops-keyring
- --key=cb-sample-server-devops-github-key
volumes:
- name: 'ssh'
path: /root/.ssh
# Set up git with key and domain.
- id: Move rsa file
name: 'gcr.io/cloud-builders/git'
entrypoint: 'bash'
args:
- '-c'
- |
chmod 600 cb-sample-server-devops-github-rsa
mv cb-sample-server-devops-github-rsa /root/.ssh/cb-sample-server-devops-github-rsa
cat <<EOF >/root/.ssh/config
Hostname github.com
IdentityFile /root/.ssh/cb-sample-server-devops-github-rsa
EOF
mv known_hosts /root/.ssh/known_hosts
volumes:
- name: 'ssh'
path: /root/.ssh
- id: Clone devops from github
name: 'gcr.io/cloud-builders/git'
args: ['clone', 'git@github.com:QualiArts/cb-sample-server-devops.git']
volumes:
- name: 'ssh'
path: /root/.ssh
...他のstepsの設定内容...