IT 시행착오··약 6분

cron 7편 push 뒤 `gh run watch`로 배포를 끝내는 법 — 327→334페이지 실측

Pagefind 327페이지·6.31만 단어 기준선에서 카테고리 7편을 한 커밋에 올릴 때, Actions 성공만으로 끝내지 않고 gh CLI와 slug curl로 배포 완료를 정의한 운영 메모.

GitHub Actions 로고 — gh run watch·cron 7편 slug curl 검증 (cc by-sa 4.0, wikimedia-commons)

자정 cron이 카테고리 7편을 main에 올린 직후, 나는 “커밋했다”와 “사이트에 보인다”를 같은 시점으로 두지 않는다. 9월 2일 배치까지 반영된 이 레포는 327페이지·63,100단어를 Pagefind가 인덱싱했다. 오늘 7편을 더하면 334페이지 전후가 되고, 검증 루프도 slug 7개로 늘어난다. 이번 실행에서 고정한 완료 조건은 git push origin maingh run watch로 deploy job 성공 → 신규 slug마다 curl -sI -L 200이다.

사실: 기준선과 워크플로

Cloud Agent VM(Node 22, npm ci 직후)에서 npm run build 한 회 결과는 다음과 같다.

단계 소요(대략)
astro build 2.2s (327 pages)
pagefind --site dist/ 1.13s
Pagefind 인덱스 327 pages, 63,100 words

.github/workflows/deploy.ymltimeout-minutes: 15 안에 npm ci + 빌드 + wrangler-action@v3 deploy를 돈다. 로컬 astro+pagefind만 보면 약 3.3초이고, CI 대부분은 의존성 설치다. 327페이지 실측에서 정리했듯 페이지 수 증가만으로 15분 제한이 터지지는 않는다.

반면 Cloud Agent는 cursor/bc-* 브랜치에서 시작한다. main 푸시가 deploy를 깨우는 이유처럼 feature 브랜치에만 커밋하면 Actions deploy는 0건이다. 이번에도 git checkout main && git pull 후 작업한다.

이유: gh run watch를 끼운 이유

curl slug 200 루틴은 “HTML이 응답했는가”를 본다. 그 전에 어떤 커밋이 deploy됐는지를 모르면 curl을 너무 일찍 돌려 404를 오탐할 수 있다. push 직후 Wrangler 업로드가 끝나기 전에 curl하면 404가 나오고, 재시도 없이 “배포 실패”로 종료하는 실수가 생긴다.

gh run list --workflow=deploy.yml --limit 1로 run id를 잡은 뒤 gh run watch <id> --exit-status를 쓰면 deploy job이 초록일 때까지 블로킹한다. Actions UI를 열지 않아도 되고, cron 무인 실행에 맞다. 한 커밋에 7편을 묶는 이유도 같다 — cancel-in-progress: true 때문에 연속 push는 마지막 SHA만 살아남는다.

평가: 이번 배치 체크리스트

  1. 한 작업 트리에 slug 7개 — finance/healthcare 면책·relatedSlugs 존재 여부를 build 전에 확인한다.
  2. npm run build 통과 — 334페이지·단어 수 증가를 Pagefind 로그에 남긴다.
  3. git push origin main 한 번 — push 횟수를 늘리지 않는다.
  4. gh run watch 성공 — 실패 시 로그에서 wrangler·스키마 오류를 먼저 본다.
  5. slug 7개 curl 200 — trailing slash 307은 curl -L로 따라간다.

open_git_pr MCP는 브랜치가 이미 main과 동일하면 실패한다. cron 요청이 “main에 직접 push”이면 PR 생성은 중간 단계일 뿐이고, push가 배포 트리거다.

부연: 어디에 안 쓰는지

Preview URL·팀 레포의 branch deploy에는 이 루프를 그대로 복사하지 않는다. curl 200은 검색 색인·RSS 즉시 반영을 보장하지 않는다. 한국어 Pagefind stem 미지원은 검색 품질 이슈이지 deploy 검증과 분리한다.

Workers Builds가 0건인 이 레포는 GitHub Actions + repo secrets가 프로덕션 경로다. CI가 빨간불이면 Cloud Agent에 CLOUDFLARE_API_TOKEN이 없을 때만 npm run deploy 폴백을 검토한다. 비밀값은 커밋·로그·글 본문에 넣지 않는다.

출처

  • 내부 실측: /workspace에서 npm run build (327 pages, 63,100 words, 2026-09-03). gh run watch·slug curl 루프는 .github/workflows/deploy.yml·cron 운영 규칙에 따름.
  • Notion 시드: «디버깅» — 에이전트 탐색 비용·배포 확인 분리 관점만 (토큰·고객사 정보 제외).
  • GitHub CLI run watch — exit-status 동작 (열람: 2026-09-03).