CI で構造を守る
なぜ CI に置くのか
「domain 層から infra を呼ばない」といった決めごとは、レビューでは守れません。 人間は差分しか見ないので、全体構造の劣化は差分に現れないからです。 strata check はその判定を機械に任せ、違反があれば exit 1 で落とします。
最小構成
name: architecture
on: [pull_request]
jobs:
strata:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: '24' }
- run: npx --yes github:makoto-developer/strata check .
何を検査できるか
| 検査 | 設定 | 落ちる条件 |
|---|---|---|
| 循環依存 | 既定で有効 | 循環が 1 つでもある |
| 禁止依存ルール | forbidden | 宣言した依存が存在する |
| 結合度のしきい値 | thresholds | 循環数・不安定度・依存先数が上限超過 |
{
"forbidden": [
{ "name": "domain-no-infra", "from": "**/domain", "to": "**/infra",
"comment": "ドメイン層はインフラを参照しない" }
],
"thresholds": { "maxCycles": 0, "maxInstability": 0.85, "maxEfferent": 8 }
}
既存の負債で落ちてしまうとき
いきなり 0 件にはできないので、現状を基準線として許容し、新規だけ落とすやり方があります。
strata check . --update-baseline # 今ある循環を .strata-baseline.json に記録
strata check . --baseline # 以後は新規の循環だけ fail
PR に注釈を出す(SARIF)
- run: npx --yes github:makoto-developer/strata check . --sarif strata.sarif || true
- uses: github/codeql-action/upload-sarif@v3
with: { sarif_file: strata.sarif }
GitHub Code Scanning に取り込まれ、該当行に注釈が付きます。
差分だけ見る
strata diff . --base origin/main # 依存の増減・新規/解消した循環
「この PR で層をまたぐ依存が増えていないか」をレビュー前に確認できます。