1.概要

タイトルの通りGithub → CloudBuild → CloudRun のCICDの設定をしていく手順を記載します。

下記登録作業を行います。出来る限りgcloud コマンドで登録操作します。

  • Githubリポジトリ準備
  • Artifact Registry 登録
  • CloudBuildリポジトリにGithubとの接続登録
  • CloudBuildトリガー作成
    ※CloudBuild実行時にCloudRunのデプロイ(作成)も含めているためCloudRunの作成作業はありません。

2.Githubリポジトリ準備

Dockerで動くFlaskでHellowWorldを返すだけのアプリ―ションを準備しました。

/cloud-build-tutorial
|--Dockerfile
|--cloudbuild.yml
|--src
|  |--main.py
|  |--requirements.txt

Dockerfile

requirements.txtでFlaskを定義しています。

Dockerfile

FROM python:3.12-rc

workdir /var/www
COPY ./src /var/www

RUN pip install --upgrade pip 
RUN pip install -r requirements.txt

CMD python main.py

cloudbuild.yml

CloudBuildの動作を定義する構成ファイルです。構成ファイルで指定しているのは、

  • docker ビルドして、
  • ビルドしたdocker イメージをArtifact Registryへプッシュして、
  • Cloud Run にデプロイする。Cloud Run に定義が無ければ新規作成も行う。

構成ファイルで使われている変数名の補足。

  • PROJECT_ID ・・・ GCプロジェクトID
  • _AR_HOSTNAME ・・・ CloudBuildトリガー作成時に値を指定しています。Artifact Registry のリージョンが定義されています。
  • _REPO_NAME ・・・ CloudBuildトリガー作成時に値を指定しています。Artifact Registry の名称です。
  • _SERVICE_NAME ・・・ CloudBuildトリガー作成時に値を指定しています。イメージ名です。
  • _DEPLOY_REGION ・・・ CloudBuildトリガー作成時に値を指定しています。デプロイリージョン。
    Flaskアプリケーションはポート:8888で起動しているので、構成ファイル内でポートを定義しています。

cloudbuild.yml

# CloudBuildでdocker buildし、Artifact Registryへプッシュする

steps:
  # docker build
  - name: 'gcr.io/cloud-builders/docker'
    args: [
      'build', '--no-cache', '-t',
      '${_AR_HOSTNAME}/${PROJECT_ID}/${_REPO_NAME}/${_SERVICE_NAME}:latest',
      '-f', 'Dockerfile',
      '.',
      ]

  # Docker push to Google Artifact Registry
  - name: 'gcr.io/cloud-builders/docker'
    args: ['push',  '${_AR_HOSTNAME}/${PROJECT_ID}/${_REPO_NAME}/${_SERVICE_NAME}:latest']

  # Deploy to Cloud Run
  - name: google/cloud-sdk
    args: ['gcloud', 'run', 'deploy', '${_SERVICE_NAME}',
      '--image=${_AR_HOSTNAME}/${PROJECT_ID}/${_REPO_NAME}/${_SERVICE_NAME}:latest',
      '--region', '${_DEPLOY_REGION}', '--platform', 'managed',
      '--allow-unauthenticated',
      '--port=8888']

# Store images in Google Artifact Registry
images:
  - ${_AR_HOSTNAME}/${PROJECT_ID}/${_REPO_NAME}/${_SERVICE_NAME}:latest

src\main.py

ポート:8888で起動しています。ルート指定時にhello worldを表示します。

main.py

from flask import Flask

app = Flask(__name__)

# ルート指定時
@app.route('/')
def hello_world():
    return 'hello world'

if __name__ == '__main__':
    app.run(debug='true', host='0.0.0.0', port='8888')

src\requirements.txt

flask

ローカルのDockerで動作確認

下記実行後に「http://localhost」にアクセスすると「hello world」が表示されること確認する。

docker build -t cloud-build-tutorial .
docker run -p 80:8888 --name cloud-build-tutorial -v ${PWD}/src:/var/www cloud-build-tutorial:latest

3.Artifact Registry 登録

CloudShellより下記実行して、Artifact Registryを作成します。
名称は「cloud-build-tutorial」で作成します。

gcloud artifacts repositories create cloud-build-tutorial \
 --repository-format=docker \
 --location asia-northeast1 \
 --description="CloudBuild Tutorial"

Artifact Registryが作成されたことを確認します。

既に構成ファイルで指定していますが、Artifact Registryのイメージを指定する際のパスをコピーしてどこかに保存しておきます。

4.CloudBuildリポジトリにGithubとの接続登録

CloudBuildにGithubとの接続を登録していきます。
CloudBuildリポジトリで「リポジトリを接続」を選択します。

リージョンはglocal を指定して「続行」を選択してください。GitHub Enterprise でリポジトリの状態によってはリージョン指定できますが、
プライベートなリポジトリだとglocal を指定してください。
その後認証でGithubの認証が行われます。

リポジトリを選択します。

これからGithub側にCloudBuildのアプリケーションをインストールするのでその設定を行っていきます。

Gihubの認証を行います。

インストールするリポジトリを選択して「Save」します。

するとCloudBuild側でリポジトリを選択できる様になりますので「接続」してください。

トリガーはこの後作成するので、「完了」を選択してください。

5.CloudBuildトリガー作成

CloudShellより下記実行して、CloudBuildトリガーを作成します。
名称は「cloud-build-tutorial-trigger」で作成します。
repo-nameには、GithubアカウントIDを除いたものを指定してください。GithubアカウントIDを含めたリポジトリ名を指定するとエラーになります。私は結構これでハマりました。
develop ブランチに更新が入ると、CloudBuildトリガーが動く指定です。
構成ファイルは「–build-config」で指定しています。
構成ファイルが参照する環境変数は「–substitutions」で指定しています。

gcloud beta builds triggers create github \
    --name=cloud-build-tutorial-trigger \
    --region=global \
    --repo-owner=k-ishikawa-619 \
    --repo-name=cloud-build-tutorial \
    --branch-pattern=^develop$ \
    --build-config=cloudbuild.yml \
    --substitutions=_AR_HOSTNAME=asia-northeast1-docker.pkg.dev,_DEPLOY_REGION=asia-northeast1,_SERVICE_NAME=cloud-build-tutorial,_REPO_NAME=cloud-build-tutorial

CloudBuildトリガーが作成されたこを確認して、手動実行します。(developブランチに何か変更をプッシュしても良い)

履歴のステータスを見て、ビルドが正常終了したことを確認します。

6. CloudRun 確認

CloudRun がデプロイされた(作成された)ことを確認します。

URLを確認します。

URLにアクセスすると、Flaskのhello worldが表示されることを確認します。
簡単な構成のアプリなら簡単にCICDとCloudRun作成できますね。