@@ -92,16 +92,25 @@ This action runs `tools/setup-tools --skip-go --skip-docker` in auto mode, which
9292` ` `
9393
9494# ### `go-build-release/`
95- **Purpose**: Complete build and release pipeline (tools + auth + make release)
95+ **Purpose**: Validate the exact-tag release target, then run the complete build
96+ and release pipeline (tools + auth + make release)
9697**When to use**: Release workflows that build and publish artifacts
9798**Inputs**:
9899- `registry` (optional) : Container registry (default: "ghcr.io")
100+ - `ko_version` (optional) : Ko version (default: "v0.18.0")
99101- `goreleaser_version` (required) : GoReleaser version from `load-versions`
102+ - `go_licenses_version` (required) : go-licenses version from `load-versions`
103+ - `candidate_tag` (required) : Validated `candidate-<run-id>-<run-attempt>` image tag
100104
101105**Outputs**:
102106- `release_outcome` : Release step outcome (success/failure)
103107
104- **Note**: Image repository paths are fully specified in `.goreleaser.yaml` under `kos.repositories`.
108+ **Note**: A partial draft is reused only when its name and tag both equal the
109+ release tag, its pre-release state matches, and its existing assets are a safe
110+ subset of the fixed release asset set. Unexpected draft assets and
111+ already-public releases are rejected before GoReleaser runs, and reused draft
112+ notes are replaced with notes generated from the current tag. Image repository
113+ paths are fully specified in `.goreleaser.yaml` under `kos.repositories`.
105114
106115**Example**:
107116` ` ` yaml
@@ -110,7 +119,10 @@ This action runs `tools/setup-tools --skip-go --skip-docker` in auto mode, which
110119- uses: ./.github/actions/go-build-release
111120 id: release
112121 with:
122+ ko_version: ${{ steps.versions.outputs.ko }}
113123 goreleaser_version: ${{ steps.versions.outputs.goreleaser }}
124+ go_licenses_version: ${{ steps.versions.outputs.go_licenses }}
125+ candidate_tag: ${{ needs.detect.outputs.candidate_tag }}
114126- if: steps.release.outputs.release_outcome == 'success'
115127 run: echo "Release succeeded"
116128` ` `
@@ -130,11 +142,13 @@ This action runs `tools/setup-tools --skip-go --skip-docker` in auto mode, which
130142` ` `
131143
132144# ### `attest-image-from-tag/`
133- **Purpose**: Resolve digest from tag and generate SBOM + provenance
134- **When to use**: Attesting images by tag (typical release workflow)
145+ **Purpose**: Bind a fixed AICR candidate image to an authoritative digest and
146+ generate SBOM + provenance
147+ **When to use**: Attesting candidate images in the AICR release workflow
135148**Inputs**:
136- - `image_name` (required) : Full image name without tag (e.g., "ghcr.io/org/image")
137- - `tag` (required) : Image tag (e.g., "v1.2.3")
149+ - `image_name` (required) : One of the seven fixed AICR release image names
150+ - `candidate_tag` (required) : Validated `candidate-<run-id>-<run-attempt>` tag
151+ - `expected_digest` (required) : Authoritative `sha256:<64 lowercase hex>` digest
138152- `crane_version` (optional) : crane version (default: "v0.20.6")
139153
140154**Outputs**:
@@ -144,23 +158,26 @@ This action runs `tools/setup-tools --skip-go --skip-docker` in auto mode, which
144158` ` ` yaml
145159- uses: ./.github/actions/attest-image-from-tag
146160 with:
147- image_name: ghcr.io/${{ github.repository_owner }}/my-app
148- tag: ${{ github.ref_name }}
161+ image_name: ghcr.io/nvidia/aicrd
162+ candidate_tag: candidate-${{ github.run_id }}-${{ github.run_attempt }}
163+ expected_digest: sha256:0000000000000000000000000000000000000000000000000000000000000000
149164` ` `
150165
151166# ### `sbom-and-attest/`
167+
152168**Purpose**: Generate SBOM and attestations for image with known digest
153169**When to use**: When you already have the digest (e.g., from build output)
154170**Inputs**:
155- - `image_name` (required) : Full image name
171+ - `image_name` (required) : One of the seven fixed AICR release image names
156172- `image_digest` (required) : sha256 digest
157173
158174**Example**:
175+
159176` ` ` yaml
160177- uses: ./.github/actions/sbom-and-attest
161178 with:
162- image_name: ghcr.io/org/image
163- image_digest: sha256:abc123...
179+ image_name: ghcr.io/nvidia/aicrd
180+ image_digest: sha256:0000000000000000000000000000000000000000000000000000000000000000
164181` ` `
165182
166183# ## KWOK Testing Actions
@@ -236,12 +253,17 @@ This action runs `tools/setup-tools --skip-go --skip-docker` in auto mode, which
236253**Trigger**: Semantic version tags (v*.*.*)
237254**Purpose**: Build, release, attest, deploy
238255**Jobs**:
239- 1. **Unit Tests** (parallel) : Go CI + security scan
240- 2. **Integration Tests** (parallel) : CLI integration tests
241- 3. **E2E Tests** (parallel) : Full end-to-end tests
242- 4. **Build and Release** (after tests) : GoReleaser builds binaries and images to GHCR
243- 5. **Attest Images** (after build) : SBOM and provenance for aicr and aicrd images
244- 6. **Deploy Demo API Server** (after attest) : Copy image to Artifact Registry and deploy demo to Cloud Run (example deployment)
256+ 1. **Qualification** : Reusable test, lint, E2E, and source-security gates
257+ 2. **Candidate Builds** : Draft release artifacts and all seven images under one
258+ run-unique candidate tag
259+ 3. **Digest Resolution** : One authoritative seven-image digest map
260+ 4. **Image Security** : Both platforms of every resolved digest are scanned
261+ 5. **Attestation** : Platform SBOMs and reusable-workflow provenance for the same digests
262+ 6. **Promotion** : Read-only preflight, all version aliases, then stable `latest`
263+ aliases only after every version alias is verified
264+ 7. **Publication** : Require the exact release asset set, then publish the
265+ validated numeric GitHub release ID
266+ 8. **Stable Distribution** : Publish Homebrew and deploy the demo after publication
245267
246268# ## `test-deploy.yaml`
247269**Trigger**: Manual (workflow_dispatch)
@@ -336,11 +358,15 @@ jobs:
336358 - uses: ./.github/actions/go-build-release
337359 id: release
338360 with:
361+ ko_version: ${{ steps.versions.outputs.ko }}
339362 goreleaser_version: ${{ steps.versions.outputs.goreleaser }}
363+ go_licenses_version: ${{ steps.versions.outputs.go_licenses }}
364+ candidate_tag: candidate-${{ github.run_id }}-${{ github.run_attempt }}
340365 - uses: ./.github/actions/attest-image-from-tag
341366 with:
342367 image_name: ghcr.io/nvidia/aicrd
343- tag: ${{ github.ref_name }}
368+ candidate_tag: candidate-${{ github.run_id }}-${{ github.run_attempt }}
369+ expected_digest: sha256:0000000000000000000000000000000000000000000000000000000000000000
344370 crane_version: ${{ steps.versions.outputs.crane }}
345371` ` `
346372
0 commit comments