EcAuthDocs

MockIdP CI/CD デプロイメントガイド

MockOpenIdProvider の Cloudflare Workers へのデプロイパイプライン。GitHub Actions で型チェック・ユニットテスト・E2E を回し、main への push で wrangler deploy する。

EcAuth.MockIdP の CI/CD パイプラインと Cloudflare Workers へのデプロイ設定について 説明します。

概要

MockIdP は単一の Worker(mock-openid-provider)として workers.dev サブドメインに公開されています。カスタムドメインは使いません。

環境は Worker を分けるのではなく、1 つの Worker 内のテナントとして分離 します。リクエストの ?org= または X-Organization ヘッダーでテナントを 解決し、既定は dev です。

項目 構成
ホスティング Cloudflare Workers(workers_dev: true、カスタムドメインなし)
テナント dev / staging / production?org= / X-Organization で解決、既定 dev
永続化 なし。トークンは HS256 署名付きの自己完結型。KV (USED_CODES)に使用済み認可コードのマーカーのみ記録する
ランタイム TypeScript / Node.js 24 / pnpm

ワークフロー

ファイル トリガー 内容
ci.yml push / pull_request pnpm run typecheckpnpm test
e2e-tests.yml push / pull_request wrangler dev をローカル起動して Playwright E2E を実行
deploy.yml main への push / workflow_dispatch 型チェック → ユニットテスト → wrangler deploy → ヘルスチェック
claude-code-review.yml pull_request Claude によるレビュー

デプロイフロー

main ブランチへの push
    ↓
Deploy to Cloudflare Workers (deploy.yml)
    - pnpm install --frozen-lockfile
    - pnpm run typecheck
    - pnpm test
    - pnpm exec wrangler deploy
        → 出力から https://<name>.workers.dev を抽出
    - /healthz を最大 10 回リトライ(5 秒間隔)
同時デプロイの抑止

concurrency.group: deploy-workers かつ cancel-in-progress: false を指定しています。wrangler deploy最後に成功したものが有効になるため、並行実行すると意図しないリビジョンが 残る可能性があります。実行中のデプロイはキャンセルせず、順番に流します。

E2E テスト

E2E は外部環境へデプロイせず、ランナー上で wrangler dev を起動して http://127.0.0.1:8787 に対して実行します。バインディングは .dev.vars.example.dev.vars にコピーして用意するため、 シークレットを必要としません。

GitHub Secrets

Secret 名 用途
CLOUDFLARE_API_TOKEN wrangler deploy の認証
CLOUDFLARE_ACCOUNT_ID デプロイ先アカウントの指定
CLAUDE_CODE_OAUTH_TOKEN claude-code-review.yml(organization secret)

Azure 認証も 1Password 連携も持ちません。WRANGLER_SEND_METRICS: 'false' を 指定してテレメトリを無効にしています。

Workers Secret の投入

テナント設定(MOCKIDP_{DEV,STAGING,PRODUCTION}_*)と署名鍵 (TOKEN_SIGNING_KEY)は Workers Secret として保持します。

CI では投入しない

wrangler deploy は Workers Secret を上書きしません。そのため deploy.yml はシークレットを投入せず、値を変更するときだけローカルから 手動で流します。wrangler.jsonc にも書きません。このリポジトリは公開であり、 staging / production の redirect_uri は EcAuth のデプロイ先 URL を含むためです。

eval $(op signin)

op run --env-file=.env.workers.tpl -- node scripts/collect-secrets.mjs \
  | pnpm exec wrangler secret bulk

op run は復号値をサブプロセスの環境変数にだけ渡し、パイプでそのまま wrangler に流すため、平文がディスクに残りません。

KV Namespace

使用済み認可コードのマーカー(jti"1")を記録するために USED_CODES バインディングを使います。機密情報は保存しません。KV は結果整合の ため、単回使用の完全な保証にはなりません。

pnpm exec wrangler kv namespace create USED_CODES

出力された id を wrangler.jsonc に記載してコミットします。KV namespace ID は 秘匿情報ではないため、公開リポジトリに含めて問題ありません。

ヘルスチェック

/healthz が 200 を返すことを、デプロイ直後に最大 10 回(5 秒間隔)確認します。 10 回失敗するとワークフローが失敗します。

EcAuth 側からの参照

EcAuth から MockIdP へ接続するための情報(エンドポイント、クライアント資格情報)は 1Password に置いてあり、参照するのは EcAuth 側のワークフローです。MockIdP 自身は 1Password を参照しません。

1Password アイテム 用途
mockidp-dev ローカル Docker 開発と EcAuth の E2E
mockidp-staging EcAuth ステージング環境からの連携
mockidp-production EcAuth 本番環境からの連携
mockidp-workers Workers Secret 投入用(.env.workers.tpl が参照)

関連ドキュメント