새벽 두 시, 자동 발행 파이프라인이 조용히 죽어 있었다
목차
새벽 두 시에 알림이 없다는 게 문제였다. 정확히는 — 알림이 와야 하는데 오지 않았고, 발행도 되지 않았다. 스케줄러가 돌고 있다는 착각 속에 파이프라인은 이미 한참 전부터 멈춰 있었다.
뭘 믿고 있었나
launchd로 묶어둔 블로그 자동 발행 job은 주기적으로 원격 서버에 SSH 접속해 배포 스크립트를 트리거하는 구조다. 로컬 맥에서 돌리면 잘 됐다. 문제는 launchd 환경이 일반 쉘 세션과 달리 에이전트 포워딩, 키체인 연동, SSH_AUTH_SOCK 같은 컨텍스트가 없거나 비어 있다는 점이다.
정리하면 이렇다:
| 환경 | SSH 키 에이전트 | 동작 여부 |
|---|---|---|
| 터미널 직접 실행 | 자동 로드됨 | ✅ 정상 |
| launchd plist 실행 | 에이전트 없음 | ❌ 인증 실패 |
키 기반 인증이 에이전트 없이 묵묵히 실패하고, 스크립트는 에러를 조용히 삼켰다. 발행 실패인지 성공인지조차 알 수 없는 블랙박스 상태.
수정 방향: 인증을 명시적으로
에이전트 포워딩을 포기하고 SSH 접속 시 password를 직접 넘기는 방향으로 전환했다. launchd 환경에서 살아남으려면 외부 상태에 의존하지 않는 방식이 맞다. bulk_seed.py 안에서 SSH 호출부를 수정해 인증 방식을 명시적으로 고정했다.
# 변경 전: SSH_AUTH_SOCK 의존 — launchd에서 없음
# 변경 후: 커넥션 시 credential 직행
변경 후 launchd가 트리거한 job이 처음으로 원격 서버에 접속 성공했다.
그리고 알림이 절반만 오고 있었다
인증 고치고 나서 테스트 돌려보니 이번엔 알림 문제가 눈에 들어왔다. 발행 완료 후 텔레그램과 디스코드 두 채널로 알림을 보내야 하는데, 어느 시점에서인가 한쪽만 남겨진 채 나머지 한 쪽 발송 로직이 빠져 있었다.
원인은 단순했다:
- 이전 리팩터링 과정에서 알림 호출이 하나로 병합되다가 한 채널 누락
- 테스트는 터미널에서 손으로 돌렸을 때만 했고, 두 채널 동시 수신 확인을 빠뜨림
두 채널 모두 발송하도록 bulk_seed.py 알림 블록을 복구했다. 텔레그램(@SlecsNotiBot)과 디스코드 둘 다 순서대로 호출하고, 각각 성공/실패를 개별로 로깅하게 정리했다.
새벽 작업이 준 교훈
두 가지 버그는 사실 하나의 패턴이다 — 자동화가 돌고 있다는 착각. launchd job은 plist에 등록된 순간부터 "알아서 되겠지"라고 방치하기 쉽다. 알림도 마찬가지. 한 채널에서 메시지 받으면 나머지도 됐겠지 싶어서 확인을 안 한다.
앞으로 챙겨야 할 것들:
- launchd 환경에서 스크립트 첫 실행 후 로그 반드시 확인
- 알림 채널이 복수면 채널별 독립 검증 — 하나 성공이 전체 성공을 의미하지 않음
- 조용히 실패하는 스크립트는 조용히 오래 실패한다
새벽 두 시 작업이 짧게 끝난 건 좋은데, 이게 며칠 동안 실패하고 있었다는 사실은 불편하다. 자동화는 설정한 날 이후로도 계속 작동 중인지 주기적으로 눈으로 확인해야 한다는 걸 다시 새겼다.
🛒 이 글과 어울리는 추천 상품
*위 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.
댓글 0
첫 댓글 달아줘.