GCPでCloudBuildを使ってCI/CDを実践

前回の記事で作成した WEB アプリに Cloud Build を使って CI/CD を導入します。

今回の CI/CD の対象

今回 ユニットテスト を用意していないので、ビルド、デプロイ部分を自動化します。

CI/CD 今回の対象
テスト ×
ビルド
デプロイ

構成

Cloud Build + Cloud Source Repositories + Container Registory を使って CI/CD を実現します。

  1. Cloud Source Repositories (GCP の提供するフルマネージドの git) にソースを push します。
  2. Cloud Build は、それを検知して、コンテナイメージをビルドし、Container Registory に コンテナイメージを push します。
  3. さらに、Cloud Build は、Container Registory のコンテナイメージを使って、Compute Engine のコンテナを再起動(コンテナのイメージの更新)を実行します。

cloudbuild.yaml の作成

Cloud Build の設定ファイルであるcloudbuild.yamlを作成します。
このあと、ソースを Cloud Source Repositories に push することになりますが、cloudbuild.yaml は ソースの一番上の階層のディレクトリ直下に作成してください。
Cloud Build は cloudbuild.yaml があるディレクトリ上で処理を実行することになります。
ここでは、例として、 cloudbuild.yaml の中身は下記のように作成しています。

cloudbuild.yaml 内に step として、Cloud Build に実行させる処理を記述することができ、Cloud Build は step に書かれた内容を順番に実行していくことになります。(なので設定ファイルの内容次第で柔軟に CI/CD の内容を作成できます。)
書き方は、下記公式ページが参考になります。
https://cloud.google.com/cloud-build/docs/build-config?hl=ja

今回 2 つの step 記載しており、下記のような処理を記載しています。

step 実行する内容
1 番目 Cloud Source Repositories のソースからコンテナイメージをビルドし、Container Registory にコンテナイメージを push
2 番目 Container Registory のコンテナイメージを指定してコンテナを更新

steps の配下の name ごとに 処理を書くことができ、name には、Cloud Build が処理を実行するコンテナイメージを指定します。
基本的には、GCP が用意しているコンテナイメージを指定するようで、それぞれ下記のように処理されます。

指定するコンテナイメージ 実行コマンド
gcr.io/cloud-builders/docker docker
gcr.io/cloud-builders/gcloud gcloud

そのあとの args に指定する値は、指定したコンテナイメージによって実行されるコマンドの引数を指定することになります。
例えば step の一番目で実行されるコマンドはdokcer build -t asia.gcr.io/$PROJECT_ID/XXXXXということになります。

ちなみに、 dir は コマンドを実行するディレクトリを指定します。
1 番目の step では、 ./docker/apache-php 以下に DockerFile を置いているので、dir にそのように記述しています。

--container-env に指定しているのは、コンテナ起動時に設定する環境変数です。ここでは、このあと、Cloud Build の設定時に設定する代入変数を指定しています。

Cloud Source Repositories の設定

Cloud Source Repositories にソースを push します。

まず、GCP のコンソールより、左のメニューから Cloud Source Repositories の画面を開いてください。

初回は、リポジトリが存在しないため、リポジトリの作成からになります。
画面に従って、リポジトリを作成する画面に移ってください。

リポジトリを作成する際の選択肢が表示されます。今回は Cloud Source Repositories に新規にリポジトリを作成しますが、GitHub などからリポジトリをクローンすることもできます。

リポジトリ名を入力、対象の GCP のプロジェクトを選択すると、リポジトリが作成できます。

初回はリポジトリが空のため、下記のような画面が表示されます。

まずは、ローカルにリポジトリのクローンを作成するため「ローカル Git リポジトリへのリポジトリのクローンを作成する」を選択し、今回は Google Cloud SDK を使って(これ以外だとうまく認証が通らなかったりするので)クローンを作成します。
上記画面に指示(コマンド)に従って、クローンを作成・push してください。
クローン作成までは gcloud コマンドですが、push は 指示の通り、git コマンドでもよいですし、VSCode 等で実行してもよいです。(ただの git なので)

push すると、下記のように GCP コンソール上で、リポジトリの中身が確認できるようになります。

Cloud Build の設定

おそらく、初回は、API を有効化するかどうかの画面が表示されると思うので、有効化してください。

その後、左の「設定」をクリックして、下記のように、「Compute Engine」と「Service Accounts」を有効にしてください。
今回、自動ビルド、自動デプロイをするために、Cloud Build にその権限を付与する必要があるためです。

Cloud Build を GCP コンソールから設定します。
下記のように Cloud Build の画面を開き、「トリガーを作成」をクリックします。

トリガーの作成画面が開いたら、Cloud Build をどのトリガーで実行するか入力していきます。
下記画面で、「Push to a branch」を選択し、対象のソース、ブランチを選択すると、対象のブランチに Push されたときに、Cloud Build を実行させることができます。
ここでは、 master ブランチに push されたときに、実行するようにします。

「ビルド構成」は、ソースの直下に cloudbuild.yaml を作成しているのでそのままでいいはずです。
「代入変数」には、変数を設定することが可能です。ここに、例えば環境ごとにことなる設定値を設定するといいと思います。今回は、先ほど作成した cloudbuild.yaml--container-env に、代入変数を指定するように作成しています。($_XXXX の形式で記載している箇所のことです。)

入力完了したら「作成」ボタンを押して設定完了です。

CloudBuild の実行を試す

実際に Cloud Source Repositories にソースを push して Cloud Build が実行されるかどうか確認します。

実行するとビルド履歴画面で、実行履歴が確認できます。

上記はすでに実行したあとの画面ですが、push すると、上記の一覧に追加され、処理が実行中となり、成功するとチェックマーク表示になり、失敗すると!表示になります。

以上で、Cloud Build を使った CI/CD の導入が完了です。