2828 kernel_flavors : ${{ steps.extract_driver_branch.outputs.kernel_flavors }}
2929 dist : ${{ steps.extract_driver_branch.outputs.dist }}
3030 lts_kernel : ${{ steps.extract_driver_branch.outputs.lts_kernel }}
31+ platforms : ${{ steps.extract_driver_branch.outputs.platforms }}
3132 steps :
3233 - name : Checkout code
3334 uses : actions/checkout@v6
5455 lts_kernel_json=$(printf '%s\n' "${LTS_KERNEL[@]}" | jq -R . | jq -cs .)
5556 echo "lts_kernel=$lts_kernel_json" >> $GITHUB_OUTPUT
5657
58+ # platforms for precompiled build (amd64 always; arm64 for ubuntu24.04)
59+ PLATFORMS=("amd64" "arm64")
60+ platforms_json=$(printf '%s\n' "${PLATFORMS[@]}" | jq -R . | jq -cs .)
61+ echo "platforms=$platforms_json" >> $GITHUB_OUTPUT
62+
5763 precompiled-build-image :
5864 needs : set-driver-version-matrix
5965 runs-on : linux-amd64-cpu4
@@ -63,13 +69,16 @@ jobs:
6369 flavor : ${{ fromJson(needs.set-driver-version-matrix.outputs.kernel_flavors) }}
6470 dist : ${{ fromJson(needs.set-driver-version-matrix.outputs.dist) }}
6571 lts_kernel : ${{ fromJson(needs.set-driver-version-matrix.outputs.lts_kernel) }}
72+ platform : ${{ fromJson(needs.set-driver-version-matrix.outputs.platforms) }}
6673 exclude :
6774 - dist : ubuntu24.04
6875 driver_branch : 535
6976 - lts_kernel : 5.15
7077 dist : ubuntu24.04
7178 - flavor : azure-fde
7279 dist : ubuntu22.04
80+ - dist : ubuntu22.04
81+ platform : arm64
7382 steps :
7483 - uses : actions/checkout@v6
7584 name : Check out code
8392 GENERATE_ARTIFACTS="false"
8493 echo "PUSH_ON_BUILD=${GENERATE_ARTIFACTS}" >> $GITHUB_ENV
8594 echo "BUILD_MULTI_ARCH_IMAGES=${GENERATE_ARTIFACTS}" >> $GITHUB_ENV
95+ echo "DOCKER_BUILD_PLATFORM_OPTIONS=--platform=linux/${{ matrix.platform }}" >> $GITHUB_ENV
8696
8797 - name : Set up QEMU
8898 uses : docker/setup-qemu-action@v3
@@ -100,6 +110,7 @@ jobs:
100110 env :
101111 IMAGE_NAME : ghcr.io/nvidia/driver
102112 LTS_KERNEL : ${{ matrix.lts_kernel }}
113+ DOCKER_BUILD_PLATFORM_OPTIONS : --platform=linux/${{ matrix.platform }}
103114 run : |
104115 if [[ "${{ matrix.dist }}" == "ubuntu22.04" ]]; then
105116 BASE_TARGET="jammy"
@@ -120,6 +131,7 @@ jobs:
120131 IMAGE_NAME : ghcr.io/nvidia/driver
121132 PRECOMPILED : " true"
122133 DIST : signed_${{ matrix.dist }}
134+ DOCKER_BUILD_PLATFORM_OPTIONS : --platform=linux/${{ matrix.platform }}
123135 run : |
124136 source kernel_version.txt && \
125137 make DRIVER_VERSIONS=${DRIVER_VERSIONS} DRIVER_BRANCH=${{ matrix.driver_branch }} build-${DIST}-${DRIVER_VERSION}
@@ -136,34 +148,40 @@ jobs:
136148 elif [[ "${{ matrix.dist }}" == "ubuntu24.04" ]]; then
137149 BASE_TARGET="noble"
138150 fi
139- tar -cvf kernel-version-${{ matrix.driver_branch }}-${KERNEL_VERSION}-${DIST}.tar kernel_version.txt
140- docker save "${PRIVATE_REGISTRY}/nvidia/driver:base-${BASE_TARGET}-${LTS_KERNEL}-${{ matrix.flavor }}-${{ matrix.driver_branch }}" \
141- -o ./base-images-${{ matrix.driver_branch }}-${KERNEL_VERSION}-${DIST}.tar
142- docker save "${PRIVATE_REGISTRY}/nvidia/driver:${{ matrix.driver_branch }}-${KERNEL_VERSION}-${DIST}" \
143- -o ./driver-images-${{ matrix.driver_branch }}-${KERNEL_VERSION}-${DIST}.tar
144- # set env for artifacts upload
145- echo "KERNEL_VERSION=$KERNEL_VERSION" >> $GITHUB_ENV
146- echo "DIST=$DIST" >> $GITHUB_ENV
151+ if [[ "${{ matrix.platform }}" == "amd64" ]]; then
152+ PLATFORM_SUFFIX=""
153+ else
154+ PLATFORM_SUFFIX="-${{ matrix.platform }}"
155+ fi
156+ BASE_ARTIFACT="base-images-${{ matrix.driver_branch }}-${KERNEL_VERSION}-${{ matrix.dist }}${PLATFORM_SUFFIX}"
157+ DRIVER_ARTIFACT="driver-images-${{ matrix.driver_branch }}-${KERNEL_VERSION}-${{ matrix.dist }}${PLATFORM_SUFFIX}"
158+ KERNEL_VERSION_ARTIFACT="kernel-version-${{ matrix.driver_branch }}-${KERNEL_VERSION}-${{ matrix.dist }}${PLATFORM_SUFFIX}"
159+ echo "BASE_ARTIFACT_NAME=${BASE_ARTIFACT}" >> $GITHUB_ENV
160+ echo "DRIVER_ARTIFACT_NAME=${DRIVER_ARTIFACT}" >> $GITHUB_ENV
161+ echo "KERNEL_VERSION_ARTIFACT_NAME=${KERNEL_VERSION_ARTIFACT}" >> $GITHUB_ENV
162+ tar -cvf "${KERNEL_VERSION_ARTIFACT}.tar" kernel_version.txt
163+ docker save "${PRIVATE_REGISTRY}/nvidia/driver:base-${BASE_TARGET}-${LTS_KERNEL}-${{ matrix.flavor }}-${{ matrix.driver_branch }}" -o "${BASE_ARTIFACT}.tar"
164+ docker save "${PRIVATE_REGISTRY}/nvidia/driver:${{ matrix.driver_branch }}-${KERNEL_VERSION}-${{ matrix.dist }}" -o "${DRIVER_ARTIFACT}.tar"
147165
148166 - name : Upload base image as an artifact
149167 uses : actions/upload-artifact@v6
150168 with :
151- name : base-images- ${{ matrix.driver_branch }}-${{ env.KERNEL_VERSION }}-${{ env.DIST }}
152- path : ./base-images- ${{ matrix.driver_branch }}-${{ env.KERNEL_VERSION }}-${{ env.DIST }}.tar
169+ name : ${{ env.BASE_ARTIFACT_NAME }}
170+ path : ./${{ env.BASE_ARTIFACT_NAME }}.tar
153171 retention-days : 1
154172
155173 - name : Upload build image as an artifact
156174 uses : actions/upload-artifact@v6
157175 with :
158- name : driver-images- ${{ matrix.driver_branch }}-${{ env.KERNEL_VERSION }}-${{ env.DIST }}
159- path : ./driver-images- ${{ matrix.driver_branch }}-${{ env.KERNEL_VERSION }}-${{ env.DIST }}.tar
176+ name : ${{ env.DRIVER_ARTIFACT_NAME }}
177+ path : ./${{ env.DRIVER_ARTIFACT_NAME }}.tar
160178 retention-days : 1
161179
162180 - name : Upload kernel version as an artifact
163181 uses : actions/upload-artifact@v6
164182 with :
165- name : kernel-version- ${{ matrix.driver_branch }}-${{ env.KERNEL_VERSION }}-${{ env.DIST }}
166- path : ./kernel-version- ${{ matrix.driver_branch }}-${{ env.KERNEL_VERSION }}-${{ env.DIST }}.tar
183+ name : ${{ env.KERNEL_VERSION_ARTIFACT_NAME }}
184+ path : ./${{ env.KERNEL_VERSION_ARTIFACT_NAME }}.tar
167185 retention-days : 1
168186
169187 determine-e2e-test-matrix :
@@ -172,9 +190,12 @@ jobs:
172190 matrix :
173191 dist : ${{ fromJson(needs.set-driver-version-matrix.outputs.dist) }}
174192 lts_kernel : ${{ fromJson(needs.set-driver-version-matrix.outputs.lts_kernel) }}
193+ platform : ${{ fromJson(needs.set-driver-version-matrix.outputs.platforms) }}
175194 exclude :
176195 - lts_kernel : 5.15
177196 dist : ubuntu24.04
197+ - platform : arm64
198+ dist : ubuntu22.04
178199 needs :
179200 - precompiled-build-image
180201 - set-driver-version-matrix
@@ -193,7 +214,7 @@ jobs:
193214 with :
194215 pattern : kernel-version-*
195216 path : ./kernel-version-artifacts
196- merge-multiple : false
217+ merge-multiple : true
197218
198219 - name : Set kernel version
199220 env :
@@ -205,29 +226,34 @@ jobs:
205226 KERNEL_FLAVORS=($(echo "$kernel_flavors_json" | jq -r '.[]'))
206227 driver_branch_json='${{ needs.set-driver-version-matrix.outputs.driver_branch }}'
207228 DRIVER_BRANCHES=($(echo "$driver_branch_json" | jq -r '.[]'))
208-
229+ if [[ "${{ matrix.platform }}" == "arm64" ]]; then
230+ PLATFORM_SUFFIX="-arm64"
231+ else
232+ PLATFORM_SUFFIX=""
233+ fi
234+ echo "PLATFORM_SUFFIX=${PLATFORM_SUFFIX}" >> $GITHUB_ENV
209235 # remove 535 driver branch for ubuntu24.04
210236 if [ "$DIST" == "ubuntu24.04" ]; then
211237 DRIVER_BRANCHES=($(for branch in "${DRIVER_BRANCHES[@]}"; do
212238 [[ $branch != "535" ]] && echo "$branch"
213239 done))
214240 fi
215241 source ./tests/scripts/ci-precompiled-helpers.sh
216- KERNEL_VERSIONS=($(get_kernel_versions_to_test KERNEL_FLAVORS[@] DRIVER_BRANCHES[@] $DIST $LTS_KERNEL))
242+ KERNEL_VERSIONS=($(get_kernel_versions_to_test KERNEL_FLAVORS[@] DRIVER_BRANCHES[@] $DIST $LTS_KERNEL $PLATFORM_SUFFIX ))
217243 if [ -z "$KERNEL_VERSIONS" ]; then
218244 # no new kernel release
219245 echo "Skipping e2e tests"
220246 exit 0
221247 fi
222248 # Convert array to JSON format and assign
223- echo "[]" > ./matrix_values_${{ matrix.dist }}_${{ matrix.lts_kernel }}.json
224- printf '%s\n' "${KERNEL_VERSIONS[@]}" | jq -R . | jq -s . > ./matrix_values_${{ matrix.dist }}_${{ matrix.lts_kernel }}.json
249+ echo "[]" > ./matrix_values_${{ matrix.dist }}_${{ matrix.lts_kernel }}${PLATFORM_SUFFIX} .json
250+ printf '%s\n' "${KERNEL_VERSIONS[@]}" | jq -R . | jq -s . > ./matrix_values_${{ matrix.dist }}_${{ matrix.lts_kernel }}${PLATFORM_SUFFIX} .json
225251
226252 - name : Upload kernel matrix values as artifacts
227253 uses : actions/upload-artifact@v6
228254 with :
229- name : matrix-values-${{ matrix.dist }}-${{ matrix.lts_kernel }}
230- path : ./matrix_values_${{ matrix.dist }}_${{ matrix.lts_kernel }}.json
255+ name : matrix-values-${{ matrix.dist }}-${{ matrix.lts_kernel }}${{ env.PLATFORM_SUFFIX }}
256+ path : ./matrix_values_${{ matrix.dist }}_${{ matrix.lts_kernel }}${{ env.PLATFORM_SUFFIX }} .json
231257 retention-days : 1
232258
233259 collect-e2e-test-matrix :
@@ -256,24 +282,12 @@ jobs:
256282 echo "matrix_values_not_empty=0" >> $GITHUB_OUTPUT
257283 kernel_versions=()
258284
259- # Read and merge kernel_version values from dist files
260- dist_json='${{ needs.set-driver-version-matrix.outputs.dist }}'
261- DIST=($(echo "$dist_json" | jq -r '.[]'))
262- lts_kernel_json='${{ needs.set-driver-version-matrix.outputs.lts_kernel }}'
263- LTS_KERNEL=($(echo "$lts_kernel_json" | jq -r '.[]'))
264- for dist in "${DIST[@]}"; do
265- for kernel in "${LTS_KERNEL[@]}"; do
266- artifact_name="matrix-values-${dist}-${kernel}"
267- file_path="./matrix-values-artifacts/${artifact_name}/matrix_values_${dist}_${kernel}.json"
268- if [ -f "$file_path" ]; then
269- echo "Successfully found artifact: $artifact_name at $file_path"
270- value=$(jq -r '.[]' "$file_path")
271- kernel_versions+=($value)
272- echo "matrix_values_not_empty=1" >> $GITHUB_OUTPUT
273- else
274- echo "Artifact not found: $artifact_name"
275- fi
276- done
285+ # Read and merge kernel_version values from all platform artifacts (amd64 and arm64)
286+ for f in $(find ./matrix-values-artifacts -name "matrix_values_*.json" -type f 2>/dev/null); do
287+ value=$(jq -r '.[]' "$f")
288+ kernel_versions+=($value)
289+ echo "matrix_values_not_empty=1" >> $GITHUB_OUTPUT
290+ kernel_versions=($(printf '%s\n' "${kernel_versions[@]}" | sort -u))
277291 done
278292 echo "Collected Kernel Versions: ${kernel_versions[@]}"
279293 combined_values=$(printf '%s\n' "${kernel_versions[@]}" | jq -R . | jq -s -c . | tr -d ' \n')
@@ -334,6 +348,16 @@ jobs:
334348 echo "${{ secrets.AWS_SSH_KEY }}" > ${{ github.workspace }}/key.pem && chmod 400 ${{ github.workspace }}/key.pem
335349 echo "PRIVATE_REGISTRY=ghcr.io" >> $GITHUB_ENV
336350 KERNEL_VERSION="${{ matrix.kernel_version }}"
351+ if [[ "${KERNEL_VERSION}" == *-arm64 ]]; then
352+ PLATFORM=arm64
353+ PLATFORM_SUFFIX="-arm64"
354+ KERNEL_VERSION="${KERNEL_VERSION%-arm64}"
355+ else
356+ PLATFORM=amd64
357+ PLATFORM_SUFFIX=""
358+ fi
359+ echo "PLATFORM=$PLATFORM" >> $GITHUB_ENV
360+ echo "PLATFORM_SUFFIX=$PLATFORM_SUFFIX" >> $GITHUB_ENV
337361 # Extract the last segment after the last dash
338362 DIST=${KERNEL_VERSION##*-}
339363 echo "DIST=$DIST" >> $GITHUB_ENV
@@ -342,22 +366,29 @@ jobs:
342366 driver_branch_json="${{ needs.set-driver-version-matrix.outputs.driver_branch }}"
343367 DRIVER_BRANCHES=($(echo "$driver_branch_json" | jq -r '.[]'))
344368 echo "DRIVER_BRANCHES=${DRIVER_BRANCHES[*]}" >> $GITHUB_ENV
345- - name : Set kernel version in holodeck_${{ env.DIST }} .yaml
369+ - name : Set kernel version and architecture in holodeck_ubuntu .yaml
346370 run : |
347- yq eval '.spec += {"kernel": {"version": strenv(KERNEL_VERSION)}}' -i tests/holodeck_${{ env.DIST }}.yaml
371+ yq eval '.spec += {"kernel": {"version": strenv(KERNEL_VERSION)}}' -i tests/holodeck_ubuntu.yaml
372+ if [[ "$DIST" == "ubuntu24.04" ]]; then
373+ yq eval '.spec.instance.os = "ubuntu-24.04"' -i tests/holodeck_ubuntu.yaml
374+ fi
375+ if [[ "$PLATFORM" == "arm64" ]]; then
376+ yq eval '.spec.instance.image.architecture = strenv(PLATFORM)' -i tests/holodeck_ubuntu.yaml
377+ yq eval '.spec.instance.type = "g5g.xlarge"' -i tests/holodeck_ubuntu.yaml
378+ yq eval '.spec.instance.region = "us-west-2"' -i tests/holodeck_ubuntu.yaml
379+ fi
348380
349381 - name : Set up Holodeck
350- uses : NVIDIA/holodeck@v0.2.18
382+ uses : NVIDIA/holodeck@main
351383 env :
352384 AWS_SECRET_ACCESS_KEY : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
353385 AWS_ACCESS_KEY_ID : ${{ secrets.AWS_ACCESS_KEY_ID }}
354386 AWS_SSH_KEY : ${{ secrets.AWS_SSH_KEY }}
355- DIST : ${{ env.DIST }}
356387 with :
357388 aws_access_key_id : ${{ secrets.AWS_ACCESS_KEY_ID }}
358389 aws_secret_access_key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
359390 aws_ssh_key : ${{ secrets.AWS_SSH_KEY }}
360- holodeck_config : " tests/holodeck_${{ env.DIST }} .yaml"
391+ holodeck_config : " tests/holodeck_ubuntu .yaml"
361392 - name : Get public dns name
362393 id : get_public_dns_name
363394 uses : mikefarah/yq@master
@@ -394,7 +425,7 @@ jobs:
394425 TEST_CASE_ARGS="${GPU_OPERATOR_OPTIONS} --set driver.version=${DRIVER_VERSION}"
395426 # add escape character for space
396427 TEST_CASE_ARGS=$(printf '%q ' "$TEST_CASE_ARGS")
397- IMAGE_PATH="./tests/driver-images-${DRIVER_VERSION}-${KERNEL_VERSION}-${DIST}.tar"
428+ IMAGE_PATH="./tests/driver-images-${DRIVER_VERSION}-${KERNEL_VERSION}-${DIST}${{ env.PLATFORM_SUFFIX }} .tar"
398429 ./tests/ci-run-e2e.sh "${TEST_CASE}" "${TEST_CASE_ARGS}" ${IMAGE_PATH} || status=$?
399430 if [ $status -eq 1 ]; then
400431 echo "e2e validation failed for driver version $DRIVER_VERSION with status $status"
@@ -436,6 +467,11 @@ jobs:
436467 - name : Set image vars
437468 run : |
438469 echo "PRIVATE_REGISTRY=ghcr.io" >> $GITHUB_ENV
470+ KERNEL_VERSION="${{ matrix.kernel_version }}"
471+ if [[ "${KERNEL_VERSION}" == *-arm64 ]]; then
472+ KERNEL_VERSION="${KERNEL_VERSION%-arm64}"
473+ fi
474+ echo "KERNEL_VERSION=$KERNEL_VERSION" >> $GITHUB_ENV
439475
440476 - name : Download base image artifact
441477 if : ${{ ! (matrix.driver_branch == 535 && contains(matrix.kernel_version, 'ubuntu24.04')) }}
@@ -447,9 +483,9 @@ jobs:
447483 - name : Publish base image
448484 if : ${{ ! (matrix.driver_branch == 535 && contains(matrix.kernel_version, 'ubuntu24.04')) }}
449485 run : |
450- LTS_KERNEL=$(echo "${{ matrix.kernel_version }}" | sed -E 's/^([0-9]+\.[0-9]+)\..*/\1/')
451- KERNEL_FLAVOR=$(echo "${{ matrix.kernel_version }}" | sed -E 's/^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-(.*)-ubuntu[0-9]+\.[0-9]+$/\1/')
452- DIST=$(echo "${{ matrix.kernel_version }}" | sed -E 's/^.*-(ubuntu[0-9]+\.[0-9]+)$/\1/')
486+ LTS_KERNEL=$(echo "${{ env.KERNEL_VERSION }}" | sed -E 's/^([0-9]+\.[0-9]+)\..*/\1/')
487+ KERNEL_FLAVOR=$(echo "${{ env.KERNEL_VERSION }}" | sed -E 's/^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+-(.*)-ubuntu[0-9]+\.[0-9]+$/\1/')
488+ DIST=$(echo "${{ env.KERNEL_VERSION }}" | sed -E 's/^.*-(ubuntu[0-9]+\.[0-9]+)$/\1/')
453489 if [[ "${DIST}" == "ubuntu22.04" ]]; then
454490 BASE_TARGET="jammy"
455491 elif [[ "${DIST}" == "ubuntu24.04" ]]; then
0 commit comments