Skip to content

기존 Full CI 테스트를 QA1 고정 버전으로 분리 (2026-09-14)

  • 기간: 2026-09-14, QA1 이관 작업 1개. 사용자 요청 “QA1로 만들어서 별도 저장소 하나 만들고, 글로 다 이동해줘”.
  • 랜딩: QA1 main 6db676c3, 앱 main 9a37e73c 게시 확인. 문서는 이 리포트를 포함한 후보로 main에 직접 반영한다. 실제 문서 반영 SHA와 자동 실행 결과는 담당 이슈에서 기록하며 마이그레이션·Edge 변경 없음, Production 배포 성공과 코드 반영은 구분한다.
  • 설계서: 앱 #1591의 분석·3개 Phase·예상 효과 표, QA1 #1.
  • 정본: QA1 운영 안내, 저장소 경계, 로컬 CI 절차.
  • 도구: QA1의 migration-manifest.json·bin/qa1.mjs·runner/, 앱의 qa1.lock.json·scripts/qa1.mjs. 준비된 실행용 파일과 test-results/qa1/는 앱 Git에서 제외한다.
  • 게이트: QA1 실행기 회귀 17/17, 앱 check·최종 로컬 precheck·브라우저 저장·복구 검사(test:persistence-browser) 118/118. 최종 precheck는 Node v22.23.2, 앱 9a37e73c·QA1 6db676c3, --release origin/main 기준으로 2026-09-14 11:33:08 KST에 종료 코드 0. pgTAP 122파일·2,444단언 PASS. 이 증거는 실제 목적 release 검사·원격 Merge Check·Full CI와 구분한다.
  • 계약: QA1 커밋·suite tree 고정, 준비 파일 무결성·로컬 수정 보호·실행 결과 식별. 상세 검증·실패 수리 리포트.

Phase 현황

Phase내용상태
Phase 1이관 대상·의존 경계 확정, QA1 저장소 구성완료, 1,210개 전수 목록
Phase 2전체 이관·버전 고정·실행 연결QA1 원격 게시 및 앱 로컬 구현 완료
Phase 3전후 대조·실제 로컬 검사·문서·원격 반영 확인로컬 검증 및 앱 main 직접 반영 완료. 이 문서 후보의 원격 도달은 게시 후 확인

1. 배경

기존 Full CI 테스트와 전용 실행 도구가 앱 저장소에 함께 있어 테스트 수정과 제품 소유권이 결합돼 있었다. 사용자는 기존 테스트 전체를 새 QA1 저장소로 옮기도록 요청했다. 별도의 독립 검증인 QA2는 이번 이관에 합치지 않았다.

2. 문제 제기

파일만 옮기면 기존 상대경로와 검사 진입점이 끊긴다

이관 기준 앱 커밋은 1711ae2e84612d8af868670a65ef3b0c48957817이다. 단위 검사는 앱 소스를 상대경로로 참조하고, DB 검사는 앱의 마이그레이션을 사용하며, 브라우저 검사는 앱 빌드와 실행 환경에 연결돼 있었다. 검사 대상뿐 아니라 fixture·helper·검사 전용 실행기·설정을 함께 분리해야 기존 검사 범위를 보존할 수 있었다.

앱 커밋만으로는 외부 테스트의 실행 결과를 재현할 수 없다

테스트 원본이 외부에서 바뀌면 같은 앱 커밋이라도 검증 입력이 달라진다. 검증 대상 앱과 실제 사용한 QA1 버전을 함께 고정하고 결과에 남겨야 한다.

3. 해결 방안

원칙

  • D1, 2026-09-14: “QA1로 만들어서 별도 저장소 하나 만들고, 글로 다 이동해줘”. 기존 Full CI 테스트 전체를 QA1 소유로 이관하며 제품·DB 마이그레이션·빌드·배포는 앱에 유지한다.
  • D2, 2026-09-14 후속: “아니 관리자 권한으로 그냥 바로 반영해줘”. 이번 이관의 관리자 직접 반영을 승인한 예외다. 지시·반영 기록에 따라 앱은 관리자 허용 경로로 PR·verify 요건을 건너뛰고 기존 main에서 fast-forward했다. 보호 설정 변경과 force push는 없었다. 상시 원격 CI·재실행 정책이나 다른 작업의 승인 경계는 바꾸지 않는다.

접근

QA1 suite/<기존 앱 상대경로>에 원본을 보존하고 앱은 고정한 QA1 파일을 검사 실행 때만 기존 경로에 준비한다. 모든 import를 일괄 변경하는 방안은 불필요한 검사 동작 변경과 누락 가능성 때문에 채택하지 않았다. 앱에 원본 사본을 계속 추적하는 방안은 두 정본이 생기므로 채택하지 않았다.

4. 적용한 내용

Phase 1 — 전수 목록과 소유권

