Case · Release Quality

PR 변경 의도를 실제 앱·증적·Clean Runner와 연결한 Release Quality Gate

공용 Trunk, 고객사별 커스텀 패치, 한 줄 커밋 메시지가 혼재한 레거시 C++·SVN 환경에서 릴리즈 직전 담당자가 기억으로 코드를 다시 읽는 방식을 바꿨습니다. PR 시점에 변경 의도를 구조화하고, 실제 WinApp 동작과 Screenshot, Smoke, DLL·Artifact 구성이 모두 맞아야 Merge와 출시가 가능하도록 했습니다.

99%↓명시적 변경 누락
60%↓릴리즈 정보 전달시간
30~40건Main Release 평균 변경
1~2회분기별 DLL 문제 사전 차단

문제는 문서 양식이 아니라 이해관계의 구조였습니다.

템플릿·교육·Jira·코드주석을 반복해도 누락이 사라지지 않았습니다. 개발자가 자세히 쓰면 QA 범위와 고객 질문이 늘어났고, 최소한만 쓰는 편이 단기적으로 유리했습니다. 고객사 특수 패치는 Main과 장기간 분리돼 담당자 외에는 의도를 알기 어려웠고, 릴리즈 직전 3일에 모든 문서화 부담이 집중됐습니다.

1. PR 단위 변경 분석
Agent가 Commit, Jira, C++ 심볼, 기존 릴리즈 문서와 호출 영향 범위를 분석했습니다.
2. 실제 WinApp 재현
Custom MCP가 화면 상태를 읽고 버튼 클릭, TextBox 수정, 검사 Window 설정과 검사 흐름을 실행했습니다.
3. 문서·시각 증적 생성
변경 의도, 목적, 영향 범위, 제약을 기록하고 실제 Screenshot을 PR에 연결했습니다. 이미지가 없으면 Mock 상태가 남아 누락을 드러냈습니다.
4. 승인과 Gate
기능이 재현되지 않으면 NEED CHECK, 문서와 실제 동작이 다르거나 Smoke가 실패하면 Fail로 처리했습니다.

초기 자동화가 만든 새 문제

  • Agent가 수기 문서보다 약 4배 많은 내용을 만들어 검토 부담이 증가했습니다.
  • 내부 함수명을 그대로 사용해 QA와 고객이 이해하기 어려운 설명이 나왔습니다.
  • 초기부터 Merge를 막으면 오탐 하나가 전체 일정 지연으로 이어질 수 있었습니다.
대응: PR별 신규 변경분만 검토하고, 코드 심볼을 사용자 UI 명칭으로 변환했습니다. Gate는 6개월 동안 Warning으로 운영해 예외를 수집한 뒤 Blocking으로 바꿨습니다.

작성 방식과 품질 통제를 분리

“코드를 본 개발자가 직접 써야 정확하다”는 의견을 논파하지 않았습니다. AI 작성을 원하지 않으면 같은 양식에 수기로 작성할 수 있게 했습니다. 대신 실제 Screenshot, 실행 재현, Smoke와 최종 QA 승인은 누구에게나 동일하게 적용했습니다.

로컬 성공을 완료로 인정하지 않음

Agent가 로컬에서 빌드와 실행이 된다고 푸시했지만 GitLab Clean Runner에서 필요한 DLL이 누락돼 실패한 사례가 있었습니다. 로컬 bin에 과거 DLL이 남아 있어 성공한 착시였습니다.

Local Validator → git status / tracked artifact 확인 → clean restore & build → GitLab Runner test → DLL·Screenshot·문서 Artifact 존재 확인 → 배포 Smoke

이후 완료 정의를 “코드가 돌아간다”에서 “깨끗한 환경에서 재현되고 필요한 산출물이 실제 패키지에 포함된다”로 바꿨습니다.

고객지원 감소 수치의 한계도 공개

개발팀 동분기 설문에서는 개인전화·카카오톡 기반 고객지원 문의가 약 75% 감소했다고 체감했습니다. 그러나 공식 메신저와 통화 로그가 없어 객관적으로 재검증할 수 없으므로 Hero KPI에서는 제외하고, 정성적 변화관리 결과로만 사용합니다.

검증할 수 없는 범위를 남김

회귀 전용 장비가 없고 기존 Simulator가 CUDA 기반 3D Image Draw 경로를 재현하지 못해 CPU 기반 기능과 안정적인 UI 경로만 자동화했습니다. GPU·광학·실장비 영역은 수동 QA로 명시했습니다.

완료조건

개발자가 변경 의도를 승인하고, 실제 앱에서 재현되며, Screenshot과 문서가 일치하고, Smoke와 GitLab Clean Runner가 통과한 뒤 QA가 릴리즈 착수를 승인해야 완료입니다.

왜 처음부터 강제하지 않았나품질 Gate는 정확도보다 신뢰와 채택이 먼저였습니다. Warning 기간 동안 누락과 오탐을 모두 기록해 현업이 “이 시스템 때문에 일이 늘었다”가 아니라 “이 시스템이 누락을 막는다”고 체감한 뒤 차단권한을 부여했습니다.
결과: 릴리즈 직전 일괄 문서 작성에서 PR 단위 Incremental Review로 전환해 명시적 변경 누락을 약 99%, 정보 전달시간을 약 60% 줄였습니다. 분기 1~2회의 DLL 구성 문제를 Merge 전에 차단했고, 로컬 캐시가 숨기던 누락까지 Clean Runner가 검증하도록 완료체계를 강화했습니다.