Skip to content

Commit 6b5eb4e

Browse files
authored
Merge branch 'main' into feat/1172-consolidate-kwok-workflows
2 parents b459473 + 471a57c commit 6b5eb4e

667 files changed

Lines changed: 40883 additions & 9453 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.

.claude/CLAUDE.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ slog.Error("operation failed", "error", err, "component", "gpu-collector")
248248
helm:
249249
defaultRepository: https://charts.example.com
250250
defaultChart: example/my-operator
251+
defaultVersion: v1.0.0 # required: an unpinned Helm chart fails recipe resolution
251252
nodeScheduling:
252253
system:
253254
nodeSelectorPaths: [operator.nodeSelector]

.github/CODEOWNERS

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ pkg/health/** @nvidia/aicr-maintainer
3838
tools/health/** @nvidia/aicr-maintainer
3939
docs/user/recipe-health.md @nvidia/aicr-maintainer
4040

41+
# NodeWright tuning status (ADR-009 sibling): the generated component tuning
42+
# coverage table and its extractor/generator.
43+
pkg/tuning/** @nvidia/aicr-maintainer
44+
tools/tuning/** @nvidia/aicr-maintainer
45+
tools/internal/docgen/** @nvidia/aicr-maintainer
46+
4147
# Recipe-quality surfaces (RQ): the CUJ/CLI coverage matrix generator
4248
tools/coverage/** @nvidia/aicr-maintainer
4349

.github/actions/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,7 @@ jobs:
311311
- uses: ./.github/actions/go-test
312312
with:
313313
go_version: ${{ steps.versions.outputs.go }}
314+
helm_version: ${{ steps.versions.outputs.helm }}
314315
coverage_report: 'true'
315316
- uses: ./.github/actions/go-lint
316317
with:
@@ -331,6 +332,7 @@ jobs:
331332
- uses: ./.github/actions/go-test
332333
with:
333334
go_version: ${{ steps.versions.outputs.go }}
335+
helm_version: ${{ steps.versions.outputs.helm }}
334336
- uses: ./.github/actions/go-build-release
335337
id: release
336338
with:
@@ -395,5 +397,6 @@ To use these actions in other repositories:
395397
- uses: NVIDIA/aicr/.github/actions/go-test@main
396398
with:
397399
go_version: '1.26'
400+
helm_version: 'v4.2.2'
398401
coverage_report: 'true'
399402
```

.github/actions/cli-e2e/action.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,21 @@ inputs:
3434
helmfile_sha256:
3535
description: 'Helmfile SHA256 checksum for linux/amd64 (from .settings.yaml)'
3636
required: true
37+
cosign_version:
38+
description: 'Cosign version (from .settings.yaml via load-versions; must be >= v3.1.0 so DSSE attestations are logged to Rekor v2 as hashedrekord/PAE)'
39+
required: true
3740

3841
runs:
3942
using: 'composite'
4043
steps:
44+
# `required: true` on composite-action inputs is not enforced at runtime, so
45+
# a caller that omits cosign_version would silently get the cosign-installer
46+
# default (which lags the v3.1.0 floor DSSE-on-v2 needs). Fail closed. See #1650.
47+
- name: Require cosign_version
48+
shell: bash
49+
env:
50+
COSIGN_VERSION: ${{ inputs.cosign_version }}
51+
run: '[ -n "$COSIGN_VERSION" ] || { echo "cosign_version input is required (>= v3.1.0 for Rekor v2)" >&2; exit 1; }'
4152
- name: Setup Go
4253
uses: actions/setup-go@7a3fe6cf4cb3a834922a1244abfce67bcef6a0c5 # v6.2.0
4354
with:
@@ -46,6 +57,11 @@ runs:
4657

4758
- name: Install Cosign
4859
uses: sigstore/cosign-installer@faadad0cce49287aee09b3a48701e75088a2c6ad # v4.0.0
60+
with:
61+
# Pin from .settings.yaml (>= v3.1.0) so cosign logs DSSE attestations to
62+
# Rekor v2 as hashedrekord/PAE. The installer default (v3.0.2) writes the
63+
# legacy dsse entry type, which sigstore-go cannot verify. See #1650.
64+
cosign-release: '${{ inputs.cosign_version }}'
4965

5066
- name: Install GoReleaser
5167
uses: goreleaser/goreleaser-action@ec59f474b9834571250b370d4735c50f8e2d1e29 # v7.0.0

.github/actions/generate-slsa-predicate/action.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,3 +52,30 @@ runs:
5252
}
5353
EOF
5454
echo "SLSA_PREDICATE=${PREDICATE}" >> "$GITHUB_ENV"
55+
56+
# AICR signs release attestations to Rekor v2 (NVIDIA/aicr#1650). Fetch
57+
# the TUF-distributed v2 SigningConfig (Rekor v2 endpoint + timestamp
58+
# authority) so the goreleaser cosign + sign-catalog hooks can point
59+
# --signing-config at it. Co-located with SLSA_PREDICATE so the invariant
60+
# "signing enabled (SLSA_PREDICATE set) => signing config present" holds
61+
# for every signing workflow, not just the release. go run compiles aicr
62+
# from source (the built binaries do not exist yet). Requires Go, which
63+
# every caller sets up before this action.
64+
SC="${RUNNER_TEMP}/aicr-signing-config.json"
65+
# Retry the TUF fetch (3 attempts, 5s/10s backoff) to absorb transient
66+
# Sigstore TUF CDN blips, mirroring the goreleaser cosign hook — this is a
67+
# hard prerequisite for the whole signing flow, which fails closed if the
68+
# config is missing. The `-s` check treats an exit-0-but-empty-file result
69+
# as a failure so a truncated write is retried, not silently exported.
70+
for n in 1 2 3; do
71+
GOFLAGS=-mod=vendor go run ./cmd/aicr trust update --emit-signing-config "${SC}" && [ -s "${SC}" ] && break
72+
if [ "$n" -lt 3 ]; then
73+
echo "trust update attempt $n failed; retrying" >&2
74+
sleep $((n * 5))
75+
else
76+
echo "trust update failed after 3 attempts" >&2
77+
exit 1
78+
fi
79+
done
80+
echo "AICR_SIGNING_CONFIG=${SC}" >> "$GITHUB_ENV"
81+
echo "Rekor v2 signing config written to ${SC}"

.github/actions/go-build-release/action.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,10 @@ runs:
7575
with:
7676
registry: ${{ inputs.registry }}
7777

78+
# Note: the Rekor v2 signing config (AICR_SIGNING_CONFIG) is fetched and
79+
# exported by the generate-slsa-predicate action, co-located with
80+
# SLSA_PREDICATE, so it is present here without a separate step. See #1650.
81+
7882
- name: Build and Release
7983
id: release
8084
shell: bash

.github/actions/go-test/action.yml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ inputs:
2727
description: 'Minimum coverage percentage required'
2828
required: false
2929
default: ''
30+
helm_version:
31+
description: 'Helm version pinned in .settings.yaml (testing_tools.helm, via load-versions) — required by the argocd-helm live-render tests, which fail (not skip) in CI when helm is missing'
32+
required: true
3033

3134
runs:
3235
using: 'composite'
@@ -47,6 +50,17 @@ runs:
4750
go mod vendor
4851
git diff --exit-code vendor/ || (echo "vendor/ is out of sync with go.mod/go.sum; run 'make tidy' and commit go.mod, go.sum, and vendor/" && exit 1)
4952
53+
# The ubuntu-latest runner image bundles Helm 3; the unit tests that
54+
# shell out to helm (pkg/bundler/deployer/argocdhelm live-render tests)
55+
# must run against the Helm major pinned in .settings.yaml. The
56+
# setup-build-tools step replaces any preinstalled binary that does not
57+
# match the pin and fails the job if the install fails.
58+
- name: Install Helm
59+
uses: ./.github/actions/setup-build-tools
60+
with:
61+
install_helm: 'true'
62+
helm_version: '${{ inputs.helm_version }}'
63+
5064
- name: Install envtest binaries
5165
shell: bash
5266
run: |

.github/actions/install-aicr-release/action.yml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,32 @@ inputs:
2727
aicr-version:
2828
description: 'Released aicr version tag to install (e.g. v1.2.3).'
2929
required: true
30+
cosign_version:
31+
description: 'Cosign version (from .settings.yaml via load-versions; must be >= v3.1.0 to verify release provenance logged to Rekor v2 as hashedrekord/PAE).'
32+
required: true
3033

3134
runs:
3235
using: composite
3336
steps:
37+
# GitHub does not enforce `required: true` on composite-action inputs at
38+
# runtime, so a caller that omits cosign_version would pass '' to
39+
# cosign-release and silently get the installer default (which lags the
40+
# v3.1.0 floor). Fail closed instead. See #1650.
41+
- name: Require cosign_version
42+
shell: bash
43+
env:
44+
COSIGN_VERSION: ${{ inputs.cosign_version }}
45+
run: '[ -n "$COSIGN_VERSION" ] || { echo "cosign_version input is required (>= v3.1.0 for Rekor v2)" >&2; exit 1; }'
3446
# verify-blob-attestation needs no OIDC token (verification, not signing);
3547
# it fetches only the Sigstore trusted root, so the caller's contents:read
3648
# ceiling suffices. Pinned to the same SHA the release/build workflows use.
3749
- name: Install Cosign
3850
uses: sigstore/cosign-installer@6f9f17788090df1f26f669e9d70d6ae9567deba6 # v4.1.2
51+
with:
52+
# Pin from .settings.yaml (>= v3.1.0). The release binary provenance is
53+
# logged to Rekor v2 as hashedrekord/PAE; keep the verifier in lockstep
54+
# with the signer rather than the installer default (v3.0.6). See #1650.
55+
cosign-release: '${{ inputs.cosign_version }}'
3956
- name: Download, verify, and install released aicr
4057
shell: bash
4158
env:

.github/actions/load-versions/action.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,18 @@ outputs:
6464
grype:
6565
description: 'Grype version'
6666
value: ${{ steps.versions.outputs.grype }}
67+
cosign:
68+
description: 'Cosign version (must be >= v3.1.0 so DSSE attestations are logged to Rekor v2 as hashedrekord/PAE, not the legacy dsse entry type)'
69+
value: ${{ steps.versions.outputs.cosign }}
6770
yamllint:
6871
description: 'yamllint version'
6972
value: ${{ steps.versions.outputs.yamllint }}
7073
kubectl:
7174
description: 'kubectl version'
7275
value: ${{ steps.versions.outputs.kubectl }}
76+
kubelogin:
77+
description: 'kubelogin version'
78+
value: ${{ steps.versions.outputs.kubelogin }}
7379
kwok:
7480
description: 'KWOK version'
7581
value: ${{ steps.versions.outputs.kwok }}
@@ -165,9 +171,11 @@ runs:
165171
166172
# Security tools
167173
echo "grype=$(yq eval '.security_tools.grype' .settings.yaml)" >> $GITHUB_OUTPUT
174+
echo "cosign=$(yq eval '.security_tools.cosign' .settings.yaml)" >> $GITHUB_OUTPUT
168175
169176
# Testing tools
170177
echo "kubectl=$(yq eval '.testing_tools.kubectl' .settings.yaml)" >> $GITHUB_OUTPUT
178+
echo "kubelogin=$(yq eval '.testing_tools.kubelogin' .settings.yaml)" >> $GITHUB_OUTPUT
171179
echo "kind=$(yq eval '.testing_tools.kind' .settings.yaml)" >> $GITHUB_OUTPUT
172180
echo "nvkind=$(yq eval '.testing_tools.nvkind' .settings.yaml)" >> $GITHUB_OUTPUT
173181
echo "ctlptl=$(yq eval '.testing_tools.ctlptl' .settings.yaml)" >> $GITHUB_OUTPUT
@@ -218,7 +226,9 @@ runs:
218226
echo " addlicense: ${{ steps.versions.outputs.addlicense }}"
219227
echo " go_licenses: ${{ steps.versions.outputs.go_licenses }}"
220228
echo " grype: ${{ steps.versions.outputs.grype }}"
229+
echo " cosign: ${{ steps.versions.outputs.cosign }}"
221230
echo " kubectl: ${{ steps.versions.outputs.kubectl }}"
231+
echo " kubelogin: ${{ steps.versions.outputs.kubelogin }}"
222232
echo " kind: ${{ steps.versions.outputs.kind }}"
223233
echo " nvkind: ${{ steps.versions.outputs.nvkind }}"
224234
echo " ctlptl: ${{ steps.versions.outputs.ctlptl }}"

.github/copy-pr-bot.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,4 @@ additional_trustees:
3232
- yuanchen8911
3333
- JRosenboimNVIDIA
3434
- hkii
35+
- tjrasche

0 commit comments

Comments
 (0)