Skip to content

ci: 배포 시크릿이 없을 때 조용히 건너뛰고, 일부만 있으면 실패시킨다 - #148

Merged
RosieOh merged 2 commits into
mainfrom
fix/deploy-secrets-skip-cleanly
Oct 23, 2026
Merged

RosieOh merged 2 commits into
mainfrom
fix/deploy-secrets-skip-cleanly

Conversation

@RosieOh

@RosieOh RosieOh commented Oct 23, 2026

Copy link
Copy Markdown
Contributor

Refs #94

확인한 사실

리포지토리 시크릿이 하나도 설정돼 있지 않습니다 (gh secret list → 0개). 그래서 main 머지마다 Deploy to Production 이 첫 스텝에서 죽었습니다.

success  Test and Build
success  Security Scan
success  Build Docker Image
failure  Deploy to Production     ← Check required secrets
skipped  Deploy to Staging (Green)
success  Cleanup

#143 ~ #147 까지 다섯 번 연속 같은 모양입니다. 컨테이너를 띄우기 전에 멈추므로 운영 인스턴스를 건드리지는 않습니다. 문제는 그 반대입니다 — 아무것도 배포되지 않는데 매번 빨간불로 끝나서 그 빨간불이 정상처럼 보입니다. 그 상태가 굳으면 진짜 실패도 눈에 띄지 않습니다.

고친 것

시크릿 상태를 세 가지로 나눴습니다.

상태 결과
전부 설정됨 배포한다
하나도 없음 건너뛴다. 실패가 아니고, 잡 요약에 "운영 배포를 건너뜀" 과 설정 문서 경로가 남는다
일부만 있음 실패한다. 호스트는 있는데 키가 없는 식이면 누군가 설정하다 멈춘 것이고, 그건 조용히 건너뛸 일이 아니다

미설정 상태에서도 파이프라인은 초록불이 되고, 배포가 안 됐다는 사실은 모든 실행의 요약에 적힙니다. 빨간불을 무시하게 되는 것보다 낫다고 판단했습니다. 스테이징도 같은 규칙으로 맞췄습니다.

문서

docs/operations/deployment-secrets.md 를 추가했습니다.

  • 개인키를 채팅·이슈·PR 에 붙여넣지 않는 방법: gh secret set PRODUCTION_SSH_KEY < ~/.ssh/carecode_deploy
  • 배포 전용 키를 따로 만드는 이유(유출 시 그 키만 폐기)
  • PRODUCTION_SSH_KNOWN_HOSTS 를 넣어야 하는 이유 — 없으면 ssh-keyscan 이 최초 접속을 그냥 믿습니다
  • 서버에 미리 있어야 하는 것: docker 그룹, 스왑 2GB(1GB 인스턴스는 없으면 기동 중 OOM)
  • 첫 배포에서 각 스텝이 실패할 때의 의미

솔직히 적은 한계

문서에 그대로 적어 두었습니다.

  • 무중단이 아닙니다. 교체 순간에 짧은 순단이 있습니다(nginx 제어 도구가 없습니다). 깨진 이미지가 올라가는 일은 막습니다
  • SSH 키 권한을 좁히지 못했습니다. 워크플로가 docker login·run·curl 을 각각 실행하므로 authorized_keys 의 command= 로 하나만 묶을 수 없습니다
  • 운영 DB·Redis·메일·카카오 등 애플리케이션 환경 변수는 서버 .env 에 있고 이 문서 범위 밖입니다

이 PR 이 해결하지 못하는 것

시크릿 자체는 제가 넣을 수 없습니다. 머지 후 아래를 직접 실행하셔야 운영 배포가 시작됩니다.

gh secret set PRODUCTION_DEPLOY_HOST --body '배포서버주소'
gh secret set PRODUCTION_DEPLOY_USER --body 'ubuntu'
gh secret set PRODUCTION_HEALTH_URL  --body 'https://배포서버주소'
gh secret set PRODUCTION_SSH_KEY < ~/.ssh/carecode_deploy
ssh-keyscan -H 배포서버주소 | gh secret set PRODUCTION_SSH_KNOWN_HOSTS

넣기 전까지는 배포가 건너뛰어지고(초록불 + 요약에 안내), 넣는 순간부터 main 머지가 운영에 반영됩니다.

리포지토리 시크릿이 하나도 설정돼 있지 않다(gh secret list → 0개). 그래서 main 머지마다
Deploy to Production 이 첫 스텝(Check required secrets)에서 죽었다. #143~#147 까지 다섯 번
연속 같은 모양이다.

  success  Test and Build
  success  Security Scan
  success  Build Docker Image
  failure  Deploy to Production     ← Check required secrets

컨테이너를 띄우기 전에 멈추므로 운영 인스턴스를 건드리지는 않는다. 문제는 그 반대다 —
아무것도 배포되지 않는데 매번 빨간불로 끝나서 그 빨간불이 정상처럼 보인다. 그 상태가
굳으면 진짜 실패도 눈에 띄지 않는다(#94 가 적은 그대로다).

시크릿 상태를 세 가지로 나눴다.

  전부 있음   → 배포한다
  하나도 없음 → 건너뛴다. 실패가 아니고, 잡 요약에 "운영 배포를 건너뜀" 과 설정 문서
                경로가 남는다. 배포가 안 됐다는 사실이 조용히 지나가지 않는다
  일부만 있음 → 실패한다. 호스트는 있는데 키가 없는 식이면 누군가 설정하다 멈춘 것이고
                그건 건너뛸 일이 아니다

스테이징도 같은 규칙으로 맞췄다.

문서(docs/operations/deployment-secrets.md)를 추가했다. 개인키를 채팅·이슈·PR 에 붙여넣지
않고 파일에서 바로 읽는 명령(gh secret set PRODUCTION_SSH_KEY < ~/.ssh/...), 배포 전용 키를
따로 만드는 이유, 서버에 미리 있어야 하는 것(docker 그룹, 스왑 2GB), 첫 배포에서 각 스텝이
실패할 때의 의미를 적었다.

아직 남은 것도 적었다 — 교체 순간의 짧은 순단, SSH 키 권한을 command= 로 좁히지 못한 상태,
애플리케이션 환경 변수(.env)가 이 문서 범위 밖인 점.

Refs #94
앞 커밋에서 Set up SSH 스텝에 조건을 두 번 넣었다. 같은 키가 두 번이면 GitHub 이 워크플로
파일 자체를 거부한다 — 실행 목록에 "This run likely failed because of a workflow file issue"
만 남고 잡이 하나도 생기지 않는다.

yaml.safe_load 는 통과했다. 파이썬 YAML 파서는 중복 키를 뒤 값으로 덮어쓰고 넘어가기
때문이다. 스텝 목록을 실제로 훑어 "조건이 걸려야 하는 스텝에 if 가 있는지" 를 확인하는
쪽으로 검증을 바꿨고, 그 과정에서 deploy-production 의 Set up SSH 에 조건이 빠져 있던 것도
함께 찾았다.

Refs #94
@RosieOh
RosieOh force-pushed the fix/deploy-secrets-skip-cleanly branch from c9ca1e2 to 963b5e1 Compare October 23, 2026 02:36
@RosieOh
RosieOh merged commit 000c57b into main Oct 23, 2026
7 checks passed
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