0015. 品質ゲート (CI + 規律ベース運用 + 秘密スキャン)¶
- ステータス: Accepted(実装済み)
- 関連: 0001 モノレポ構成 / 0010 環境分割 / 0014 フロントエンド技術選定
コンテキストと課題¶
少人数開発で品質を保ちたいが、GitHub Free 組織の private リポジトリでは Branch Protection / Rulesets が使えないため、マージを機械的に強制できない。そこで「CI による自動チェック」と 「規律 (convention) ベースの運用」を組み合わせ、壊れたコードや秘密の混入を防ぐ仕組みが要る。
決定¶
1. CI 品質ゲート (自動・ci.yml)¶
.github/workflows/ci.yml が 全 PR と main/develop への push で次を実行する:
pnpm lint # Biome (lint + format チェック)
pnpm turbo run typecheck test build # tsc --noEmit / vitest run / ビルド
Vite の env はビルド時 inline されるため、CI ではダミー値を渡してビルドが落ちないようにする。
2. テスト (Vitest)¶
- フレームワークは Vitest。テスト環境は Web =
happy-dom、API / shared / scripts =node。 - 規律: 新規ロジックは「コード + テストをセット」で push し、追加ロジックには最低 1 件の正常系テストを書く
(
packages/shared/**の Zod/定数/純関数、apps/web/**の mapper/resolver 等)。
3. Lint / Format (Biome)¶
- Biome に一本化 (ESLint / Prettier は不採用)。
biome.json: 2 スペース・lineWidth 100・LF、organizeImports、recommended ルール +noNonNullAssertion: warn+noExplicitAny: warn、 JS は single quote / JSX double / trailing all / semicolons always。
4. 規律ベース運用 (CONTRIBUTING.md)¶
- Branch Protection が使えないため、ブランチ戦略・PR フロー・コミット規約・セルフレビューチェックリストを
CONTRIBUTING.mdで 規律として 定める (main直 push 禁止、develop→mainは PR 経由 等)。 GitHub Team 以上にアップグレードした際は同内容を Branch Protection / Ruleset として有効化する。
5. 秘密・SAST スキャン (レビュー時)¶
- Gitleaks (シークレットスキャン) を使う。リポジトリには
.gitleaksignoreがコミットされており、 検証スクリプトに過去含まれた 公開 Supabase anon (publishable) key の履歴一致を allowlist している (公開鍵ゆえ無害)。秘密の非コミットは CONTRIBUTING の方針 (§7) とセルフレビュー (§8) でも担保する。 - Semgrep (SAST、無料 OSS ルール) は コードレビュー時の運用 として用いる。実際に
shell-injection ルールを満たす書き方をコード内コメントで明示している
(
initial-setup.ymlのsemgrep run-shell-injection 対策)。
影響 (Consequences)¶
良い点¶
- Biome + tsc + Vitest + build を 1 つの CI で回し、ローカルでも
pnpm lint && pnpm turbo run typecheck test buildの同一コマンドで再現できる。lint/format を Biome に統一して設定の二重管理を避ける。 - テスト環境をパッケージ特性に合わせて分離 (Web=happy-dom / それ以外=node) でき、過不足ない依存で速い。
- 秘密混入は Gitleaks (+
.gitleaksignoreによる誤検知管理) とセルフレビューで多層に防ぐ。
トレードオフ / 注意点¶
- Gitleaks / Semgrep は CI に組み込まれていない。CI (
ci.yml) が回すのは Biome / typecheck / test / build のみで、CONTRIBUTING.mdにも Gitleaks/Semgrep の記載はない。両者は レビュー時の 運用 であり、実行はレビュアーの規律に依存する (Gitleaks は.gitleaksignoreの存在が痕跡、Semgrep は 専用設定ファイルを持たない)。CI への組込みは将来の改善余地。 - 強制力が規律ベース。Branch Protection が無いため、品質ゲートは技術的にはバイパス可能で、運用の 徹底に依存する (Team 以上で Ruleset 化する前提)。
- Web のコンポーネント描画テストは React インスタンス二重化のため
vitest.configの alias 固定が必要、 という happy-dom 環境固有の注意点がある (ADR 0014)。
根拠 (典拠)¶
.github/workflows/ci.yml:9-13,49-61— トリガー (main/develop の push + PR)、pnpm lintとpnpm turbo run typecheck test build。CONTRIBUTING.md:3-7,75-93,95-112,160-169— 規律ベース運用 (Branch Protection 不可)、Vitest 方針、ローカル品質確認コマンド、セルフレビューチェックリスト。biome.json— formatter / linter (recommended +noNonNullAssertion/noExplicitAnywarn) / JS スタイル。apps/web/vitest.config.ts(environment: 'happy-dom') /apps/api/vitest.config.ts・packages/shared/vitest.config.ts(environment: 'node')。.gitleaksignore— 公開 Supabase anon key の履歴一致を allowlist (Gitleaks 利用の痕跡)。.github/workflows/initial-setup.yml:60—semgrep run-shell-injection 対策のコメント (Semgrep ルールを満たす書き方)。README.md:13,125-128— Biome 採用、規律ベース運用の注記。