|
| 1 | +# 2026-03-26-grb-02-backend-verification-hardening |
| 2 | + |
| 3 | +- Issue ID: `GRB-02` |
| 4 | +- GitHub Issue: `alexization/git-ranker#74` |
| 5 | +- GitHub PR: `alexization/git-ranker#75` |
| 6 | +- Status: `Completed` |
| 7 | +- Repository: `git-ranker` |
| 8 | +- Branch Name: `feat/grb-02-backend-verification-hardening` |
| 9 | +- Merged Commit: `64c0541` |
| 10 | +- Task Slug: `2026-03-26-grb-02-backend-verification-hardening` |
| 11 | + |
| 12 | +## Problem |
| 13 | + |
| 14 | +`git-ranker`의 `./gradlew integrationTest`는 Docker daemon이 내려가 있으면 Testcontainers 초기화 단계에서 바로 `ContainerFetchException`과 `DockerClientProviderStrategy` 예외를 내고 실패한다. 현재 출력만으로는 환경 문제인지 코드 회귀인지 빠르게 구분하기 어렵다. |
| 15 | + |
| 16 | +## Why Now |
| 17 | + |
| 18 | +`GRB-02`는 backend 검증 루프를 하네스 친화적으로 만드는 작업이다. 이후 `GRW-05` 표준 검증 런타임과 ranking harness 검증이 안정적으로 동작하려면 Docker 의존 통합 테스트가 fail-fast 하면서도 원인을 명확히 드러내야 한다. |
| 19 | + |
| 20 | +## Scope |
| 21 | + |
| 22 | +- Docker preflight를 `integrationTest` 실행 전에 추가 |
| 23 | +- Docker 미가동/미설치 상황에서 명확한 실패 메시지 제공 |
| 24 | +- unit, coverage, integration 검증 절차를 backend 문서에 정리 |
| 25 | +- 실제 로컬 환경에서 unit/coverage와 integration 경로를 재검증 |
| 26 | + |
| 27 | +## Non-scope |
| 28 | + |
| 29 | +- 비즈니스 기능 변경 |
| 30 | +- Testcontainers 기반 통합 테스트 구조 전면 리팩터링 |
| 31 | +- workflow 런타임 또는 CI 파이프라인 변경 |
| 32 | + |
| 33 | +## Write Scope |
| 34 | + |
| 35 | +- `git-ranker` Gradle/test/doc 관련 파일 |
| 36 | +- `docs/exec-plans/` |
| 37 | + |
| 38 | +## Outputs |
| 39 | + |
| 40 | +- Docker preflight Gradle task 또는 동등한 fail-fast 실행 경로 |
| 41 | +- preflight 메시지를 뒷받침하는 테스트 자산 |
| 42 | +- backend 검증 절차 문서 |
| 43 | +- `GRB-02` 실행 기록 |
| 44 | + |
| 45 | +현재 산출물: |
| 46 | + |
| 47 | +- `git-ranker/build.gradle`의 `verifyDockerAvailable`, `integrationTest` 연결 |
| 48 | +- `git-ranker/src/test/java/com/gitranker/api/testsupport/DockerPreflightCheck.java` |
| 49 | +- `git-ranker/src/test/java/com/gitranker/api/testsupport/DockerPreflightMain.java` |
| 50 | +- `git-ranker/src/test/java/com/gitranker/api/testsupport/DockerPreflightCheckTest.java` |
| 51 | +- `git-ranker/README.md`의 verification 절차 섹션 |
| 52 | + |
| 53 | +## Verification |
| 54 | + |
| 55 | +- `docker version`으로 현재 Docker daemon 상태 확인 |
| 56 | +- `./gradlew test jacocoTestCoverageVerification` |
| 57 | +- `./gradlew integrationTest` |
| 58 | +- Docker 미가동 환경에서 preflight 실패 메시지 확인 |
| 59 | + |
| 60 | +결과 요약: |
| 61 | + |
| 62 | +- `docker version`: OrbStack context `orbstack`, server API `1.51` 확인 |
| 63 | +- `./gradlew test --tests "com.gitranker.api.testsupport.DockerPreflightCheckTest"`: 성공 |
| 64 | +- `./gradlew test jacocoTestCoverageVerification`: 성공 |
| 65 | +- `./gradlew verifyDockerAvailable`: |
| 66 | + - Docker 미기동 상태: 명확한 fail-fast 메시지 확인 |
| 67 | + - Docker 기동 상태: `Docker preflight passed. context=orbstack serverApiVersion=1.51` |
| 68 | +- `./gradlew integrationTest`: |
| 69 | + - Docker 미기동 상태: Testcontainers 진입 전 preflight 단계에서 실패 |
| 70 | + - Docker 기동 상태: 성공 |
| 71 | + |
| 72 | +## Evidence |
| 73 | + |
| 74 | +작업 중 수집한 명령 결과 요약과 문서 갱신 경로를 남긴다. 브라우저, 로그, 메트릭 artifact는 이번 Issue 범위가 아니다. |
| 75 | + |
| 76 | +- baseline 확인: |
| 77 | + - `docker version` -> daemon 연결 실패 |
| 78 | + - `./gradlew integrationTest` -> `ContainerFetchException`, `DockerClientProviderStrategy` |
| 79 | +- 변경 후 확인: |
| 80 | + - `./gradlew verifyDockerAvailable` -> Docker 미기동 시 원인/다음 단계가 포함된 fail-fast 메시지 출력 |
| 81 | + - `./gradlew integrationTest` -> Docker 미기동 시 `verifyDockerAvailable` 단계에서 즉시 실패 |
| 82 | + - `docker version` -> OrbStack 실행 후 server 연결 성공 |
| 83 | + - `./gradlew verifyDockerAvailable` -> 성공 |
| 84 | + - `./gradlew integrationTest` -> 성공 |
| 85 | + |
| 86 | +## Risks or Blockers |
| 87 | + |
| 88 | +- 로컬 Docker context 종류에 따라 실패 문구 일부가 다를 수 있다. |
| 89 | +- `docker version --format "{{.Server.APIVersion}}"`를 지원하지 않는 매우 오래된 Docker CLI는 별도 보정이 필요할 수 있다. |
| 90 | + |
| 91 | +## Next Preconditions |
| 92 | + |
| 93 | +- `GRW-05`: backend integration preflight를 표준 runtime 검증 순서에 연결 |
| 94 | +- `GRB-03`: 결정적 seed 검증 시 통합 테스트 환경 전제조건으로 재사용 |
| 95 | + |
| 96 | +## Docs Updated |
| 97 | + |
| 98 | +- `docs/exec-plans/completed/2026-03-26-grb-02-backend-verification-hardening.md` |
| 99 | +- `git-ranker/README.md` |
| 100 | + |
| 101 | +## Skill Consideration |
| 102 | + |
| 103 | +Docker preflight와 unit/coverage/integration 분리 절차는 Spring Boot 검증 루프에서 반복될 가능성이 높다. 이번 작업 결과는 이후 project-specific verification skill이나 runtime runbook 입력으로 재사용할 수 있다. |
0 commit comments