feat: 운영 승격 게이트 Phase2 — 콘솔 휴먼 승인 연동 (v0.28.0)
- project confirm: 게이트 켜진 prod 클러스터에 승인 요청 best-effort 등록(YAKCLOUD_ACTION=register-approval) - deploy.py: register-approval 액션(워크로드별 PENDING 생성) + 403 힌트를 운영 승인 안내로 - SKILL.md: 운영 승격 게이트에 콘솔 휴먼 승인(Phase2) 명시 — 에이전트 승인 불가 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -57,7 +57,7 @@ def api(method: str, path: str, body: dict | None = None, _retry: int = 5) -> di
|
||||
return api(method, path, body, _retry - 1)
|
||||
hint = {
|
||||
401: " — 배포 토큰(YAKCLOUD_TOKEN)이 없거나 만료/오류",
|
||||
403: " — 이 토큰 권한으로는 불가(엔드포인트 권한 확인)",
|
||||
403: " — 권한 없음 또는 운영 승격 승인 대기(콘솔의 배포 탭 '운영 승격 승인'에서 이 버전을 승인 후 재시도)",
|
||||
404: " — 경로의 id/이름 확인",
|
||||
405: " — 이 배포 토큰/엔드포인트로 허용되지 않는 작업(콘솔에서 처리 필요)",
|
||||
}.get(e.code, "")
|
||||
@ -292,6 +292,19 @@ def main() -> None:
|
||||
dom = f" +도메인 {ENV_DOMAINS}" if ENV_DOMAINS else ""
|
||||
log(f"[{ENV}] project '{m.get('project')}' → cluster '{cname}' ({CLUSTER}){dom} (tag {TAG}){' [DRY-RUN]' if DRY else ''}")
|
||||
requires, workloads = resolve_env(m, ENV) # base + environments.<ENV> 오버레이 병합
|
||||
# 운영 승격 승인 요청만 등록(project confirm 이 호출) — 게이트 켜진 클러스터면 워크로드별 PENDING 생성 후 종료.
|
||||
if os.environ.get("YAKCLOUD_ACTION") == "register-approval":
|
||||
cinfo = unwrap(api("GET", f"/clusters/{CLUSTER}")) or {}
|
||||
if not cinfo.get("requireProdApproval"):
|
||||
log(f"클러스터 '{cname}' 은 운영 승격 승인 게이트가 꺼져 있어 요청 불필요.")
|
||||
return
|
||||
for w in workloads:
|
||||
try:
|
||||
api("POST", f"/clusters/{CLUSTER}/prod-approvals", {"name": w["name"], "version": TAG})
|
||||
log(f"운영 승격 승인 요청 등록: {w['name']} {TAG} — 콘솔에서 승인 필요")
|
||||
except BaseException as e: # noqa: BLE001 — best-effort(로그인/네트워크 실패 무시)
|
||||
log(f"승인 요청 등록 스킵({w['name']}): {e}")
|
||||
return
|
||||
src_ids: dict[str, str | None] = {}
|
||||
for req in requires:
|
||||
src_ids[req["name"]] = reconcile_source(req)
|
||||
|
||||
Reference in New Issue
Block a user