테스트·fixture·helper·Playwright 설정·검사 및 측정 전용 도구 1,210개에 원본 hash를 기록했다. 앱의 제품 소스·SQL 마이그레이션은 유지하고 다른 담당자의 미반영 변경을 가져오지 않았다.

Phase 2 — 고정 버전 실행

qa1.lock.json은 QA1 저장소·커밋·suite tree를 고정한다. 앱의 작은 loader가 해당 Git 객체를 읽고 기존 npm 명령과 workflow에서 필요한 검사를 준비한다. 추적 중인 제품 파일·사용자 수정 파일의 덮어쓰기와 pin 불일치를 거부한다. 앱·QA1 커밋·앱 변경 hash·환경·인자·종료 결과는 CLI 실행 기록에 남긴다. QA1은 비공개로 만들고 읽기 전용 접근 설정을 갖췄다.

Phase 3 — 로컬 검증과 직접 반영 준비

원본 동일성, 앱 추적 잔류 0개, QA1 없는 앱 빌드, 새 앱 checkout에서 GitHub의 고정 QA1 가져오기, 기존 검사 목록과 실제 단위·DB·브라우저 저장·복구 검사를 확인했다. 분류 장부는 준비 상태의 파일 목록도 읽도록 연결했다. 원격 직접 반영은 사용자 후속 승인에 따라 최신 main을 통합한 후보로 진행하며 실제 반영 상태와 배포 결과를 구분한다.

작업 중 드러난 것

실제 중단 복구에서 이전 파일 hash가 유실되는 결함과 병렬 precheck 준비 hook의 잠금 경쟁을 수리했다. 준비가 끝난 같은 pin은 무결성을 검사한 뒤 읽기 전용으로 공유하며, 회귀 검사 17개가 모두 통과했다. 첫 precheck에서 실패한 2개 묶음은 최종 4개 묶음 전체 통과로 재검증했다. 테스트 단언을 완화하거나 skip·재시도를 늘리지 않았다.

초기 package.json 줄바꿈 오류와 하위 .gitignore 예외로 실행용 파일이 다시 추적되는 문제를 수리했다. 기존 main에도 있던 분류 부채는 이관 전후 증가가 없음을 확인하고 관련 없는 수리로 확대하지 않았다. 목록 확인 중 설정·reporter 호출 오류는 검사 실행 실패와 구분했다. 실행별 원인·근거·명령·수리 집계는 담당 이슈의 상세 리포트에 남겼다.

5. 적용 결과

항목결과
테스트 원본 소유권앱 추적 1,210개 → QA1 소유 1,210개, 이관 후보 앱 추적 0개. 원본 내용 변경 0개
버전 식별앱 버전 중심 → 앱 커밋·tree·변경 hash와 QA1 커밋·suite tree 조합
단위 검사이관 전·최종 precheck 모두 전체 3,947·성공 3,799·실패 0·기존 skip 148
DB 검사Node 107/107, pgTAP 122파일·2,444단언 PASS, 동시 저장·통계 수렴 통과
브라우저 저장·복구118/118 통과·skip 0
QA1 실행기새 회귀 17/17 통과·skip 0
앱 독립 빌드·분류QA1 실행용 파일 없이 빌드 성공, 이관 전후 새 미분류·등록 누락 증가 0
전체 E2E·viewport목록만 확인한 범위는 실행 성공으로 집계하지 않음. Full CI 미실행
문서 로컬 검사npm run check(약관 4버전·내비게이션 361경로), build:docs, check:docs-artifact(40파일) 통과
원격 반영·운영QA1·앱 main 게시 확인. 문서는 이 리포트를 포함한 후보로 직접 반영하며 실제 문서 SHA와 자동 실행 결과는 담당 이슈에 기록. Production 배포 성공과 코드 반영은 구분

6. 이번 개선으로 향상된 것

테스트 원본을 QA1에서 독립적으로 관리한다

테스트 수정을 QA1에서 관리하고 앱은 채택할 버전을 명시한다. 앱 작업 트리에 보이는 실행용 파일과 QA1 원본의 소유권이 구분되며 두 정본을 유지하지 않는다.

검사 결과가 어떤 앱과 테스트의 조합인지 확인할 수 있다

버전 pin과 실행 기록으로 다른 QA1 버전의 성공을 현재 조합에 잘못 재사용하는 것을 막는다. 파일 충돌·중단·병렬 시작에서도 로컬 수정을 보존하도록 준비 과정과 회귀 검사를 갖췄다. 저장소 분리 자체의 CI 시간·비용 절감은 측정하지 않았다.

남은 것

문서 후보의 main 도달과 이번 직접 반영으로 시작된 자동 실행 결과를 담당 이슈의 최종 기록에 남긴다. 로컬 precheck·부분 검사를 Full CI 통과로 바꾸어 보고하지 않으며 Production 배포 성공도 별도 증거로 확인한다.