Skip to content

test: isolate library wheel smoke test #4761

test: isolate library wheel smoke test

test: isolate library wheel smoke test #4761

Workflow file for this run

# SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
name: pr
on:
push:
branches:
- "pull-request/[0-9]+"
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
permissions: {}
jobs:
pr-builder:
needs:
- compute-matrix-filters
- changed-files
- checks
- conda-cpp-build
- conda-cpp-tests
- conda-python-build
- conda-python-tests
- docs-build
- multi-gpu-cpp-tests
- wheel-build-libcuopt
- wheel-build-cuopt
- wheel-tests-cuopt
- wheel-build-cuopt-server
- wheel-tests-cuopt-server
- wheel-build-cuopt-sh-client
- test-self-hosted-server
- pr-test-summary
permissions:
contents: read
uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@release/26.08
if: always()
with:
needs: ${{ toJSON(needs) }}
compute-matrix-filters:
permissions:
contents: read
runs-on: ubuntu-latest
outputs:
libcuopt_filter: ${{ steps.set-filters.outputs.libcuopt_filter }}
cuopt_server_filter: ${{ steps.set-filters.outputs.cuopt_server_filter }}
cuopt_server_test_filter: ${{ steps.set-filters.outputs.cuopt_server_test_filter }}
cuopt_sh_client_filter: ${{ steps.set-filters.outputs.cuopt_sh_client_filter }}
steps:
- name: Set matrix filters
id: set-filters
run: |
echo "libcuopt_filter=group_by([.ARCH, (.CUDA_VER|split(\".\")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(\".\")|map(tonumber)))" >> $GITHUB_OUTPUT
echo "cuopt_server_filter=map(select(.ARCH == \"amd64\")) | group_by(.CUDA_VER|split(\".\")|map(tonumber)|.[0]) | map(max_by([(.PY_VER|split(\".\")|map(tonumber)), (.CUDA_VER|split(\".\")|map(tonumber))]))" >> $GITHUB_OUTPUT
echo "cuopt_server_test_filter=map(select(.ARCH == \"amd64\")) | group_by(.CUDA_VER | split(\".\") | map(tonumber) | .[0]) | map(max_by([(.PY_VER | split(\".\") | map(tonumber)), (.CUDA_VER | split(\".\") | map(tonumber))]))" >> $GITHUB_OUTPUT
echo "cuopt_sh_client_filter=[map(select(.ARCH == \"amd64\")) | min_by((.PY_VER | split(\".\") | map(tonumber)), (.CUDA_VER | split(\".\") | map(-tonumber)))]" >> $GITHUB_OUTPUT
changed-files:
permissions:
actions: read
contents: read
packages: read
pull-requests: read
uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@release/26.08
with:
files_yaml: |
build_docs:
- '**'
- '!.ai/**'
- '!.clang-format'
- '!.coderabbit.yaml'
- '!.gitattributes'
- '!.github/.ai/**'
- '!.github/.coderabbit_review_guide.md'
- '!.github/CODEOWNERS'
- '!.github/CODE_OF_CONDUCT.md'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/PULL_REQUEST_TEMPLATE.md'
- '!.github/SECURITY.md'
- '!.github/agents/**'
- '!.github/copy-pr-bot.yaml'
- '!.github/ops-bot.yaml'
- '!.github/release.yml'
- '!.github/workflows/build.yaml'
- '!.github/workflows/build_images.yaml'
- '!.github/workflows/build_test_publish_images.yaml'
- '!.github/workflows/cloud_ci.yaml'
- '!.github/workflows/inactivity_reminder.yaml'
- '!.github/workflows/issue_automation.yaml'
- '!.github/workflows/nightly.yaml'
- '!.github/workflows/request-nvskills-ci.yml'
- '!.github/workflows/test.yaml'
- '!.github/workflows/test_images.yaml'
- '!.github/workflows/trigger-breaking-change-alert.yaml'
- '!.gitignore'
- '!.pre-commit-config.yaml'
- '!codecov.yml'
- '!AGENTS.md'
- '!CHANGELOG.md'
- '!CONTRIBUTING.md'
- '!LICENSE'
- '!README.md'
- '!SECURITY.md'
- '!ci/build_wheel*.sh'
- '!ci/check_style.sh'
- '!ci/docker/**'
- '!ci/release/**'
- '!ci/run_*.pytests.sh'
- '!ci/run_ctests.sh'
- '!ci/test_cpp*.sh'
- '!ci/test_notebooks.sh'
- '!ci/test_python.sh'
- '!ci/test_self_hosted_service.sh'
- '!ci/test_wheel*.sh'
- '!ci/thirdparty-testing/**'
- '!container-builder/**'
- '!helmchart/**'
- '!ngc/**'
- '!sonar-project.properties'
- '!sonarqube/**'
- '!ucf/**'
- '!utilities/**'
test_cpp:
- '**'
- '!**/*.md'
- '!.ai/**'
- '!.clang-format'
- '!.claude-plugin/**'
- '!.coderabbit.yaml'
- '!.cursor-plugin/**'
- '!.gitattributes'
- '!.github/.ai/**'
- '!.github/.coderabbit_review_guide.md'
- '!.github/CODEOWNERS'
- '!.github/CODE_OF_CONDUCT.md'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/PULL_REQUEST_TEMPLATE.md'
- '!.github/SECURITY.md'
- '!.github/agents/**'
- '!.github/copy-pr-bot.yaml'
- '!.github/ops-bot.yaml'
- '!.github/release.yml'
- '!.github/workflows/build.yaml'
- '!.github/workflows/build_images.yaml'
- '!.github/workflows/build_test_publish_images.yaml'
- '!.github/workflows/cloud_ci.yaml'
- '!.github/workflows/inactivity_reminder.yaml'
- '!.github/workflows/issue_automation.yaml'
- '!.github/workflows/nightly.yaml'
- '!.github/workflows/request-nvskills-ci.yml'
- '!.github/workflows/test.yaml'
- '!.github/workflows/test_images.yaml'
- '!.github/workflows/trigger-breaking-change-alert.yaml'
- '!.gitignore'
- '!.pre-commit-config.yaml'
- '!codecov.yml'
- '!AGENTS.md'
- '!CONTRIBUTING.md'
- '!LICENSE'
- '!README.md'
- '!SECURITY.md'
- '!agents/**'
- '!ci/build_docs.sh'
- '!ci/build_python.sh'
- '!ci/build_wheel*.sh'
- '!ci/check_style.sh'
- '!ci/docker/**'
- '!ci/release/**'
- '!ci/test_python.sh'
- '!ci/test_self_hosted_service.sh'
- '!ci/test_wheel*.sh'
- '!ci/thirdparty-testing/**'
- '!ci/utils/sync_skills_version.sh'
- '!ci/utils/validate_skills.sh'
- '!container-builder/**'
- '!docs/**'
- '!gemini-extension.json'
- '!helmchart/**'
- '!img/**'
- '!ngc/**'
- '!notebooks/**'
- '!python/**'
- '!skills/**/SKILL.md'
- '!skills/**/skill-card.md'
- '!skills/**/skill.oms.sig'
- '!skills/**/evals/**'
- '!skills/**/benchmark/**'
- '!skills/**/references/**'
- '!sonar-project.properties'
- '!sonarqube/**'
- '!ucf/**'
- '!utilities/**'
test_python_conda:
- '**'
- '!**/*.md'
- '!.ai/**'
- '!.clang-format'
- '!.claude-plugin/**'
- '!.coderabbit.yaml'
- '!.cursor-plugin/**'
- '!.gitattributes'
- '!.github/.ai/**'
- '!.github/.coderabbit_review_guide.md'
- '!.github/CODEOWNERS'
- '!.github/CODE_OF_CONDUCT.md'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/PULL_REQUEST_TEMPLATE.md'
- '!.github/SECURITY.md'
- '!.github/agents/**'
- '!.github/copy-pr-bot.yaml'
- '!.github/ops-bot.yaml'
- '!.github/release.yml'
- '!.github/workflows/build.yaml'
- '!.github/workflows/build_images.yaml'
- '!.github/workflows/build_test_publish_images.yaml'
- '!.github/workflows/cloud_ci.yaml'
- '!.github/workflows/inactivity_reminder.yaml'
- '!.github/workflows/issue_automation.yaml'
- '!.github/workflows/nightly.yaml'
- '!.github/workflows/request-nvskills-ci.yml'
- '!.github/workflows/test.yaml'
- '!.github/workflows/test_images.yaml'
- '!.github/workflows/trigger-breaking-change-alert.yaml'
- '!.gitignore'
- '!.pre-commit-config.yaml'
- '!codecov.yml'
- '!AGENTS.md'
- '!CONTRIBUTING.md'
- '!LICENSE'
- '!README.md'
- '!SECURITY.md'
- '!agents/**'
- '!ci/build_docs.sh'
- '!ci/build_wheel*.sh'
- '!ci/check_style.sh'
- '!ci/docker/**'
- '!ci/release/**'
- '!ci/test_self_hosted_service.sh'
- '!ci/test_wheel*.sh'
- '!ci/thirdparty-testing/**'
- '!ci/utils/sync_skills_version.sh'
- '!ci/utils/validate_skills.sh'
- '!container-builder/**'
- '!docs/**'
- '!gemini-extension.json'
- '!helmchart/**'
- '!img/**'
- '!ngc/**'
- '!notebooks/**'
- '!skills/**/SKILL.md'
- '!skills/**/skill-card.md'
- '!skills/**/skill.oms.sig'
- '!skills/**/evals/**'
- '!skills/**/benchmark/**'
- '!skills/**/references/**'
- '!sonar-project.properties'
- '!sonarqube/**'
- '!ucf/**'
- '!utilities/**'
test_python_wheels:
- '**'
- '!**/*.md'
- '!.ai/**'
- '!.clang-format'
- '!.claude-plugin/**'
- '!.coderabbit.yaml'
- '!.cursor-plugin/**'
- '!.gitattributes'
- '!.github/.ai/**'
- '!.github/.coderabbit_review_guide.md'
- '!.github/CODEOWNERS'
- '!.github/CODE_OF_CONDUCT.md'
- '!.github/ISSUE_TEMPLATE/**'
- '!.github/PULL_REQUEST_TEMPLATE.md'
- '!.github/SECURITY.md'
- '!.github/agents/**'
- '!.github/copy-pr-bot.yaml'
- '!.github/ops-bot.yaml'
- '!.github/release.yml'
- '!.github/workflows/build.yaml'
- '!.github/workflows/build_images.yaml'
- '!.github/workflows/build_test_publish_images.yaml'
- '!.github/workflows/cloud_ci.yaml'
- '!.github/workflows/inactivity_reminder.yaml'
- '!.github/workflows/issue_automation.yaml'
- '!.github/workflows/nightly.yaml'
- '!.github/workflows/request-nvskills-ci.yml'
- '!.github/workflows/test.yaml'
- '!.github/workflows/test_images.yaml'
- '!.github/workflows/trigger-breaking-change-alert.yaml'
- '!.gitignore'
- '!.pre-commit-config.yaml'
- '!codecov.yml'
- '!AGENTS.md'
- '!CONTRIBUTING.md'
- '!LICENSE'
- '!README.md'
- '!SECURITY.md'
- '!agents/**'
- '!ci/build_cpp.sh'
- '!ci/build_docs.sh'
- '!ci/build_python.sh'
- '!ci/check_style.sh'
- '!ci/docker/**'
- '!ci/release/**'
- '!ci/run_ctests.sh'
- '!ci/test_python.sh'
- '!ci/thirdparty-testing/**'
- '!ci/utils/sync_skills_version.sh'
- '!ci/utils/validate_skills.sh'
- '!conda/**'
- '!container-builder/**'
- '!gemini-extension.json'
- '!helmchart/**'
- '!img/**'
- '!ngc/**'
- '!notebooks/**'
- '!skills/**/SKILL.md'
- '!skills/**/skill-card.md'
- '!skills/**/skill.oms.sig'
- '!skills/**/evals/**'
- '!skills/**/benchmark/**'
- '!skills/**/references/**'
- '!sonar-project.properties'
- '!sonarqube/**'
- '!ucf/**'
- '!utilities/**'
checks:
permissions:
contents: read
uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@release/26.08
with:
enable_check_generated_files: false
conda-cpp-build:
needs: [checks, compute-matrix-filters, changed-files]
# Consumed by conda-cpp-tests, conda-python-build, and (transitively) docs-build.
if: >-
fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp ||
fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda ||
fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-build.yaml@release/26.08
with:
build_type: pull-request
script: ci/build_cpp.sh
conda-cpp-tests:
needs: [conda-cpp-build, changed-files]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-tests.yaml@release/26.08
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp
with:
build_type: pull-request
script: ci/test_cpp.sh
secrets:
script-env-secret-1-key: CUOPT_S3_URI
script-env-secret-1-value: ${{ secrets.CUOPT_S3_URI }}
script-env-secret-2-key: CUOPT_AWS_ACCESS_KEY_ID
script-env-secret-2-value: ${{ secrets.CUOPT_AWS_ACCESS_KEY_ID }}
script-env-secret-3-key: CUOPT_AWS_SECRET_ACCESS_KEY
script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }}
multi-gpu-cpp-tests:
needs: [conda-cpp-build, changed-files]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
uses: ./.github/workflows/multi_gpu_cpp_test.yaml
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp
with:
build_type: pull-request
# Non-blocking while the multi-GPU test suite is maturing.
continue-on-error: true
conda-python-build:
needs: [conda-cpp-build, changed-files]
# Consumed by conda-python-tests and docs-build.
if: >-
fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda ||
fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/conda-python-build.yaml@release/26.08
with:
build_type: pull-request
script: ci/build_python.sh
conda-python-tests:
needs: [conda-python-build, changed-files]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
uses: rapidsai/shared-workflows/.github/workflows/conda-python-tests.yaml@release/26.08
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda
with:
build_type: pull-request
run_codecov: false
script: ci/test_python.sh
docs-build:
needs: [conda-python-build, changed-files]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@release/26.08
if: fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs
with:
build_type: pull-request
node_type: "gpu-l4-latest-1"
arch: "amd64"
file_to_upload: "docs/cuopt/build/html/"
artifact-name: "cuopt_docs"
container_image: "rapidsai/ci-conda:26.08-latest"
script: "ci/build_docs.sh"
wheel-build-libcuopt:
needs: [compute-matrix-filters, changed-files]
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
with:
# build for every combination of arch and CUDA version, but only for the latest Python
matrix_filter: ${{ needs.compute-matrix-filters.outputs.libcuopt_filter }}
package-type: cpp
package-name: libcuopt
build_type: pull-request
script: ci/build_wheel_libcuopt.sh
wheel-build-cuopt:
needs: [wheel-build-libcuopt, compute-matrix-filters, changed-files]
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
with:
build_type: pull-request
script: ci/build_wheel_cuopt.sh
package-name: cuopt
package-type: python
wheel-tests-cuopt:
needs: [wheel-build-cuopt, wheel-build-cuopt-sh-client, changed-files]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@release/26.08
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
with:
build_type: pull-request
script: ci/test_wheel_cuopt.sh
secrets:
script-env-secret-1-key: CUOPT_S3_URI
script-env-secret-1-value: ${{ secrets.CUOPT_S3_URI }}
script-env-secret-2-key: CUOPT_AWS_ACCESS_KEY_ID
script-env-secret-2-value: ${{ secrets.CUOPT_AWS_ACCESS_KEY_ID }}
script-env-secret-3-key: CUOPT_AWS_SECRET_ACCESS_KEY
script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }}
wheel-build-cuopt-server:
needs: [checks, compute-matrix-filters, changed-files]
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
with:
build_type: pull-request
script: ci/build_wheel_cuopt_server.sh
package-name: cuopt_server
package-type: python
pure-wheel: true
# Only need 1 package per CUDA major version. This selects "ARCH=amd64 + the latest supported Python, 1 job per major CUDA version".
matrix_filter: ${{ needs.compute-matrix-filters.outputs.cuopt_server_filter }}
wheel-build-cuopt-sh-client:
needs: [compute-matrix-filters, changed-files]
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: rapidsai/shared-workflows/.github/workflows/wheels-build.yaml@release/26.08
with:
build_type: pull-request
script: ci/build_wheel_cuopt_sh_client.sh
package-name: cuopt_sh_client
package-type: python
append-cuda-suffix: false
pure-wheel: true
# only need 1 build (noarch package): this selects amd64, oldest-supported Python, latest-supported CUDA
matrix_filter: ${{ needs.compute-matrix-filters.outputs.cuopt_sh_client_filter }}
wheel-tests-cuopt-server:
needs: [wheel-build-cuopt, wheel-build-cuopt-server, changed-files, compute-matrix-filters]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
uses: rapidsai/shared-workflows/.github/workflows/wheels-test.yaml@release/26.08
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
with:
build_type: pull-request
script: ci/test_wheel_cuopt_server.sh
matrix_filter: ${{ needs.compute-matrix-filters.outputs.cuopt_server_test_filter }}
secrets:
script-env-secret-1-key: CUOPT_S3_URI
script-env-secret-1-value: ${{ secrets.CUOPT_S3_URI }}
script-env-secret-2-key: CUOPT_AWS_ACCESS_KEY_ID
script-env-secret-2-value: ${{ secrets.CUOPT_AWS_ACCESS_KEY_ID }}
script-env-secret-3-key: CUOPT_AWS_SECRET_ACCESS_KEY
script-env-secret-3-value: ${{ secrets.CUOPT_AWS_SECRET_ACCESS_KEY }}
test-self-hosted-server:
needs: [wheel-build-cuopt, wheel-build-cuopt-server, changed-files]
permissions:
actions: read
contents: read
id-token: write
packages: read
pull-requests: read
secrets: inherit # zizmor: ignore[secrets-inherit]
uses: ./.github/workflows/self_hosted_service_test.yaml
if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels
with:
build_type: pull-request
script: ci/test_self_hosted_service.sh
pr-test-summary:
needs:
- conda-cpp-tests
- conda-python-tests
- wheel-tests-cuopt
- wheel-tests-cuopt-server
- test-self-hosted-server
if: always()
continue-on-error: true
runs-on: ubuntu-latest
permissions:
actions: read
pull-requests: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
sparse-checkout: ci/utils/pr_test_summary.py
sparse-checkout-cone-mode: false
- run: python3 ci/utils/pr_test_summary.py
env:
GH_TOKEN: ${{ github.token }}