Skip to content

deploy: fetch 가 계속 실패하면 조용히 있지 말 것 - #42

Merged
mikim merged 1 commit into
mainfrom
claude/deploy-fetch-outage-alert
Sep 9, 2026
Merged

mikim merged 1 commit into
mainfrom
claude/deploy-fetch-outage-alert

Conversation

@mikim

@mikim mikim commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

무엇을 봤나

운영 박스의 배포 로그(~/logs/alpha-deploy.log)를 읽다 발견했다.

날짜 git fetch 실패 틱
2026-09-03 11
2026-09-04 50
2026-09-05 16

사흘간 77틱이 실패했고, 그동안 알림은 한 건도 나가지 않았다. 지금은 회복돼
git ls-remote 가 0.46s 에 응답하고 deploy.sh --check 도 정상이다.

왜 고치나

폴러는 매 틱 git fetch 로 시작하고, 실패하면 WARN 한 줄 남기고 빠져나온다.
한 번 실패는 그 처리가 맞다. 계속 실패할 때가 문제다. 폴러는 remote 가 움직인
걸 영영 모른 채 up to date 를 보고하며 조용하고, 바깥에서는 한가한 정상
폴러와 구별되지 않는다. 방금 머지하고 배포를 기다리는 사람에게도 그렇다.

이번엔 그 주에 배포할 게 없어서 대가가 없었다. 대가가 없었다는 게 신호를 붙일
이유다 — 다음번에 보안 패치가 대기 중이면 같은 침묵이 그대로 비용이 된다.

어떻게

DEPLOY_FETCH_WAIT_MIN(기본 30) 넘게 연속 실패하면 로그와 웹훅으로 알린다.

  • 틱마다가 아니라 연속 구간당 한 번. 5분 간격으로 사흘을 울리는 알림은
    채널을 음소거시키고, 음소거된 채널이 애초에 이 문제의 출발점이다.
  • fetch 성공 시 구간이 초기화되어 다음 장애는 자기 몫으로 다시 알린다.
  • CI 판정 없음을 DEPLOY_CI_WAIT_MIN 후 경고+알림하는 기존 처리와 같은 모양,
    상태 파일도 같은 자리(.git 안).
  • --check 는 아무것도 바꾸지 않아야 하므로 구간을 찍지도 알리지도 않는다.

기본값 30분 = 연속 6틱. 일시적인 테일넷/GitHub 블립은 계속 조용하다.

검증

bash -n 통과, shellcheck 새 코드 지적 없음. 상태 머신은 함수를 떼어내 직접 돌렸다.

상황 결과
1번째 실패 (구간 시작) quiet
2번째 실패 (1분 경과) quiet
구간 31분 경과 후 실패 ALERT
다음 틱, 계속 실패 quiet
그 다음 틱 quiet
성공 후 재실패 (새 구간) quiet

동작 확인은 머지 후 박스에서 scripts/deploy.sh --check 로 한 번 더 할 수 있다.

🤖 Generated with Claude Code

배포 폴러는 매 틱 `git fetch` 로 시작하고, 실패하면 WARN 한 줄 남기고 그냥
빠져나온다. 한 번 실패는 그게 맞다 — 테일넷이 튀거나 GitHub 가 5xx 를 주면
다음 틱에 대개 성공한다.

문제는 실패가 계속될 때다. 그때 폴러는 remote 가 움직인 걸 영영 모르고, 계속
"up to date" 라고 보고하며 조용하다. 바깥에서 보면 한가한 정상 폴러와 구별이
안 된다 — 방금 머지하고 배포를 기다리는 사람에게도 마찬가지다.

이미 한 번 일어났다. 2026-09-03..05 사이 fetch 가 77틱 실패했고 그중 50틱이
4일 하루에 몰렸다. 그 주에 배포할 게 없어서 대가는 없었고, 그래서 아무도
몰랐다. 대가가 없었다는 게 신호를 붙일 이유다.

DEPLOY_FETCH_WAIT_MIN(기본 30) 넘게 연속 실패하면 로그와 웹훅으로 한 번
알린다. 틱마다가 아니라 연속 구간당 한 번이다 — 5분 간격으로 사흘을 울리는
알림은 채널을 음소거시키고, 음소거된 채널이 애초에 이 문제의 출발점이다.
성공하면 구간이 초기화되어 다음 장애는 자기 몫으로 다시 알린다.

CI 판정 없음을 DEPLOY_CI_WAIT_MIN 후에 경고+알림하는 기존 처리와 같은 모양이고
상태 파일도 같은 자리(.git 안)에 둔다. `--check` 는 아무것도 바꾸지 않아야
하므로 구간을 찍지도 알리지도 않는다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@mikim
mikim force-pushed the claude/deploy-fetch-outage-alert branch from 34d829e to 44eb722 Compare September 9, 2026 04:18
@mikim
mikim merged commit 6049bde into main Sep 9, 2026
1 check passed
@mikim
mikim deleted the claude/deploy-fetch-outage-alert branch September 9, 2026 04:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant