Skip to content

Commit a70884c

Browse files
authored
Merge branch 'main' into fix/1779-e2e-overlap-cluster-builds
2 parents 32406c2 + 3c6aaff commit a70884c

77 files changed

Lines changed: 8191 additions & 383 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/on-push.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ jobs:
9393
persist-credentials: false
9494

9595
- name: Setup Docker Buildx
96-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
96+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
9797

9898
- name: Authenticate to registry
9999
uses: ./.github/actions/ghcr-login
@@ -154,7 +154,7 @@ jobs:
154154
uses: ./.github/actions/ghcr-login
155155

156156
- name: Setup Docker Buildx
157-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
157+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
158158

159159
- name: Create multi-arch manifests for validator images
160160
env:

.github/workflows/on-tag.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ jobs:
243243
persist-credentials: false
244244

245245
- name: Setup Docker Buildx
246-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
246+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
247247

248248
- name: Authenticate to registry
249249
uses: ./.github/actions/ghcr-login
@@ -320,7 +320,7 @@ jobs:
320320
persist-credentials: false
321321

322322
- name: Setup Docker Buildx
323-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
323+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
324324

325325
- name: Authenticate to registry
326326
uses: ./.github/actions/ghcr-login
@@ -375,7 +375,7 @@ jobs:
375375
uses: ./.github/actions/ghcr-login
376376

377377
- name: Setup Docker Buildx
378-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
378+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
379379

380380
# Inline by design: this job creates only run-unique candidate manifests.
381381
# The shared docker-manifest action also writes public aliases, which must

.github/workflows/uat-aws.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ jobs:
322322
uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
323323
- name: Set up Docker Buildx
324324
if: inputs.aicr_version == '' && inputs.skip_tests != true && inputs.lifecycle != 'daytime-down'
325-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
325+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
326326

327327
# Main cell only: release cells use the released validator images the
328328
# released binary self-resolves to (skipped when aicr_version is set).

.github/workflows/vuln-scan-images.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ jobs:
139139
persist-credentials: false
140140

141141
- name: Setup Docker Buildx
142-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
142+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
143143

144144
- name: Authenticate to registry
145145
uses: ./.github/actions/ghcr-login
@@ -213,7 +213,7 @@ jobs:
213213
persist-credentials: false
214214

215215
- name: Setup Docker Buildx
216-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
216+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
217217

218218
- name: Authenticate to registry
219219
uses: ./.github/actions/ghcr-login
@@ -262,7 +262,7 @@ jobs:
262262
uses: ./.github/actions/ghcr-login
263263

264264
- name: Setup Docker Buildx
265-
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
265+
uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
266266

267267
- name: Create multi-arch manifests
268268
run: |

.settings.yaml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,14 @@ testing_tools:
8585
# renovate: datasource=github-releases depName=databus23/helm-diff depType=testing_tools
8686
helm_diff: 'v3.15.11'
8787
# renovate: datasource=github-releases depName=helmfile/helmfile depType=testing_tools
88-
helmfile: 'v1.7.3'
88+
helmfile: 'v1.7.4'
8989
# helmfile_checksums are refreshed automatically by tools/update-helmfile-checksums
9090
# via Renovate postUpgradeTasks whenever the helmfile version above is bumped.
9191
helmfile_checksums:
92-
linux_amd64: '23d7df593f704ab1709b3020c8c8083b1517c9e780b5010e756a7d36bd901552'
93-
linux_arm64: '4a2346df40362f49f395e47d5d6a16a29322b5c6968720c1bde60d101ae97e3b'
94-
darwin_amd64: 'b1be552f6ff68c7c10f064dec657e4297bc581eecf1ed66ff433964e17d9eb36'
95-
darwin_arm64: 'b69933ab364b010c320d1c858265d1845735784d8b317211e046cf74e22c6e80'
92+
linux_amd64: 'f96ef0a015df06b29d7f38bf0ca08821018ae25eb96bf2c7abd3affa1b84e112'
93+
linux_arm64: '0292f57a4638a21e775b0ce8bde37ee3fdd65dbbdbe0e5b9a06718f1dd04c7fa'
94+
darwin_amd64: '7a0951fcc5bb991d7ea3a0c80e35754eb3981dcadba19795edbec7cba2518ae2'
95+
darwin_arm64: 'e1490d371fecc1f2d9aae914ef34058f3cb2363c9ee63350b37a85c3994d71d9'
9696
# renovate: datasource=github-releases depName=kubernetes-sigs/kwok depType=testing_tools
9797
kwok: 'v0.8.0'
9898
# renovate: datasource=github-releases depName=kyverno/chainsaw depType=testing_tools
@@ -115,7 +115,7 @@ testing_tools:
115115
# Run with USE_SSL=1: sigstore's awskms signer hardcodes https://, so the e2e
116116
# serves TLS with a mkcert cert (see mkcert below).
117117
# renovate: datasource=docker depName=ministackorg/ministack depType=testing_tools
118-
ministack_image: 'ministackorg/ministack:1.4.17'
118+
ministack_image: 'ministackorg/ministack:1.4.19'
119119
# OpenBAO: the Linux Foundation Apache-2.0 fork of HashiCorp Vault, used by the
120120
# Vault KMS e2e to exercise the hashivault:// signing/verification path against
121121
# a real Transit secrets engine. API-identical to Vault; the sigstore hashivault

