[FEAT] Dockerfile + ECR 이미지·배포 워크플로 (OIDC · 커밋 SHA 태그) - #7
Conversation
인프라 결정 반영: Docker Hub 대신 Private ECR z-ai(ap-northeast-2). 액세스 키·Docker Hub 토큰을 저장하지 않고 GitHub OIDC 로만 인증한다. Dockerfile 2단계 빌드. 의존성 레이어를 먼저 만들어 소스만 바뀔 때 재설치하지 않는다.⚠️ 이 프로젝트는 pip + requirements.txt 가 아니라 uv + uv.lock 이다 — uv sync --locked --no-dev 로 설치하고 .venv 를 실행 스테이지로 복사한다. uv 는 0.11.28 로 고정(로컬·CI 와 같은 해석 결과). 태그를 검증할 수 없는 외부 이미지에서 COPY 하지 않고 PyPI 고정 버전으로 설치한다. 비루트(uid 1001) 실행. HEALTHCHECK 는 무인증 /health 를 파이썬 표준 라이브러리로 확인한다 — AI-10(/internal/health)은 토큰이 필요해 헬스체크로 쓸 수 없고, curl 을 설치하지 않으려는 이유도 있다. ai-image.yml PR → docker build 만 (자격증명 없음). Dockerfile 이 깨졌는지 여기서 잡는다. develop → ECR 로 커밋 SHA 태그 푸시. latest 는 쓰지 않는다. ai-cd.yml main push · workflow_dispatch → 빌드·푸시 + SSM 배포. 대상은 tag:Role=ai, 스크립트는 /opt/z-ai-worker/deploy.sh. 인자 규약 $1=SHA $2=이미지 URI — ECR 은 레지스트리 호스트가 필요해서 URI 를 함께 넘긴다(스크립트가 $2 를 무시해도 무해). concurrency 는 cancel-in-progress:false — 배포를 중간에 끊으면 컨테이너가 반쯤 교체된 상태로 남는다. Immutable 대응 같은 태그 재푸시는 실패하므로, 두 워크플로 모두 태그 존재를 먼저 확인하고 있으면 건너뛴다. 워크플로 재실행은 정상 동작인데 그게 빨간불이 되면 사람이 빨간불을 무시하기 시작한다. 액션 버전은 BACKEND cd.yml 과 같은 조합으로 고정했다(같은 OIDC 역할로 검증된 조합). setup-uv 처럼 major 별칭 태그가 없는 액션이 있어 전부 존재를 확인했다. 검증 · 워크플로 YAML 3개 파싱 확인 · 이미지가 쓸 명령을 로컬에서 실행 — uv sync --locked --no-dev(--no-install-project) 둘 다 lock 과 일치. 원복 후 테스트 40개 통과 · Dockerfile 이 COPY 하는 대상 4개 존재 확인⚠️ docker build 자체는 로컬 Docker 데몬이 없어 확인하지 못했다 — 이 PR 의 build 잡이 그걸 검증한다 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
Warning Review limit reached
Next review available in: 7 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (5)
Comment |
📌 연관 이슈
📝 작업 내용
인프라 결정(Docker Hub → Private ECR
z-ai) 반영. 액세스 키·Docker Hub 토큰을 저장하지 않고 GitHub OIDC 로만 인증합니다.docker build만 (자격증명 없음) — Dockerfile 이 깨졌는지 확인z-ai로 커밋 SHA 태그 푸시tag:Role=ai·/opt/z-ai-worker/deploy.sh)💡 리뷰 포인트
1.
pip이 아니라uv다 — 이게 가장 헷갈릴 부분입니다.pip install -r requirements.txt로 이미지를 만들면 그런 파일이 없어서 실패합니다.uv는0.11.28로 고정했고, 태그를 검증할 수 없는 외부 이미지에서COPY하지 않고 PyPI 고정 버전으로 설치합니다.2. Immutable 재푸시 대응
같은 태그 재푸시는 실패하므로 두 워크플로 모두 태그 존재를 먼저 확인하고 있으면 건너뜁니다. 워크플로 재실행은 정상 동작인데 그게 빨간불이 되면 사람이 빨간불을 무시하기 시작합니다.
3. HEALTHCHECK 가
/health인 이유AI-10(
/internal/health)은X-Internal-Token이 필요해서 헬스체크로 쓸 수 없습니다 — 토큰을 이미지나 컨테이너 설정에 심어야 합니다. 무인증/health를 쓰고,curl을 설치하지 않으려고 파이썬 표준 라이브러리로 확인합니다.4. 배포 concurrency 는
cancel-in-progress: false배포를 중간에 끊으면 컨테이너가 반쯤 교체된 상태로 남습니다. 이미지 빌드(취소 가능)와 다릅니다.
5. 비루트 실행 ·
.dockerignore에.envuid 1001로 돕니다..dockerignore에서.env를 빼는 게 가장 중요합니다 — 운영 비밀값은 SSM Parameter Store 가 주입합니다.✅ 검증
uv sync --locked --no-dev·--no-install-project둘 다 lock 과 일치. 원복 후 테스트 40개 통과Dockerfile이COPY하는 대상 4개(pyproject.toml·uv.lock·.python-version·app) 존재 확인setup-uv@v9처럼 major 별칭이 없는 액션이 있어서)Role=ai태그 — 없으면 배포 스텝이 "대상 없음"으로 실패합니다 (ai-cd.yml에서 명확한 에러 메시지로 끊습니다)/opt/z-ai-worker/deploy.sh인자 규약 —$1=커밋 SHA,$2=전체 이미지 URI로 넘깁니다. BACKENDdeploy.sh는 SHA 만 받지만 ECR 은 레지스트리 호스트가 필요해서 URI 를 함께 보냅니다. 스크립트가$2를 무시해도 무해합니다deploy.sh소관으로 두고 이 워크플로는 SHA 전달까지만 합니다