ci: 릴리즈 파이프라인 원자화 및 표준/핫픽스 게이트 분리 - #113
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배경
2026-08-31 릴리즈 사고(run
33374742687).build and push docker image가error writing layer blob: failed to reserve cache로 08:51:31 실패했고 cosign 서명은 실행조차 안 됐는데, 08:51:49 — 18초 뒤 — argocd-image-updater가dashboard_latest_production의 새 digest를 감지해 운영에 반영했다. 워크플로는 빨간불인데 미서명 이미지가 운영에 나갔다.같은 병합에서 run이 두 개 떴다.
releases/2026-08-31/2스냅샷의 구 파일(on: pull_request, jobverify-merged-empty-release-pr)과 main의 신규 파일(on: pull_request_target, jobverify-merged-release-pr)이 각자 실행됐다.변경
1. 이미지 공개 원자화 — build-push는 immutable 태그 1개만 push하고 cache-to를 떼어냈다. 그 뒤 sign → verify(기존에 없던 단계) →
imagetools create로 채널 태그 승격 → 승격 digest 동등성 assert + 채널 태그 서명 검증. 캐시 export는 맨 뒤로 가고continue-on-error가 붙었다.additional-tags→promote-tags.2. 게이트 파일 분리 — 표준과 핫픽스는 불변조건이 정반대다(
changed_files==0vs>=1, head==main vshotfix/**, 트리 동일 vs merge-tree 결정성). 한 파일에 if로 섞여 있던 것을 갈랐다.release_pr_merged.ymlpull_request_targetreleases/**hotfix_pr_merged.yml(신규)pull_request_targethotfixes/**핫픽스 릴리즈 브랜치를
hotfixes/**네임스페이스로 옮기면 과거 스냅샷의branches: ['releases/**']필터에 걸리지 않아 중복 실행이 원천 차단된다. 여기에 더해hotfix_pr_merged.yml은 과거 어떤 스냅샷에도 없는 파일이라 방어선이 이중이다. 배포 본체(deploy_release_applications.yml)는workflow_call로 두 경로가 공유한다.release_pr_create.yml에release_type=hotfix모드를 추가했다. 8/31에는 릴리즈 브랜치가 이 워크플로를 거치지 않고 수동 생성됐다.검증
로컬 레지스트리 + CI와 동일한 cosign v2.2.4 실측:
imagetools create의 digest 보존--tlog-upload=false→--insecure-ignore-tlog=trueno matching signatures거부actionlint findings 0, YAML 파싱 통과, action 구조 검사 통과, 두 게이트 공통 블록 동일성 확인.
남은 것
releases/2026-08-31/2정리는 fix: 8/31 핫픽스를 main에 forward-port #112(forward-port) 병합 후 별도 진행관련