gating-production-deploys について
PostHog リポジトリの保守担当者向け GitHub Actions デプロイ制御ガイドです。プロダクションイメージのプッシュとデプロイ通知を CD_DEPLOY_ENABLED に連動させる条件と、制御対象外のワークフローを示します。
主な機能
- 01本番イメージプッシュの制御範囲
- 02Charts デプロイ通知の制御
- 03リポジトリ変数の条件式
- 04リリースと PR 検証の区別
- 05関連ワークフローの例
活用シーン
- 01master へのプッシュ時の本番デプロイ設定
- 02意図しないデプロイ起動の確認
- 03リリースと PR ビルドの継続実行
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ posthog/ posthog --skill gating-production-deploysインストール後、Claude Code で/gating-production-deploysを入力して読み込まれたか確認します。
詳細
本番ビルドとデプロイのゲート制御
コンテナイメージのプッシュと Charts デプロイのディスパッチは、CD_DEPLOY_ENABLED 変数によって選択される単一の正規のデプロイリポジトリから実行されます。そのようなすべてのステップをゲート制御しないと、誤った場所から公開/デプロイされてしまいます。
push-to-master / schedule / workflow_dispatch で実行される場合は、以下をゲート制御してください:
- prod タグのコンテナイメージのプッシュ、および
PostHog/chartsへのcommit_state_updateディスパッチ(およびそのデプロイヤートークンのステップ)。
ゲート制御しないもの:
- リリース/配布ワークフロー — GitHub リリース、npm、crate、Homebrew(例:
build-phrocs.yml、release-cli.yml)。これらは public から公開されるため、そのままにしておきます。 pull_requestの検証ビルド(ゲート制御するとコントリビューターの CI が壊れます)。- 変更検出 / セットアップジョブ(変数ではなく、組織のチェックのみを使用してください)。
判断基準は「本番イメージをプッシュする、またはデプロイをトリガーする」であり、「master でビルドする」ではありません。
ゲート
if: github.repository_owner == 'PostHog' && vars.CD_DEPLOY_ENABLED == 'true'
github.repository == 'PostHog/posthog' をハードコードする代わりにこれを使用してください。
パターン
# whole job is the deploy/push (no PR builds) — gate the job:
if: github.repository_owner == 'PostHog' && vars.CD_DEPLOY_ENABLED == 'true'
# deploy job/step already keyed to master — add the gate:
if: github.repository_owner == 'PostHog' && vars.CD_DEPLOY_ENABLED == 'true' && github.ref == 'refs/heads/master'
# build job that also serves PRs — gate only the master arm of its `if`:
(github.event_name == 'push' && github.ref == 'refs/heads/master' && needs.changes.outputs.files == 'true'
&& github.repository_owner == 'PostHog' && vars.CD_DEPLOY_ENABLED == 'true')
# push step, master-only:
push: ${{ github.ref == 'refs/heads/master' && vars.CD_DEPLOY_ENABLED == 'true' }}
# push step, `push: true` (also pushes on PR for validation):
push: ${{ github.event_name == 'pull_request' || vars.CD_DEPLOY_ENABLED == 'true' }}
# reusable that pushes — add a `push` boolean input (default true), pass from caller:
# with: { push: ${{ github.event_name == 'pull_request' || vars.CD_DEPLOY_ENABLED == 'true' }} }
マージする前に出荷すべきリポジトリで CD_DEPLOY_ENABLED を設定してください。そうしないと、master へのプッシュでビルド/デプロイがスキップされます。actionlint でリントしてください。
例:container-images-cd.yml(ジョブ全体);cd-mcp-image.yml、
livestream-docker-image.yml、cd-sandbox-base-image.yml(PR と master の混在);
rust-docker-build.yml + _rust-build-images.yml(再利用可能な push 入力)。
ゲート制御されていない反例:build-phrocs.yml。