CI 커버리지 — 테스트 → 잡 매핑
읽기 안내
이 표는 어떤 CI Job에서 어떤 테스트가 실제 실행되는지 설명합니다. 모든 런타임·PG가 검증됐다는 뜻은 아닙니다.
보안·실 PG·스테이징 검증을 주장하기 전에 수동 실행 또는 Gate 전용 검사를 확인하세요.
워크플로: .github/workflows/yetdapay.yml — 트리거 pull_request (paths: nougat-devpay/**, .github/workflows/yetdapay.yml) + workflow_dispatch. 모든 잡은 ubuntu-latest, Node 22에서 실행.
이것은 제품화 작업의 PR 검증 표면입니다(R4 §8.5). 아래 모든 잡은 하드 게이트 — || true 없음, continue-on-error 없음.
제품 플레인 잡 (p5)
| 잡 | 스텝 | 명령 | 증명하는 것 |
|---|---|---|---|
product-suites | license-crypto | be-cloudflare/license-crypto에서 cargo test | JWS/PoP 서명/검증, alg 혼동 + 잘못된 issuer/키 거부(43 테스트) |
product-suites | 영속 권한 E2E | be-cloudflare에서 bash tests/run-durable.sh | worker-build → 로컬 D1 마이그레이션 001–017 + seeds/demo.sql + tests/fixtures.sql → wrangler dev --local → durable.test.mjs(55개 어서션: PAY 멱등성/웹훅 dedup, INBOX 충돌, LIC 만료/폐기/크로스 테넌트 404/401, USE 카운터, REC findings+autofix, OUTBOX 재구동)을 mock이 아닌 실제 miniflare sqlite에서 |
product-suites | yp e2e | node --test tools/devpay-cli/tests/e2e.test.mjs | init/plan/apply/review/verify/doctor 라이프사이클 + 회귀 레그(공허 verify, auth 고정, TOCTOU 바인드, env 스크럽, 순회) |
product-suites | auto-protection 스위트 | experiments/auto-protection에서 node <suite>/tests/run.mjs ×8 (WABT_BIN=/usr/bin, apt wabt 설치) | spec, planner, analyzer(static/dynamic/classify/determinism/bigint/wasm/protection — wasm 레그는 wabt의 wasm-objdump -x/-d 필요), partitioner(transform/hardening/sandbox-globals/select/equivalence), track-a, track-b, evidence(record/validate), metrics(reproducibility/traceability) — node:test, 루프백 전용 서버 |
security-regression | 아티팩트 검증 | experiments/auto-protection에서 node red-team/tests/run.mjs | 커밋된 r18 47레그 배터리 아티팩트: 스키마, 결과 열거, 실행된 클레임당 디스크 증거, matrix↔results 일치, REA 호출의 실제 sha256(13 검사) |
security-regression | p4 배터리 (조건부) | be-cloudflare/tests/red-team/run.sh 아니면 run.mjs | 아직 랜딩 안 됨 — 스텝은 파일 존재에 if: 게이트됨; 없으면 통과가 아닌 스킵되고 ::notice::로 실행 주석. p4가 머지되면 worker-build + wrangler v4 사전 설치로 실행; 자체 wrangler dev 하니스를 오케스트레이션할 수 있도록 run.sh 선호 |
기존 잡 (변경 없음)
| 잡 | 커버 |
|---|---|
cf-worker-build | cargo build --release --target wasm32-unknown-unknown (be-cloudflare) |
proto-check | buf lint + PR 베이스 대비 buf breaking (contracts/) — buf.yaml만 읽음; contracts/buf.gen.yaml은 의도적으로 미사용 데드 설정(buf generate 스텝 없음; BE 타입은 be/build.rs protox+prost-build에서) |
be-test | cargo test (axum be/: unit/integration/security/outbox/migration) |
fe-check | pnpm vue-tsc --noEmit |
e2e | 실제 be 바이너리에 대한 Playwright, dev auth, 임시 sqlite — be-test + fe-check 필요 |
docker-smoke | compose build/up, FE 프록시 → BE health, prod-auth fail-closed 401 — be-test + fe-check 필요 |
여전히 게이트 전용 (CI에 없음)
| 항목 | 이유 | 실행 위치 |
|---|---|---|
REA MCP 중량 레그 (reajail-*, 라이브 바이너리/세션 프로브) | REA MCP 툴체인 + 대화형 에이전트 런타임 필요; CI는 기록된 아티팩트만 검증(security-regression 스텝) | 수동 에이전트 게이트 — experiments/auto-protection/results/rea-mcp/ 참조 |
red-team/unified-attacks.mjs 라이브 재실행 (47 레그) | 파티션 서버 + 브라우저 레그를 로컬에서 spawn; 수 분, 연구 표면 범위. 아티팩트 검증은 CI; 재실행은 릴리스 게이트 결정 | 수동: node unified-attacks.mjs 후 node red-team/tests/run.mjs |
프로덕션/스테이징 배포 (wrangler deploy, Pages 배포, 원격 D1) | Charter §0: 스테이징 우선, 프로덕션은 명시적 사용자 승인 필요 | 배포 스크립트로만 수동 |
| 원격 D1 마이그레이션 / 시드 / 리셋 | 동일 승인 게이트 | 수동 |
CI 유지보수자 노트
run-durable.sh는npx wrangler를 호출; 잡은[email protected]을 전역 설치(정확한 고정 = 로컬 검증 버전)하여 npx가 PATH에서 해결.worker-build는be-cloudflare/Cargo.toml의worker = "0.8"을 추적하도록0.8.7로 고정 — 함께 범프.- 워크플로는
permissions: contents: read— 모든 잡은 빌드/테스트만;contents:write/packages/id-token이 필요한 스텝 없음. 배포는 수동 유지. - 서드파티 액션은 태그 고정 유지(
@v4,@stable) — 수용된 LOW 리스크; 전체 SHA 고정 + Dependabot 업데이트는 향후 강화 항목(워크플로 상단에 인라인 노트). run-durable.sh는.dev.vars를 씀(git 무시, 테스트 전용 더미 키 —TOSS_*는test_접두어,TOSS_API_BASE는 루프백 스텁).wrangler dev --local+ miniflare 로컬 D1은 GH ubuntu 러너에서 동작(로컬에서 동등 검증: 55/55 PASS, wrangler 4.156.0, node 22).- wabt는 분석기 wasm 레그의 테스트 의존성: 잡이
apt-get install -y wabt(Ubuntu universe → 1.0.34)하고WABT_BIN=/usr/bin을 auto-protection 스텝에 export.wasm-objdump -x/-d만 사용하므로 배포판 버전으로 충분 — 추출된 noble .deb에 대해 로컬 검증됨(analyzer 61/61 PASS).analyzer/lib/wasm.mjs해결 순서:wabtBin옵션 →WABT_BINenv →PATH; wabt 없으면 정직하게binary-fallback(callGraph null, requiresWabt)로 디그레이드하고 wabt 경로 어서션이 실패 — 도구는 CI에서 하드 의존성. experiments/auto-protection아래 실행 소스에/home/...머신 로컬 경로 없음(analyzer/lib/wasm.mjs,red-team/*.mjs,exp*/build.mjs는 이제WABT_BIN/REA_BIN/CHROME_EXE/PLAYWRIGHT_NODE_MODULESenv → PATH로 해결).results/**/evidence/**JSON 내부의 절대 경로는 기록된 과거 증거 — 실행된 경로가 아닌 테스트 입력 — 이며 의도적으로 재작성하지 않음.- p4 레드팀 배터리 랜딩은
tests/red-team/run.{mjs,sh}를 자체 완결 (run-durable.sh처럼 자체 dev 서버 오케스트레이션)로 유지해야 하고, 그렇지 않으면security-regression스텝을 재검토해야 함.