본문으로 건너뛰기

GitHub Actions CI 장기 실패 — 감지, 분류, 대응 전략

배운 것

CI가 며칠씩 실패 상태로 방치되는 경우, 단순히 "고쳐야 한다"는 인식만으로는 부족하다.
실패의 종류를 분류(triage) 하고, 각 유형에 맞는 대응 전략을 미리 정해두면 방치 기간을 줄일 수 있다.

CI 실패 유형 분류

유형예시권장 대응
배포 실패 (인프라)concurrency group 충돌, NAS 연결 실패워크플로우 로직 수정
테스트 실패 (코드)유닛 테스트 실패, 린트 오류코드 수정 또는 테스트 업데이트
방치형 실패더 이상 사용 안 하는 레포의 워크플로우워크플로우 비활성화 (on: [])
외부 의존성 실패외부 API, Docker Hub rate limit재시도 로직 또는 미러 사용

장기 방치 방지 체크리스트

D+1  → 실패 확인, 로그 열람 (5분)
D+3 → 원인 파악 및 유형 분류
D+7 → 수정 또는 워크플로우 비활성화 결정
D+14 → 여전히 미해결 시 이슈 생성 또는 레포 아카이브 검토

워크플로우 임시 비활성화 패턴

더 이상 유지보수가 안 되는 레포라면 실패를 계속 두는 것보다 명시적으로 비활성화:

# .github/workflows/deploy.yml

# 비활성화: 레포 유지보수 중단으로 워크플로우 정지
on: []

# 기존 트리거 (주석 처리)
# on:
# push:
# branches: [main]

배포 CI와 concurrency group

concurrency:
group: deploy-${{ github.ref }}
cancel-in-progress: false # 배포는 취소하지 않고 대기
  • cancel-in-progress: true → 최신 것만 실행 (테스트 CI에 적합)
  • cancel-in-progress: false → 이전 배포 완료 후 다음 실행 (배포 CI에 적합)
  • NAS/로컬 서버 배포 시 병렬 실행이 파일 충돌을 일으킬 수 있으므로 false가 안전

오늘의 관찰

  • 99JIK/haeun: 2026-02-23부터 CI failure 지속 (D+9). 방치형 실패 → 워크플로우 비활성화 검토 필요
  • knu-eselab/site: 2026-02-27 배포 CI failure. concurrency group 추가 이후에도 실패 지속 → 로그 심층 분석 필요

핵심 교훈

"CI 실패는 방치할수록 컨텍스트를 잃어버린다. 3일 안에 triage하는 것이 원칙."

  • 실패 유형을 먼저 분류해야 올바른 대응을 선택할 수 있다
  • 사용하지 않는 레포의 CI는 빠르게 비활성화하는 것이 기술 부채를 줄이는 방법
  • concurrency group 설정은 CI 종류(테스트 vs. 배포)에 따라 전략이 달라진다