refactor(build,src): testkit 소스셋 이관과 빌드 게이트 정상화, 미추적 빌드 파일 추적
한 커밋인 이유: src/build.gradle 안에서 ca.testkit-publisher 플러그인 제거와
게이트 수정이 얽혀 있다. 플러그인 적용부만 빼면 web·websocket·persistence-jpa·
persistence-mongo·app-bootstrap 이 사라진 testkitPublisher() 와 *Testkit
컨피규레이션을 계속 참조해 설정 단계에서 빌드가 죽는다. 파일 단위로 나눌 수 없다.
1) testkit 소스셋 → Gradle 표준 java-test-fixtures 이관
web, websocket, persistence-jpa, persistence-mongo, httpclient, graphql 과
이들의 testkit 컨피규레이션을 소비하던 app-bootstrap.
자체 제작 ca.testkit-publisher.gradle 77줄이 사라진다.
2) 실행되지 않거나 실패할 수 없던 빌드 게이트 정상화 (E등급)
- strict-test-lane 의 실행 카운터가 skip 을 실행으로 세던 것 수정.
전부 skip 인 레인은 이제 실패한다 (회귀 테스트 2건 추가)
- public-path 스냅샷이 gitignore 된 src/.env 를 읽던 것을
config/security.yml 의 바인딩 기본값으로 교체
- verifyEnvKeys 가 build/ 산출물을 소스로 읽어 삭제된 키를 사용 중으로
오판하던 것 수정 (입력 4,637 → 4,630 파일)
- jpa-evidence 가 git 실패를 "워크트리 깨끗함"으로 읽던 것을 fail-closed 로
- notification-evidence 의 Grade 열 탐지를 헤더 기준으로 교체 +
표 부재 시 fail-closed
- spring70CompatibilityTest 가 레인을 복제하며 잃은 fail-closed 복구
(태스크명 유지 — 워크플로 3곳과 gate-matrix 린트 무손상)
- 메시징 R2 스켈레톤 주변의 도달 불가 검증 45줄을 MSG-015 명시적 실패로 교체
3) git 에 없던 빌드 필수 파일 추적
- src/gradle/libs.versions.toml — src/build.gradle 이 9곳에서 참조하는데
추적되지 않아 깨끗한 체크아웃에서 설정이 실패했다
- app-bootstrap config/*.yml 15개 — application.yml 이 전부 import 한다.
하드코딩된 시크릿은 없고 값은 secret://environment/APP_* 참조다
4) 진행 중이던 구현 작업 반영 (redis/idempotency 구성, startup 검증,
아키텍처 테스트 클래스, notification 콜백 레지스트리 등)
검증:
- 깨끗한 체크아웃에서 ./gradlew help 통과
- :app-bootstrap:test --tests 'dev.caskeleton.bootstrap.architecture.*'
→ 20개 클래스 174 tests, 실패 0, 스킵 0 (이전에는 0개 실행)
미해결: verifyOneTypePerFile 은 손대지 않았다(Checkstyle 로 교체 권고).
B/C/D 등급 100여 건과 CI 단계 분리는 별도 작업 —
docs/superpowers/plans/2026-09-16-ci-stage-separation.md 참고.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e34519113b
commit
1535481794
@@ -1,3 +1,6 @@
|
||||
// Shared test code as a Gradle test-fixtures variant — ADR-BUILD-001.
|
||||
apply plugin: 'java-test-fixtures'
|
||||
|
||||
// JPA persistence adapter — merged RDBMS base + PostgreSQL vendor module.
|
||||
// Owns JPA entities, Spring Data repositories, mappers, transaction/audit/lock/outbox port
|
||||
// implementations, and the vendor-neutral SPI interfaces (OutboxClaimRepository /
|
||||
@@ -14,23 +17,13 @@
|
||||
// the design's "no production module depends on the testkit" guarantee without a new Gradle project.
|
||||
strictTestLanes {
|
||||
sourceSet('postgresqlIntegrationTest') {
|
||||
compilesAgainst 'main'
|
||||
// 'testFixtures' as well as 'main': the integration lane consumed the testkit through the
|
||||
// convention's `consumedBy 'test', 'postgresqlIntegrationTest'`, and java-test-fixtures only
|
||||
// wires `test` on its own. The lane has to say so (ADR-BUILD-001).
|
||||
compilesAgainst 'main', 'testFixtures'
|
||||
inherits 'implementation', 'compileOnly', 'runtimeOnly', 'annotationProcessor'
|
||||
}
|
||||
sourceSet('testkit') { compilesAgainst 'main' }
|
||||
sourceSet('jpaPlatformPerformanceTest') { compilesAgainst 'main', 'testkit' }
|
||||
}
|
||||
|
||||
// The testkit as a consumable artifact.
|
||||
//
|
||||
// The rule pack in `testkit` was only ever exercised by its own fixture tests: nothing imported the
|
||||
// production graph and ran the rules against it, so "controller must not expose an entity" and
|
||||
// "domain must not depend on Hibernate" were verified as library code and applied to nothing. The
|
||||
// composition root is the only place that can see every runtime leaf at once, so it is where the
|
||||
// production suite belongs — and it needs the rules.
|
||||
testkitPublisher {
|
||||
consumedBy 'test', 'postgresqlIntegrationTest'
|
||||
publishAs 'jpaTestkit'
|
||||
sourceSet('jpaPlatformPerformanceTest') { compilesAgainst 'main', 'testFixtures' }
|
||||
}
|
||||
|
||||
ext.jpaPostgreSqlEvidenceImage = 'postgres:16-alpine'
|
||||
@@ -71,19 +64,31 @@ dependencies {
|
||||
|
||||
testImplementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'
|
||||
testImplementation 'org.hibernate.orm:hibernate-envers'
|
||||
testImplementation 'com.tngtech.archunit:archunit-junit5:1.3.0'
|
||||
testImplementation libs.archunit.junit5
|
||||
|
||||
postgresqlIntegrationTestImplementation 'org.testcontainers:testcontainers-postgresql'
|
||||
postgresqlIntegrationTestImplementation 'org.testcontainers:testcontainers-junit-jupiter'
|
||||
postgresqlIntegrationTestImplementation 'org.testcontainers:testcontainers-toxiproxy'
|
||||
postgresqlIntegrationTestRuntimeOnly 'org.postgresql:postgresql'
|
||||
|
||||
testkitImplementation 'org.testcontainers:testcontainers'
|
||||
testkitImplementation 'org.testcontainers:testcontainers-postgresql'
|
||||
testkitImplementation 'org.testcontainers:testcontainers-junit-jupiter'
|
||||
testkitImplementation 'org.testcontainers:testcontainers-toxiproxy'
|
||||
testkitImplementation 'com.tngtech.archunit:archunit-junit5:1.3.0'
|
||||
testkitRuntimeOnly 'org.postgresql:postgresql'
|
||||
// Declared rather than inherited: the `testkit` source set extended testImplementation, so the
|
||||
// fixtures compiled against every test library this leaf declared without stating any of them
|
||||
// (ADR-BUILD-001). Listing them makes the fixtures' own surface reviewable.
|
||||
testFixturesImplementation 'jakarta.persistence:jakarta.persistence-api'
|
||||
testFixturesImplementation 'org.hibernate.orm:hibernate-envers'
|
||||
testFixturesImplementation 'org.flywaydb:flyway-core'
|
||||
testFixturesImplementation 'org.springframework:spring-jdbc'
|
||||
// The rule pack names Spring Data's Repository marker in a rule; it needs the type on the
|
||||
// compile classpath even though it never calls it.
|
||||
testFixturesImplementation 'org.springframework.data:spring-data-commons'
|
||||
testFixturesImplementation 'org.junit.jupiter:junit-jupiter-api'
|
||||
testFixturesImplementation libs.toxiproxy.java
|
||||
testFixturesImplementation 'org.testcontainers:testcontainers'
|
||||
testFixturesImplementation 'org.testcontainers:testcontainers-postgresql'
|
||||
testFixturesImplementation 'org.testcontainers:testcontainers-junit-jupiter'
|
||||
testFixturesImplementation 'org.testcontainers:testcontainers-toxiproxy'
|
||||
testFixturesImplementation libs.archunit.junit5
|
||||
testFixturesRuntimeOnly 'org.postgresql:postgresql'
|
||||
|
||||
// The performance lane starts its own servers: pool saturation is only observable against a
|
||||
// real database, because the thing being measured is what happens when every connection to it
|
||||
@@ -354,3 +359,4 @@ apiSurface {
|
||||
}
|
||||
|
||||
apply from: rootProject.file('gradle/jpa-evidence.gradle')
|
||||
|
||||
|
||||
Reference in New Issue
Block a user