ビルド プレビューは、新しいものでも革新的なものでもありません。 Heroku はそれらを何年も前から持っていました。ただし、Google Cloud Platform 上に構築している場合は、少し難しくなります。 Google Cloud Build は、Cloud Functions、Cloud Run、Kubernetes、App Engine などへのデプロイに使用できます。Cloud Build はアプリケーションやサービスのデプロイ先がわからないため、プレビューが少し複雑になります。リポジトリに接続し、GitHub でビルド ステータスを表示する GitHub アプリがありますが、それだけです。 Heroku、Vercel、Fly などの製品で見慣れたプレビュー、コメント、または「通常の」機能はありません。
単純な HTTP リクエストを使用して、Cloud Build から GitHub Pull Request にコメントを投稿する「簡単な」方法があります。しかし、 GitHub Deployments APIを使用できるのであれば、なぜ簡単なのでしょうか。
この API を使用すると、環境を作成し、環境ごとに異なる変数を設定し、プル リクエストでビルドとデプロイのステータスを直接表示できます。 CD プラットフォームで展開が完了したら、展開ステータスに URL を追加できます。これがこの記事でやることです。
繰り返しますが、これを行う別の方法として、HTTP リクエストで Deployments API を直接使用する方法があります。ただし、これは難しい場合があり、GitHub で認証するためにパーソナル アクセス トークンを定義する必要があります。代わりに、GitHub Apps を使用してアプリ トークンを生成し、Deployments API と対話する小さな Node.js サービスをまとめることにしました。これにより、展開プロセスをもう少し細かく制御できるようになります。
この記事は、Google Cloud Platform と GitHub 専用に書かれています。 Google Cloud Platform、Google Cloud Build、IAM 権限についての基本的な理解があることを前提としています。
Google Cloud Platform プロジェクトが設定されている必要があります。
GitHub Deployer は、GitHub App で認証され、GitHub Deployments API と対話する小さな Node.js サービスです。コマンドは事前定義されており、一部の情報を Docker イメージに組み込む必要があります。そうしないと、Cloud Build のランタイム構成が複雑になりすぎます。
Docker イメージはまだ構築されていません。自分でビルドしてレジストリにプッシュする必要があります。最適な場所は、アプリケーションのイメージも保存される Google Artifact Registry です (Container Registry は非推奨です)。
まだ作成していない場合は、Artifact Registry リポジトリを作成します
GitHub アプリを作成して組織にインストールする
必要な権限: 「pull_requests」、「deployments」、「metadata」
アプリ ID ([アプリ設定] 画面から) とアプリ インストール ID ([設定] をクリックすると、URL にインストール ID が表示されます。他にどこで見つかるかわかりません) をコピーします。
秘密キーを作成してダウンロードし、base64 に変換します ( base64 -i your.private-key.pem
)
Cloud Build はamd64
で実行されるため、x86 プラットフォーム用のイメージをビルドするにはbuildx
が必要です。
docker buildx build --platform linux/amd64 . -t us-central1-docker.pkg.dev/[PROJECT]/docker/gh-deployer \
--build-arg GH_APP_ID=[GITHUB_APP_ID] \
--build-arg GH_APP_PRIVATE_KEY=[GITHUB_PRIVATE_KEY_BASE_64] \
--build-arg GH_APP_INSTALLATION_ID=[GITHUB_INSTALLATION_ID] \
--build-arg GH_OWNER=[GITHUB_ORG]
イメージをレジストリにプッシュします。
docker push us-central1-docker.pkg.dev/[PROJECT]/docker/gh-deployer
docker run -it -e REPO_NAME=test -e REF=main -e ENVIRONMENT=test us-central1-docker.pkg.dev/[PROJECT]/docker/gh-deployer:latest create
REPO_NAME
: リポジトリの名前が必要です(例: gh-deployer
)REF
: デプロイするにはブランチ、タグ、または SHAが必要でした(例: main
)ENVIRONMENT
: デプロイ先の環境が必要です(例: preview
)TRANSIENT_ENVIRONMENT
:オプション/false true
に設定すると、デプロイメントは一定時間後に削除されますDESCRIPTION
: デプロイメントの説明(オプション)次のコマンドが最初の引数として使用できます。
create
- 新しいデプロイメントを作成しますpending
- ビルドは保留中ですin_progress
- ビルドが進行中ですqueued
- ビルドはキューに入れられていますsuccess
- デプロイメントは成功しましたerror
- 何か問題が発生しましたfailure
- デプロイメントが失敗しました
Cloud Build では、現時点ではオプションが少し制限されています。初期デプロイメントを作成するには Cloud Build を開始する必要があるため、 pending
状態はありません。 queued
あまり意味がないので、私たち自身の設定では次のものを使用しています。
gh-deployer/create
コミットの一時的なデプロイメントを作成します。pgh-deployer/ending
gh-deployer/in_progress
gh-deployer/success
繰り返しになりますが、Cloud Build ではデプロイがどこに行われるかわからないため、デプロイ URL をsuccess
ステップに渡す方法は 2 つあります。
/workspace/deployer_environment_url
に書き込みます。success
したら、2 番目の引数を Docker イメージに渡します
デプロイメントには Cloud Run を使用しているため、特定のプル リクエスト番号のデプロイメント URL を取得するビルド ステップは次のとおりです。
- 名前: gcr.io/google.com/cloudsdktool/cloud-sdk
env: - PR_NUMBER=$_PR_NUMBER script: >- gcloud run services list --project [project] --filter preview-$PR_NUMBER --format "value(status.address.url)" > /workspace/deployer_environment_url
以下は、 cloudbuild.yaml
構成ファイルを使用した完全な例です。構築には Kaniko を使用し、デプロイメント ターゲットとして Cloud Run を使用します。
Terraform を使用している場合は、Terraform ファイル(preview.tf)も利用できます。
Deployments API を使用すると、 deployment_status
で GitHub アクションをトリガーできます。これにより、各プレビュー ビルドで品質保証チェックやエンドツーエンドのテストなどを簡単に実行できるようになります。 success
状態として渡されるenvironment_url
を使用して、各プレビューでPlaywrightを実行する例を次に示します。
劇作家QA:
if: ${{ github.event.deployment\_status.state == 'success' }} timeout-minutes: 60 runs-on: ubuntu\-latest steps: \- uses: actions/[\[email protected\]](/cdn-cgi/l/email-protection) \- uses: actions/setup\-[\[email protected\]](/cdn-cgi/l/email-protection) with: node-version: 20 cache: 'npm' \- run: npm ci \- name: Install Playwright Browsers run: npm exec playwright install \-\-with\-deps \-y \- name: Run Playwright tests run: pnpm exec playwright test env: BASE\_URL: ${{github.event.deployment\_status.environment\_url}} \- uses: actions/upload\-[\[email protected\]](/cdn-cgi/l/email-protection) if: always() with: name: playwright\-report path: playwright\-report/ retention-days: 30
gcr.io/google.com/cloudsdktool/cloud-sdk
は比較的大きいです。 Cloud Run コンポーネントを使用して独自の小さな gcloud イメージを構築すると、ビルドを高速化できます。
GitHub プル リクエストへのコメントは、最初は簡単ですが、プル リクエストごとに複数のデプロイメントがあり、ビルドが失敗するなど、柔軟性があまりなく、維持/更新が困難です。 GitHub Deployments API は、サードパーティの CI/CD システムからデプロイメントを作成および管理するためのエレガントな方法を提供します。 GitHub Deployer
を使用して、デプロイメント API との対話を合理化し、HTTP API だけでは解決できないいくつかの副作用や落とし穴に対処しようとしました。
GitHub Deployments API を使用するもう 1 つの利点は、GitHub Actions のdeployment_status
トリガーを使用し、イベント ペイロードで直接environment_url
を取得できることです。
もう少し詳しいインストール/ビルド手順とすべてのコードは、 GitHub リポジトリで見つけることができます。
ご質問やコメントがございましたら、BlueSky/ Twitterにご連絡いただくか、 GitHub のディスカッションに参加してください。