📝

GAEのデプロイ環境をjenkinsからCloud Buildに移行

2022/08/09に公開

はじめに

AppEngineのデプロイ環境をjenkinsからCloudBuildに移行したので、備忘録として記載します。

環境情報はこちら
・リポジトリ:GitHub
・フレームワーク:Laravel6.0/php7.3(あんまり関係ない)

やること

やることは以下の3点です。

  1. 準備(IAMの権限設定など)
  2. SecretManagerに機密データを格納
  3. CloudBuildのトリガー作成

1. 準備

IAM権限付与

CloudBuildサービスアカウントに必要なIAM権限を付与します。
確認した結果、必要なIAM権限は以下でした。

  • AppEngineサービス管理者:任意
    デプロイ後、トラフィックを自動で切り替える際に必要。
    本番環境など、必ず手動で切り替えたい場合はあえて権限付与しないのもあり。
  • AppEngineデプロイ担当者:必須
  • CloudBuildサービスアカウント:必須
  • SecretManagerのシークレットアクセサー:任意
    シークレットにアクセスする場合は必要。
  • サービスアカウントユーザー:必須

    参考(公式)

GitHubにGoogleCloudBuildをインストール

こちらから設定できます。
CloudBuildとGitHubの連携に必要です。
自分の参加しているリポジトリすべて、またはリポジトリごとに個別にインストールできます。
必要最低限にしたかったので、個別にインストールしました。

2. SecretManagerに機密データを格納

機密データをSecretManagerで管理し、デプロイ時に参照します。
今回はapp.yamlの内容をSecretManagerに格納し、デプロイ時にapp.yamlを書き出してみます。

「app」という名前で登録しました。

3. CloudBuildのトリガー作成

手動で実行できるトリガーを作成します。

  1. 名前やリージョンは任意で、イベントを「手動呼び出し」に指定します。
  2. ソースとブランチを指定します。
    GitHubを選択→認証
    リポジトリとブランチを選択
    ※事前準備の「GoogleCloudBuildをインストール」を行っていない場合、ここでインストールを求められます。
  3. 構成の形式とロケーションを設定します。
    形式:Cloud Build 構成ファイル(yaml または json)
    ロケーション:インライン→エディターを開いて、以下のYAML構文を入力
steps:

## シークレット(app)を取得して、backendディレクトリ配下に書き出し
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bash'
  args: [ '-c', "gcloud secrets versions access latest --secret=app --format='get(payload.data)' | tr '_-' '/+' | base64 -d > backend/app.yaml" ]

## backendディレクトリでデプロイ
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  dir: backend
  args: ['-c', 'gcloud config set app/cloud_build_timeout 900 && gcloud app deploy']

timeout: '900s'
  1. 詳細設定
    デフォルト

以上でトリガー作成が完了しました。実行ボタンから手動実行できます。

おわり。

おまけ

デプロイ時のパラメータを都度切り替えたい

_DEPLOY_OPTION変数を追加して、必要に応じてデプロイオプションを設定できるようにしてみます。

  1. YAMLを更新
    gcloud app deployの後ろに${_DEPLOY_OPTION}を追加して、変数の値を取得できるようにします。
steps:

## backendディレクトリ配下にapp.yamlを書き出し
- name: gcr.io/cloud-builders/gcloud
  entrypoint: 'bash'
  args: [ '-c', "gcloud secrets versions access latest --secret=app --format='get(payload.data)' | tr '_-' '/+' | base64 -d > backend/app.yaml" ]

## backendディレクトリでデプロイ
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  dir: backend
  args: ['-c', 'gcloud config set app/cloud_build_timeout 900 && gcloud app deploy ${_DEPLOY_OPTION}']

timeout: '900s'
  1. 代入変数を設定
    _DEPLOY_OPTION変数を追加します。
    値1はデフォルト値なので、入れても入れなくてもOK。

  2. 実行
    実行時、変数の値入力欄が表示されるので、任意のパラメータを指定して実行します。
    今回は「--no-promote」を指定してみます。

実行後、インスタンスのバージョンを確認。
--no-promoteが効いてる(トラフィックが自動で切り替わってない)ことを確認できました。

参考にさせていただいた記事

感謝🙏🙏🙏
https://kido0617.github.io/server/2021-06-11-cloudbuild-laravel/
https://medium.com/google-cloud-jp/try-github-cloudbuild-integration-5149175105fb

Discussion