The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
135 lines
8.2 KiB
Plaintext
135 lines
8.2 KiB
Plaintext
# gradle 판
|
|
Gradle 9.0.0
|
|
|
|
# grpc-testkit 이 등록하는 레인 넷과 각각의 태그
|
|
grpc-testkit/build.gradle:15 lane('grpcInProcessContractTest') {
|
|
grpc-testkit/build.gradle:16 tag = 'grpc-inprocess'
|
|
grpc-testkit/build.gradle:20 lane('grpcNettyContractTest') {
|
|
grpc-testkit/build.gradle:21 tag = 'grpc-netty'
|
|
grpc-testkit/build.gradle:25 lane('grpcFaultTest') {
|
|
grpc-testkit/build.gradle:26 tag = 'grpc-fault'
|
|
grpc-testkit/build.gradle:30 lane('grpcPerformanceTest') {
|
|
grpc-testkit/build.gradle:31 tag = 'grpc-performance'
|
|
|
|
# 기본 test 에 실제로 걸리는 제외 태그는 두 곳에서 온다
|
|
build.gradle:548: // (the skeleton default) excludeTags is a no-op.
|
|
build.gradle:551: excludeTags 'quarantine'
|
|
grpc/grpc-testkit/build.gradle:42: excludeTags 'grpc-performance'
|
|
grpc-testkit/build.gradle:37 // The performance lane is excluded from the default `test` task. It measures a running server
|
|
grpc-testkit/build.gradle:38 // under load, and a measurement in the release gate is a flaky test on a shared CI runner; it runs
|
|
grpc-testkit/build.gradle:39 // when somebody asks for it, by name.
|
|
grpc-testkit/build.gradle:40 tasks.named('test') {
|
|
grpc-testkit/build.gradle:41 useJUnitPlatform {
|
|
grpc-testkit/build.gradle:42 excludeTags 'grpc-performance'
|
|
grpc-testkit/build.gradle:43 }
|
|
grpc-testkit/build.gradle:44 }
|
|
grpc-testkit 안의 quarantine 태그 : 0 건
|
|
|
|
# 레인 태그는 클래스 단위인가
|
|
testkit/GrpcInProcessContractFixtureTest.java:22:@Tag("grpc-inprocess")
|
|
testkit/GrpcInProcessContractFixtureTest.java-23-class GrpcInProcessContractFixtureTest {
|
|
testkit/GrpcNettyContractProfileTest.java:24:@Tag("grpc-netty")
|
|
testkit/GrpcNettyContractProfileTest.java-25-class GrpcNettyContractProfileTest {
|
|
testkit/GrpcTransportEvidenceClassifierTest.java:37:@Tag("grpc-fault")
|
|
testkit/GrpcTransportEvidenceClassifierTest.java-38-class GrpcTransportEvidenceClassifierTest {
|
|
performance/GrpcPerformanceLaneTest.java:32:@Tag("grpc-performance")
|
|
performance/GrpcPerformanceLaneTest.java-33-class GrpcPerformanceLaneTest {
|
|
|
|
# check 의 태스크 그래프 — 시험을 돌리지 않고 확인한다
|
|
$ ./gradlew :grpc:grpc-testkit:check --dry-run GRADLE_EXIT=0
|
|
:grpc:grpc-testkit:compileJava SKIPPED
|
|
:grpc:grpc-testkit:processResources SKIPPED
|
|
:grpc:grpc-testkit:classes SKIPPED
|
|
:grpc:grpc-testkit:checkstyleMain SKIPPED
|
|
:grpc:grpc-testkit:compileTestJava SKIPPED
|
|
:grpc:grpc-testkit:processTestResources SKIPPED
|
|
:grpc:grpc-testkit:testClasses SKIPPED
|
|
:grpc:grpc-testkit:checkstyleTest SKIPPED
|
|
:grpc:grpc-testkit:spotbugsMain SKIPPED
|
|
:grpc:grpc-testkit:spotbugsTest SKIPPED
|
|
:grpc:grpc-testkit:spotlessJava SKIPPED
|
|
:grpc:grpc-testkit:spotlessJavaCheck SKIPPED
|
|
:grpc:grpc-testkit:spotlessCheck SKIPPED
|
|
:grpc:grpc-testkit:test SKIPPED
|
|
:grpc:grpc-testkit:check SKIPPED
|
|
그 그래프 안의 레인 태스크 : 0 건
|
|
|
|
# 낡은 결과를 지우고 세 레인을 이름으로 돌린다
|
|
실행 전 남아 있는 결과 XML : 0 건
|
|
$ ./gradlew :grpc:grpc-testkit:{grpcInProcessContractTest,grpcNettyContractTest,grpcFaultTest}
|
|
BUILD SUCCESSFUL
|
|
GRADLE_EXIT=0
|
|
[grpcInProcessContractTest]
|
|
GrpcInProcessContractFixtureTest tests=7 failures=0 errors=0 skipped=0
|
|
시험 7 개
|
|
[grpcNettyContractTest]
|
|
GrpcNettyContractProfileTest tests=9 failures=0 errors=0 skipped=0
|
|
시험 9 개
|
|
[grpcFaultTest]
|
|
GrpcTransportEvidenceClassifierTest tests=9 failures=0 errors=0 skipped=0
|
|
시험 9 개
|
|
|
|
# 같은 leaf 의 기본 test 를 돌린다
|
|
$ ./gradlew :grpc:grpc-testkit:test
|
|
BUILD SUCCESSFUL
|
|
GRADLE_EXIT=0
|
|
GrpcPerformanceGateTest tests=7 failures=0 errors=0 skipped=0
|
|
GrpcStableReleaseGateTest tests=9 failures=0 errors=0 skipped=0
|
|
GrpcInProcessContractFixtureTest tests=7 failures=0 errors=0 skipped=0
|
|
GrpcNettyContractProfileTest tests=9 failures=0 errors=0 skipped=0
|
|
GrpcServerStreamingContractTest tests=7 failures=0 errors=0 skipped=0
|
|
GrpcTransportEvidenceClassifierTest tests=9 failures=0 errors=0 skipped=0
|
|
GrpcUnaryReliabilityContractTest tests=8 failures=0 errors=0 skipped=0
|
|
시험 56 개
|
|
|
|
# 레인이 돌린 시험이 기본 test 가 돌린 시험의 부분집합인가
|
|
레인 25 개 · 기본 test 56 개
|
|
레인이 돌린 시험이 기본 test 안에 전부 있는가 : True
|
|
기본 test 에만 있는 시험 : 31 개
|
|
성능 레인 클래스가 기본 test 결과에 있는가 : 0 건
|
|
|
|
# 레인 태스크만 거는 보증
|
|
ca.strict-test-lane.gradle:4 // useJUnitPlatform { includeTags }, failOnNoDiscoveredTests, outputs.upToDateWhen { false } — once per
|
|
ca.strict-test-lane.gradle:6 // `failOnNoDiscoveredTests` and `upToDateWhen { false }`, and a lane that is added by copy-paste is a
|
|
ca.strict-test-lane.gradle:23 // What a leaf may still not do is opt out of failing closed. There is no `failOnNoDiscoveredTests`
|
|
ca.strict-test-lane.gradle:237 failOnNoDiscoveredTests = true
|
|
ca.strict-test-lane.gradle:239 // And it is not sufficient, which a TestKit fixture established. `failOnNoDiscoveredTests`
|
|
ca.strict-test-lane.gradle:240 // applies to discovery; a tag filter excludes tests *after* discovery, so a lane whose tag
|
|
ca.strict-test-lane.gradle:245 // So the lane counts what it actually executed and refuses zero.
|
|
ca.strict-test-lane.gradle:246 def executedTests = new java.util.concurrent.atomic.AtomicLong(0L)
|
|
ca.strict-test-lane.gradle:247 def executedSelectors =
|
|
ca.strict-test-lane.gradle:250 executedTests.incrementAndGet()
|
|
ca.strict-test-lane.gradle:252 executedSelectors.add(descriptor.className as String)
|
|
ca.strict-test-lane.gradle:253 executedSelectors.add("${descriptor.className}.${descriptor.name}" as String)
|
|
ca.strict-test-lane.gradle:257 if (executedTests.get() == 0L) {
|
|
ca.strict-test-lane.gradle:258 throw new GradleException(
|
|
ca.strict-test-lane.gradle:276 !executedSelectors.any { String executed ->
|
|
ca.strict-test-lane.gradle:285 throw new GradleException(
|
|
ca.strict-test-lane.gradle:293 outputs.upToDateWhen { false }
|
|
ca.strict-test-lane.gradle:299 // failOnNoDiscoveredTests is not enough on its own, which a TestKit fixture established rather
|
|
ca.strict-test-lane.gradle:320 throw new GradleException(
|
|
ca.strict-test-lane.gradle:333 throw new GradleException(
|
|
ca.strict-test-lane.gradle:342 throw new GradleException(
|
|
ca.strict-test-lane.gradle:347 throw new GradleException(
|
|
|
|
# 레인 태스크를 자동으로 부르는 경로
|
|
grpc-testkit/build.gradle 이 check 를 언급하는가 : 0 건
|
|
워크플로 28 개 중 grpc 를 언급하는 것 : 0 건
|
|
ci-quality-gates.yml:48 - name: Check quality, public paths, and dependency locks
|
|
ci-quality-gates.yml:49 working-directory: src
|
|
ci-quality-gates.yml:50 run: ./gradlew check verifyPublicPathSnapshot verifyDependencyLocks --warning-mode=fail --no-daemon --stacktrace
|
|
ci-quality-gates.yml:51 # Named as its own step because nothing else runs it: `check` does not depend on
|
|
ci-quality-gates.yml:52 # graphqlStableTest, so the lane's required-class guard — the check that its module-boundary
|
|
ci-quality-gates.yml:53 # suite has not silently stopped being discovered — protected nothing in CI. A separate step
|
|
ci-quality-gates.yml:54 # keeps the aggregate invocation below byte-identical, which ConditionalTransportQualification
|
|
ci-quality-gates.yml:55 # ContractTest asserts on, and the two tasks do not overlap.
|
|
ci-quality-gates.yml:56 - name: Qualify the GraphQL Stable lane
|
|
ci-quality-gates.yml:57 working-directory: src
|
|
ci-quality-gates.yml:58 run: ./gradlew :adapter:inbound:graphql:graphqlStableTest --no-daemon --stacktrace
|
|
ci-quality-gates.yml:59 - name: Qualify opt-in inbound transports without skips
|
|
ci-quality-gates.yml:60 working-directory: src
|
|
ci-quality-gates.yml:61 run: ./gradlew conditionalTransportQualification --no-daemon --stacktrace
|
|
그 마지막 스텝이 부르는 태스크가 무엇을 요구하는가 :
|
|
src/build.gradle:594 'test-results/grpcTransportQualificationTest'),
|
|
src/build.gradle:606 dependsOn ':adapter:inbound:grpc:grpcTransportQualificationTest'
|