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作成できますね。