Masayan tech blog.

  1. ブログ記事一覧>
  2. 【Cloud Runでサクッとサービスをデプロイ】Part3:CI/CDパイプライン構築

【Cloud Runでサクッとサービスをデプロイ】Part3:CI/CDパイプライン構築

公開日

※GCPアカウントの作成、プロジェクト作成、課金有効化、Cloud SDKのインストールなどは完了している前提で進める

シリーズ構成

【Cloud Runでサクッとサービスをデプロイ】Part1:導入

【Cloud Runでサクッとサービスをデプロイ】Part2:アプリケーションの手動デプロイ

【Cloud Runでサクッとサービスをデプロイ】Part3:CI/CDパイプライン構築

【Cloud Runでサクッとサービスをデプロイ】Part4:DB(Cloud Sql)と接続

イメージ図

最終的なゴールは以下の図の通り

CI/CDパイプライン構築

Part2まで手動でデプロイする方法を見てきた。ただ、ソースコードを変更してイメージをビルドしてそれを元にコンテナを作成して...というのを毎回すると手間がかかるので、Cloud Buildを使って自動化する

Cloud Buildについてはこちらを参照されたし

Google Cloud Buildを使用してCI/CDパイプラインをサクッと構築する

サービスアカウントの権限設定権限

Cloud BuildにCloud Run管理者の権限が必要なので付与(コンソールのCloud Build→設定から可能)。権限がないとデプロイ時にエラーになる

ERROR: (gcloud.run.services.update) PERMISSION_DENIED: Permission 'run.services.get' denied on resource 'namespaces/・・・' (or resource may not exist).

Githubリポジトリの作成

Githubのmainブランチにpushされたタイミングで自動的にデプロイされるような仕組みを構築するので、Dockerfile含めソースを全てリポジトリにpushしておく

cloudbuild.yamlの作成

Dockerfileを実行し、ビルドしたイメージをGCRにPushして、CloudRunにデプロイ工程を記述する

ステップ1はビルド、ステップ2はpush、ステップ3はデプロイ。cloudbuild.yamlではPROJECT_IDTRIGGER_NAMEなどのデフォルトの置換変数があり、これらに該当しない値についてはsubstitutionsとしてユーザ定義変数を設定することが可能(ハードコーディングを減らすことにより、cloudbuild.yamlを使い回すことが可能になる)。

steps:
  # イメージビルド
  - name: 'gcr.io/cloud-builders/docker'
    id: 'build-docker-image-from-dockerfile'
    args: ['build', '-t', "${_REPO_IMAGE_FULL_PATH}", "${_BUILD_CONTEXT}", '-f', "${_DOCKER_FILE_PATH}"]

  # イメージ保存
  - name: 'gcr.io/cloud-builders/docker'
    id: 'push-docker-image-to-gcr'
    args: ["push", "${_REPO_IMAGE_FULL_PATH}"]

  # デプロイ
  - name: "gcr.io/google.com/cloudsdktool/cloud-sdk:slim"
    entrypoint: gcloud
    args:
      [
        "run",
        "deploy",
        "${_SERVICE_NAME}",
        "--image",
        "${_REPO_IMAGE_FULL_PATH}",
        "--region",
        "${_DEPLOY_REGION}",
        "--platform",
        "managed",
        "--allow-unauthenticated",
      ]
substitutions:
  # デフォルト値を設定。実際の値はコンソールのCloud buildトリガー設定、代入変数から登録
  _DEPLOY_REGION: asia-northeast1
  _REPO_NAME: my-repo
  _SERVICE_NAME: my-service
  _IMAGE_NAME: my-image:latest
  _BUILD_CONTEXT: .
  _DOCKER_FILE_PATH: ./docker/Dockerfile
  _REPO_IMAGE_FULL_PATH: "${_AR_HOSTNAME}/${PROJECT_ID}/${_REPO_NAME}/${_IMAGE_NAME}"

substitutionsはCloud buildトリガー作成時の詳細設定-代入変数で指定しておく

CloudBuildトリガーの作成

コンソールからCloud Runを開き、ソースリポジトリから新しいリビジョンを継続的にデプロイする、を選択しCloud Buildの設定をクリック。トリガーを作成を選択。

Github上で認証などを済ませ、作成したGithubリポジトリを指定して接続

Githubリポジトリのyamlファイルを参照するように設定し、作成をクリック

トリガーを発動させる

ソースコードに変更を加え、pushする。デプロイが完了し、Cloud Runから対象のサービスのurlにアクセスして変更内容が反映されていれば完了

Part3ここまで。次回のPart4ではDB(Cloud Sql)と接続する

まとめ

いかがでしたでしょうか。本記事では、【Cloud Runでサクッとサービスをデプロイ】シリーズのPart3として、Cloud run環境にGithubとCloud Buildを連携させ、CI/CDパイプライン構築する方法を紹介しました。ぜひ参考にしてみてください。