--- title: blog-topic / digest-first-java-release-pipeline source_type: blog-topic status: raw related_branches: [feature-build-release-supply-chain-contract] related_projects: [ca-tmpl] tags: [blog-topic, ca-tmpl, ci-cd, gradle, docker, supply-chain, reproducible-builds] created: 2026-06-21 status_label: ready-for-canonical target_audience: backend-engineer inspiration_url: archive_url: --- # blog-topic: digest-first-java-release-pipeline > Layer: `raw/blog-topics/` — 실제 Java 21/Gradle 멀티모듈 release pipeline 구현에서 나온 글감 원석. ## Parent / 부모 - [[raw/branch-notes/feature-build-release-supply-chain-contract]] — digest-first build/sign/verify/promotion과 rollback audit를 구현한 작업. ## 트리거 / Trigger - 트리거 유형: `branch-work` - 트리거 날짜: 2026-06-21 - 트리거 연결 노트: [[raw/branch-notes/feature-build-release-supply-chain-contract]]. ## 글감 / Topic seed - 한 문장 요지: 재현 가능한 JAR부터 digest-bound SBOM·Cosign·SLSA 검증과 rollback manifest까지 하나의 release-blocking DAG로 묶어야 mutable tag가 공급망 SSOT가 되는 일을 막을 수 있다. - 예상 제목 후보: - Java 릴리스를 태그가 아니라 Digest로 승격하는 공급망 파이프라인 - Gradle Lock부터 SLSA까지: 재빌드 없는 컨테이너 릴리스 설계 ## 핵심 주장 후보 / Claim candidates - 사실 후보: - Gradle archive timestamp/order/mode와 JDK pin을 고정한 두 clean build에서 같은 SHA-256을 얻었다. 근거: [[raw/branch-notes/feature-build-release-supply-chain-contract]] D10, §구현 결과. - Cosign signer identity/issuer와 SLSA exact builder ID 검증을 통과한 digest만 version tag로 promotion하도록 DAG를 배선했다. 근거: 같은 branch D4, D7, D12, D13. - 경험 후보: - `dependencies` report가 lock 누락을 출력하고도 exit 0인 fail-open을 발견해 실제 resolution task와 negative lock-drift test로 교체했다. 근거: 같은 branch §마주친 문제. - rollback audit가 release asset 이름뿐 아니라 manifest의 source revision/image digest와 GHCR digest 일치까지 검증하도록 보강했다. 근거: 같은 branch D11, §구현 결과. - 의견/해석 후보: - 공급망 파이프라인의 핵심은 도구 수가 아니라, immutable identity가 모든 gate와 rollback 경로를 관통하도록 만드는 것이다. ## Outline seed 1. Tag-only release의 빈틈 — mutable tag와 재빌드가 검증 대상/배포 대상의 동일성을 깨뜨린다. 2. Build contract — strict dependency locks, SemVer+sha, reproducible archives, pinned JDK/base digest로 입력을 닫는다. 3. Evidence DAG — High/Critical scan, SPDX SBOM, Cosign identity, SLSA exact builder를 promotion 전에 fan-in한다. 4. Promotion과 rollback — 검증된 digest를 재빌드 없이 tag하고 manifest/SBOM/GHCR digest retention을 audit한다. 5. 검증의 정직한 경계 — local fixture와 live GitHub OIDC/Rekor/GHCR 증거를 분리한다. ## Canonical 전환 후보 / Canonical extraction candidates - `wiki/projects/ca-tmpl/build-release-supply-chain.md` 후보: - ca-tmpl에 실제 적용된 release DAG, lock task, manifest/retention audit. - `wiki/concepts/digest-first-release-promotion.md` 후보: - immutable digest 중심 verification/promotion/rollback 일반 패턴. - 필요한 추가 검증: - GitHub release candidate tag로 OIDC/Rekor/GHCR live pipeline 실행. - generated SBOM과 Gradle resolved dependency 비교. ## Sources / 근거 후보 - [[raw/branch-notes/feature-build-release-supply-chain-contract]] — 구현 결정 D1~D13과 local evidence. - [[raw/errors/sandbox-build-verification-boundaries-2026-06-21]] — verification 경계와 안전한 대체. - [[raw/interviews/digest-first-supply-chain-release-gates]] — 설계 질문과 답변 경계. - [[raw/official-docs/supply-chain-cosign-keyless-sigstore]] — Cosign keyless 근거. - [[raw/official-docs/supply-chain-slsa-provenance-framework]] — SLSA provenance 근거. - [[raw/official-docs/gradle-reproducible-archives-working-with-files]] — reproducible archive 근거. ## 미해결 / Unknown - 아직 확인해야 할 사실: GitHub-hosted live provenance payload, Rekor entry, GHCR referrer retention. - 과장하면 안 되는 부분: local workflow/static/fixture 검증을 production release 성공으로 표현하지 않는다. - 블로그로 쓰기 전에 필요한 canonical 정제: branch 결과를 project/concept canonical로 승격하고 live CI evidence를 별도 등급으로 병합한다. ## Decision / 처리 결정 - 액션: `promote-to-canonical` - 이유: `wiki/projects/ca-tmpl/devops-ci-supply-chain-dx.md` 에 digest-first release pipeline / supply-chain DAG 글감으로 반영한다. - 다음 단계: live release evidence 확보 전까지 production release 성공으로 표현하지 않는다. ## Related / 관련 - 관련 branch: [[raw/branch-notes/feature-build-release-supply-chain-contract]]. - 관련 error: [[raw/errors/sandbox-build-verification-boundaries-2026-06-21]]. - 관련 interview prep: [[raw/interviews/digest-first-supply-chain-release-gates]]. - derived blog: 생성 전.