RELEASING.md

Lines changed: 98 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -224,33 +224,115 @@ Every release includes:
224224

225225
### Container Attestations
226226

227-
```bash
228-
export TAG=$(curl -s https://api.github.com/repos/NVIDIA/aicr/releases/latest | jq -r '.tag_name')
227+
Verify the **digest-pinned** image that a tag currently resolves to. Tag refs
228+
are registry-rewritable; attestations bind to digests. Requires `crane` (or
229+
substitute `docker buildx imagetools inspect` for digest resolution).
229230

230-
# GitHub CLI (core images)
231-
gh attestation verify oci://ghcr.io/nvidia/aicr:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
232-
gh attestation verify oci://ghcr.io/nvidia/aicrd:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
233-
gh attestation verify oci://ghcr.io/nvidia/aicr-gate:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
231+
Predicate types attach at two different levels of the image index, so the
232+
digest you verify against depends on what you are asking for:
234233

235-
# GitHub CLI (validator images)
236-
gh attestation verify oci://ghcr.io/nvidia/aicr-validators/deployment:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
237-
gh attestation verify oci://ghcr.io/nvidia/aicr-validators/performance:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
238-
gh attestation verify oci://ghcr.io/nvidia/aicr-validators/conformance:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
239-
gh attestation verify oci://ghcr.io/nvidia/aicr-validators/aiperf-bench:${TAG} --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
234+
| Predicate | Attached to | Verify against |
235+
|-----------|-------------|----------------|
236+
| SLSA provenance (`slsaprovenance1`) | multi-arch index | `crane digest <image>:<tag>` |
237+
| OpenVEX (`openvex`) | multi-arch index | `crane digest <image>:<tag>` |
238+
| SBOM (`spdxjson`) | per-platform child manifest | `crane digest --platform <os>/<arch> <image>:<tag>` |
240239

241-
# Cosign
240+
Asking for `spdxjson` against the index digest fails with `none of the
241+
attestations matched the predicate type`.
242+
243+
```bash
244+
set -euo pipefail
245+
TAG=$(gh release view --repo NVIDIA/aicr --json tagName -q .tagName)
246+
[[ -n "${TAG}" ]] || { echo "failed to resolve latest TAG" >&2; exit 1; }
247+
248+
# Resolve immutable digests up front so a missing image / crane failure
249+
# aborts here (set -e) instead of being attributed to a later gh/cosign step.
250+
AICR_INDEX=$(crane digest "ghcr.io/nvidia/aicr:${TAG}")
251+
AICRD_INDEX=$(crane digest "ghcr.io/nvidia/aicrd:${TAG}")
252+
GATE_INDEX=$(crane digest "ghcr.io/nvidia/aicr-gate:${TAG}")
253+
DEPLOY_INDEX=$(crane digest "ghcr.io/nvidia/aicr-validators/deployment:${TAG}")
254+
PERF_INDEX=$(crane digest "ghcr.io/nvidia/aicr-validators/performance:${TAG}")
255+
CONF_INDEX=$(crane digest "ghcr.io/nvidia/aicr-validators/conformance:${TAG}")
256+
AIPERF_INDEX=$(crane digest "ghcr.io/nvidia/aicr-validators/aiperf-bench:${TAG}")
257+
258+
# GitHub CLI (core images) — --source-ref binds the attestation to this tag
259+
gh attestation verify "oci://ghcr.io/nvidia/aicr@${AICR_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
260+
gh attestation verify "oci://ghcr.io/nvidia/aicrd@${AICRD_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
261+
gh attestation verify "oci://ghcr.io/nvidia/aicr-gate@${GATE_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
262+
263+
# GitHub CLI (validator images)
264+
gh attestation verify "oci://ghcr.io/nvidia/aicr-validators/deployment@${DEPLOY_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
265+
gh attestation verify "oci://ghcr.io/nvidia/aicr-validators/performance@${PERF_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
266+
gh attestation verify "oci://ghcr.io/nvidia/aicr-validators/conformance@${CONF_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
267+
gh attestation verify "oci://ghcr.io/nvidia/aicr-validators/aiperf-bench@${AIPERF_INDEX}" --repo NVIDIA/aicr --signer-workflow NVIDIA/aicr/.github/workflows/attest-images.yaml --source-ref "refs/tags/${TAG}"
268+
269+
# Cosign — provenance and OpenVEX are on the index. Pin the workflow *and*
270+
# the exact tag ref (same binding as --source-ref above): without
271+
# --certificate-github-workflow-ref, the identity regexp alone would accept
272+
# an attestation signed for any release tag on a digest this tag was
273+
# rewritten to point at.
274+
IDENTITY='^https://github\.com/NVIDIA/aicr/\.github/workflows/attest-images\.yaml@refs/tags/.+$'
275+
for predicate in slsaprovenance1 openvex; do
276+
cosign verify-attestation \
277+
--type "${predicate}" \
278+
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
279+
--certificate-identity-regexp "${IDENTITY}" \
280+
--certificate-github-workflow-ref "refs/tags/${TAG}" \
281+
"ghcr.io/nvidia/aicr@${AICR_INDEX}" >/dev/null
282+
done
283+
284+
# Cosign — the SBOM is on the per-platform child manifest
285+
platform="linux/$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')"
286+
AICR_CHILD=$(crane digest --platform "${platform}" "ghcr.io/nvidia/aicr@${AICR_INDEX}")
242287
cosign verify-attestation \
243288
--type spdxjson \
244289
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
245-
--certificate-identity-regexp '^https://github\.com/NVIDIA/aicr/\.github/workflows/attest-images\.yaml@refs/tags/.+$' \
246-
ghcr.io/nvidia/aicr:${TAG}
290+
--certificate-identity-regexp "${IDENTITY}" \
291+
--certificate-github-workflow-ref "refs/tags/${TAG}" \
292+
"ghcr.io/nvidia/aicr@${AICR_CHILD}" >/dev/null
247293
```
248294

249295
### Binary Checksums
250296

297+
`aicr_checksums.txt` lists digests for release archives (and SBOMs). Download
298+
the archive you intend to verify **and** the checksums file into the same
299+
directory, assert the archive is present and non-empty, then check **that**
300+
file’s line — do not use `--ignore-missing` (it can pass with zero files
301+
verified). On macOS, use `shasum -a 256` (built-in); on Linux, `sha256sum`
302+
(GNU coreutils).
303+
251304
```bash
252-
curl -sL "https://github.com/NVIDIA/aicr/releases/download/${TAG}/aicr_checksums.txt" -o checksums.txt
253-
sha256sum -c checksums.txt --ignore-missing
305+
set -euo pipefail
306+
TAG=$(gh release view --repo NVIDIA/aicr --json tagName -q .tagName)
307+
[[ -n "${TAG}" ]] || { echo "failed to resolve latest TAG" >&2; exit 1; }
308+
309+
os=$(uname -s | tr '[:upper:]' '[:lower:]')
310+
arch=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
311+
archive="aicr_${TAG#v}_${os}_${arch}.tar.gz"
312+
313+
tmpdir=$(mktemp -d)
314+
trap 'rm -rf "${tmpdir}"' EXIT
315+
gh release download "${TAG}" -R NVIDIA/aicr -D "${tmpdir}" \
316+
-p "aicr_checksums.txt" \
317+
-p "${archive}"
318+
319+
cd "${tmpdir}"
320+
[[ -s "${archive}" ]] || { echo "missing or empty archive: ${archive}" >&2; exit 1; }
321+
[[ -s aicr_checksums.txt ]] || { echo "missing aicr_checksums.txt" >&2; exit 1; }
322+
323+
# Fail closed: verify only the downloaded archive line from the checksums file.
324+
line=$(grep -F " ${archive}" aicr_checksums.txt) || {
325+
echo "no checksum entry for ${archive}" >&2
326+
exit 1
327+
}
328+
if command -v sha256sum >/dev/null 2>&1; then
329+
printf '%s\n' "${line}" | sha256sum -c -
330+
elif command -v shasum >/dev/null 2>&1; then
331+
printf '%s\n' "${line}" | shasum -a 256 -c -
332+
else
333+
echo "need sha256sum (GNU coreutils) or shasum" >&2
334+
exit 1
335+
fi
254336
```
255337

256338
## Demo Deployment

0 commit comments

Comments
 (0)