website: 배포 롤백 마커 파일 gitignore 추가로 드리프트 오탐 잡기
멋사 경희대 사이트 프로젝트에서 stage 배포 중 발생한 git 드리프트 오탐 알람의 원인을 찾아 `.gitignore` 한 줄로 해결한 PR입니다.
요약
이번 PR은 infra/.prev_backend_tag_* 패턴을 .gitignore에 추가한 게 전부입니다. 변경 라인 수는 딱 1줄이지만, 배포할 때마다 정상적인 상황에서도 드리프트 알람이 울리던 문제를 근본적으로 해결한 수정이라 기록해둘 만합니다. 2026년 7월 12일에 PR을 올리고 2분 반 만에 바로 dev 브랜치에 머지됐습니다.
배경 및 목적
JWT_SECRET 수정 사항을 검증하려고 stage 배포를 돌리던 중, git 드리프트 알람(#105)이 오탐으로 울렸습니다. 배포는 정상적으로 끝났는데 알람이 뜨니 당황스러운 상황이었죠.
원인을 추적해보니 cd.yml 배포 스크립트에 있었습니다. 이 스크립트는 롤백에 대비해서 배포 시작 시 infra/.prev_backend_tag_{stage,prod} 파일을 생성하고, 헬스체크를 통과하면 이 파일을 지우는 구조로 되어 있습니다. 보통 1분 안쪽으로 끝나는 짧은 과정이라 실제로는 아무 문제가 없는 정상 동작입니다.
문제는 이 경로가 .gitignore에 등록되어 있지 않았다는 점입니다. git status --porcelain 기준으로 보면 이 파일이 잠깐이라도 존재하는 순간은 "추적되지 않은 변경사항"으로 잡히고, 이게 드리프트로 인식됩니다. 여기에 알람 쿼리가 GitDriftFileCount[10m].max() > 0라서, 실제로는 1분도 안 되는 짧은 스파이크였는데도 10분짜리 윈도우 안에서는 "계속 드리프트 중"인 것처럼 뭉개져 보였습니다. 여기에 pending-duration 5분 조건까지 겹치니, 정상적인 배포 과정에서도 알람 조건을 쉽게 충족해버리는 구조였던 겁니다.
구현 내용
해결 방법은 단순합니다. .gitignore의 "Infra — 서버 전용 파일" 섹션에 다음 한 줄을 추가했습니다.
# Infra — 서버 전용 파일 (gitignore:수동)
infra/nginx.conf
infra/data/
+infra/.prev_backend_tag_*
# Backend — 로컬 SQLite DB
backend/data/
이미 infra/nginx.conf, infra/data/처럼 서버에서만 존재하고 git으로 추적할 필요 없는 파일들을 모아둔 섹션이 있었기 때문에, 롤백 마커 파일도 같은 범주로 분류해서 추가하기만 하면 됐습니다. 커밋 메시지 하나, 변경 파일 하나로 끝난 깔끔한 수정이었습니다.
배운 점 및 개선점
이 PR 자체는 작지만, 겪은 문제는 모니터링/알람 설계할 때 흔히 놓치기 쉬운 함정을 보여줍니다. [10m].max() 같은 집계 쿼리는 짧은 스파이크를 윈도우 전체로 "뭉개서" 보여주기 때문에, 실제 지속 시간과 무관하게 알람 조건을 쉽게 만족시킬 수 있습니다. 정상적인 배포 프로세스가 만들어내는 일시적인 파일 변경까지도 드리프트로 잡힐 수 있다는 걸 이번에 직접 확인한 셈입니다.
앞으로 비슷한 임시 파일을 배포 스크립트에서 새로 만들 일이 있다면, .gitignore 등록을 배포 로직 작성과 동시에 챙기는 게 나을 것 같습니다. 또한 드리프트 알람 자체도 지속 시간 기반보다는 스파이크와 실제 드리프트를 구분할 수 있는 쿼리 방식을 고민해볼 여지가 있어 보입니다.