diff --git a/.github/actions/doc_preview/action.yml b/.github/actions/doc_preview/action.yml index 87efed179..9984fe377 100644 --- a/.github/actions/doc_preview/action.yml +++ b/.github/actions/doc_preview/action.yml @@ -21,7 +21,7 @@ runs: # Note: the PR previews will be removed once merged to main (see below) - name: Deploy doc preview if: ${{ github.ref_name != 'main' }} - uses: JamesIves/github-pages-deploy-action@v4 + uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8 # v4.7.3 with: git-config-name: cuda-python-bot git-config-email: cuda-python-bot@users.noreply.github.com @@ -31,7 +31,7 @@ runs: - name: Leave a comment after deployment if: ${{ github.ref_name != 'main' }} - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@67d0dec7b07ed060a405f9b2a64b8ab319fdd7db # v2.9.2 with: header: pr-preview number: ${{ inputs.pr-number }} @@ -47,7 +47,7 @@ runs: # The steps below are executed only when building on main. - name: Remove doc preview if: ${{ github.ref_name == 'main' }} - uses: JamesIves/github-pages-deploy-action@v4 + uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8 # v4.7.3 with: git-config-name: cuda-python-bot git-config-email: cuda-python-bot@users.noreply.github.com @@ -57,7 +57,7 @@ runs: - name: Leave a comment after removal if: ${{ github.ref_name == 'main' }} - uses: marocchino/sticky-pull-request-comment@v2 + uses: marocchino/sticky-pull-request-comment@67d0dec7b07ed060a405f9b2a64b8ab319fdd7db # v2.9.2 with: header: pr-preview number: ${{ inputs.pr-number }} diff --git a/.github/actions/fetch_ctk/action.yml b/.github/actions/fetch_ctk/action.yml index 5f37a5f80..6a90c63e2 100644 --- a/.github/actions/fetch_ctk/action.yml +++ b/.github/actions/fetch_ctk/action.yml @@ -39,7 +39,7 @@ runs: - name: Download CTK cache id: ctk-get-cache - uses: actions/cache/restore@v4 + uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 continue-on-error: true with: key: ${{ env.CTK_CACHE_KEY }} @@ -123,7 +123,7 @@ runs: - name: Upload CTK cache if: ${{ always() && steps.ctk-get-cache.outputs.cache-hit != 'true' }} - uses: actions/cache/save@v4 + uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3 with: key: ${{ env.CTK_CACHE_KEY }} path: ./${{ env.CTK_CACHE_FILENAME }} diff --git a/.github/actions/get_pr_number/action.yml b/.github/actions/get_pr_number/action.yml index 5f662ec48..206149afe 100644 --- a/.github/actions/get_pr_number/action.yml +++ b/.github/actions/get_pr_number/action.yml @@ -29,7 +29,7 @@ runs: - name: Get PR data (main branch) if: ${{ github.ref_name == 'main' }} - uses: actions/github-script@v7 + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 id: get-pr-data with: script: | diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..bba4cd250 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +# Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. +# +# SPDX-License-Identifier: Apache-2.0 + +version: 2 +updates: + - package-ecosystem: github-actions + directory: / + schedule: + interval: weekly diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml index ea69b08be..a15e34e92 100644 --- a/.github/workflows/backport.yml +++ b/.github/workflows/backport.yml @@ -23,7 +23,7 @@ jobs: }} runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Load branch name id: get-branch @@ -32,7 +32,7 @@ jobs: echo "OLD_BRANCH=${OLD_BRANCH}" >> $GITHUB_ENV - name: Create backport pull requests - uses: korthout/backport-action@v3 + uses: korthout/backport-action@436145e922f9561fc5ea157ff406f21af2d6b363 # v3.2.0 with: copy_assignees: true copy_labels_pattern: true diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml index 531bd629c..d17fa172c 100644 --- a/.github/workflows/build-docs.yml +++ b/.github/workflows/build-docs.yml @@ -47,7 +47,7 @@ jobs: shell: bash -el {0} steps: - name: Checkout ${{ github.event.repository.name }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 ref: ${{ inputs.git-tag }} @@ -56,7 +56,7 @@ jobs: # is resolved - name: Set up miniforge - uses: conda-incubator/setup-miniconda@v3 + uses: conda-incubator/setup-miniconda@505e6394dae86d6a5c7fbb6e3fb8938e3e863830 # v3.1.1 with: activate-environment: cuda-python-docs environment-file: ./cuda_python/docs/environment-docs.yml @@ -103,7 +103,7 @@ jobs: echo "CUDA_BINDINGS_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/dist")" >> $GITHUB_ENV - name: Download cuda-python build artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: cuda-python-wheel path: . @@ -117,14 +117,14 @@ jobs: - name: Download cuda.bindings build artifacts if: ${{ !inputs.is-release }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }} path: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} - name: Download cuda.bindings build artifacts if: ${{ inputs.is-release }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: pattern: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }} merge-multiple: true @@ -139,14 +139,14 @@ jobs: - name: Download cuda.core build artifacts if: ${{ !inputs.is-release }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ env.CUDA_CORE_ARTIFACT_NAME }} path: ${{ env.CUDA_CORE_ARTIFACTS_DIR }} - name: Download cuda.core build artifacts if: ${{ inputs.is-release }} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: pattern: ${{ env.CUDA_CORE_ARTIFACT_NAME }} merge-multiple: true @@ -221,7 +221,7 @@ jobs: # TODO: Consider removing this step? - name: Upload doc artifacts - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3.0.1 with: path: artifacts/ retention-days: 3 @@ -236,7 +236,7 @@ jobs: - name: Deploy doc update if: ${{ github.ref_name == 'main' || inputs.is-release }} - uses: JamesIves/github-pages-deploy-action@v4 + uses: JamesIves/github-pages-deploy-action@6c2d9db40f9296374acc17b90404b6e8864128c8 # v4.7.3 with: git-config-name: cuda-python-bot git-config-email: cuda-python-bot@users.noreply.github.com diff --git a/.github/workflows/build-wheel.yml b/.github/workflows/build-wheel.yml index e776c70ec..1eed96bdb 100644 --- a/.github/workflows/build-wheel.yml +++ b/.github/workflows/build-wheel.yml @@ -1,4 +1,4 @@ -# Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. +# Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. # # SPDX-License-Identifier: Apache-2.0 @@ -36,7 +36,7 @@ jobs: (inputs.host-platform == 'win-64' && 'windows-2019') }} steps: - name: Checkout ${{ github.event.repository.name }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 @@ -47,17 +47,16 @@ jobs: if: ${{ inputs.host-platform != 'win-64' }} - name: Set up Python - if: ${{ startsWith(inputs.host-platform, 'linux') }} - id: setup-python - uses: actions/setup-python@v5 + id: setup-python1 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: - # WAR: setup-python is not relocatable... + # WAR: setup-python is not relocatable, and cibuildwheel hard-wires to 3.12... # see https://github.com/actions/setup-python/issues/871 python-version: "3.12" - name: Set up MSVC if: ${{ startsWith(inputs.host-platform, 'win') }} - uses: ilammy/msvc-dev-cmd@v1 + uses: ilammy/msvc-dev-cmd@v1 # TODO: ask admin to allow pinning commits - name: Set environment variables run: | @@ -76,12 +75,14 @@ jobs: echo "CUDA_CORE_ARTIFACT_BASENAME=${CUDA_CORE_ARTIFACT_BASENAME}" >> $GITHUB_ENV echo "CUDA_CORE_ARTIFACT_NAME=${CUDA_CORE_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV echo "CUDA_CORE_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_core/dist")" >> $GITHUB_ENV + echo "CUDA_CORE_CYTHON_TESTS_DIR=$(realpath "$REPO_DIR/cuda_core/tests/cython")" >> $GITHUB_ENV CUDA_BINDINGS_ARTIFACT_BASENAME="cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ inputs.cuda-version }}-${{ inputs.host-platform }}" echo "CUDA_BINDINGS_ARTIFACT_BASENAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}" >> $GITHUB_ENV echo "CUDA_BINDINGS_ARTIFACT_NAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV echo "CUDA_BINDINGS_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/dist")" >> $GITHUB_ENV + echo "CUDA_BINDINGS_CYTHON_TESTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/tests/cython")" >> $GITHUB_ENV echo "CIBW_BUILD=${CIBW_BUILD}" >> $GITHUB_ENV - + - name: Dump environment run: | env @@ -112,7 +113,7 @@ jobs: twine check ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl - name: Upload cuda.core build artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.CUDA_CORE_ARTIFACT_NAME }} path: ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl @@ -159,7 +160,7 @@ jobs: twine check ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl - name: Upload cuda.bindings build artifacts - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }} path: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl @@ -187,8 +188,52 @@ jobs: - name: Upload cuda-python build artifacts if: ${{ strategy.job-index == 0 && inputs.host-platform == 'linux-64' }} - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 with: name: cuda-python-wheel path: cuda_python/*.whl if-no-files-found: error + + - name: Set up Python + id: setup-python2 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: ${{ matrix.python-version }} + + - name: Set up Python include paths + run: | + if [[ "${{ inputs.host-platform }}" == linux* ]]; then + echo "CPLUS_INCLUDE_PATH=${Python3_ROOT_DIR}/include/python${{ matrix.python-version }}" >> $GITHUB_ENV + elif [[ "${{ inputs.host-platform }}" == win* ]]; then + echo "CL=/I\"${Python3_ROOT_DIR}\include\python${{ matrix.python-version }}\"" >> $GITHUB_ENV + fi + # For caching + echo "PY_EXT_SUFFIX=$(python -c "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))")" >> $GITHUB_ENV + + - name: Build cuda.bindings Cython tests + run: | + pip install $(ls ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }}/*.whl)[test] + pushd ${{ env.CUDA_BINDINGS_CYTHON_TESTS_DIR }} + bash build_tests.sh + popd + + - name: Upload cuda.bindings Cython tests + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}-tests + path: ${{ env.CUDA_BINDINGS_CYTHON_TESTS_DIR }}/test_*${{ env.PY_EXT_SUFFIX }} + if-no-files-found: error + + - name: Build cuda.core Cython tests + run: | + pip install $(ls ${{ env.CUDA_CORE_ARTIFACTS_DIR }}/*.whl)[test] + pushd ${{ env.CUDA_CORE_CYTHON_TESTS_DIR }} + bash build_tests.sh + popd + + - name: Upload cuda.core Cython tests + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: ${{ env.CUDA_CORE_ARTIFACT_NAME }}-tests + path: ${{ env.CUDA_CORE_CYTHON_TESTS_DIR }}/test_*${{ env.PY_EXT_SUFFIX }} + if-no-files-found: error diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9cd892c2f..fd86b7461 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: CUDA_BUILD_VER: ${{ steps.get-vars.outputs.cuda_build_ver }} steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 - name: Get CUDA build version @@ -45,8 +45,7 @@ jobs: name: Build ${{ matrix.host-platform }}, CUDA ${{ needs.ci-vars.outputs.CUDA_BUILD_VER }} if: ${{ github.repository_owner == 'nvidia' }} secrets: inherit - uses: - ./.github/workflows/build-wheel.yml + uses: ./.github/workflows/build-wheel.yml with: host-platform: ${{ matrix.host-platform }} cuda-version: ${{ needs.ci-vars.outputs.CUDA_BUILD_VER }} @@ -66,8 +65,7 @@ jobs: - ci-vars - build secrets: inherit - uses: - ./.github/workflows/test-wheel-linux.yml + uses: ./.github/workflows/test-wheel-linux.yml with: build-type: pull-request host-platform: ${{ matrix.host-platform }} @@ -87,8 +85,7 @@ jobs: - ci-vars - build secrets: inherit - uses: - ./.github/workflows/test-wheel-windows.yml + uses: ./.github/workflows/test-wheel-windows.yml with: build-type: pull-request host-platform: ${{ matrix.host-platform }} @@ -106,8 +103,7 @@ jobs: - ci-vars - build secrets: inherit - uses: - ./.github/workflows/build-docs.yml + uses: ./.github/workflows/build-docs.yml with: build-ctk-ver: ${{ needs.ci-vars.outputs.CUDA_BUILD_VER }} @@ -121,5 +117,4 @@ jobs: - test-windows - doc secrets: inherit - uses: - ./.github/workflows/status-check.yml + uses: ./.github/workflows/status-check.yml diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1631af2b5..d2b340134 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -28,16 +28,16 @@ jobs: build-mode: none steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 with: languages: ${{ matrix.language }} build-mode: ${{ matrix.build-mode }} queries: security-extended - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 + uses: github/codeql-action/analyze@ff0a06e83cb2de871e5a09832bc6a81e7276941f # v3.28.18 with: category: "/language:${{matrix.language}}" diff --git a/.github/workflows/release-upload.yml b/.github/workflows/release-upload.yml index ff6932a38..48135f2b9 100644 --- a/.github/workflows/release-upload.yml +++ b/.github/workflows/release-upload.yml @@ -33,7 +33,7 @@ jobs: ARCHIVE_NAME: ${{ github.event.repository.name }}-${{ inputs.git-tag }} steps: - name: Checkout Source - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 ref: ${{ inputs.git-tag }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 048186f50..17c6bda12 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -86,8 +86,7 @@ jobs: needs: - check-tag secrets: inherit - uses: - ./.github/workflows/build-docs.yml + uses: ./.github/workflows/build-docs.yml with: build-ctk-ver: ${{ inputs.build-ctk-ver }} component: ${{ inputs.component }} @@ -102,8 +101,7 @@ jobs: needs: - check-tag secrets: inherit - uses: - ./.github/workflows/release-upload.yml + uses: ./.github/workflows/release-upload.yml with: git-tag: ${{ inputs.git-tag }} @@ -132,11 +130,11 @@ jobs: - name: Publish package distributions to PyPI if: ${{ inputs.wheel-dst == 'pypi' }} - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 - name: Publish package distributions to TestPyPI if: ${{ inputs.wheel-dst == 'testpypi' }} - uses: pypa/gh-action-pypi-publish@release/v1 + uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4 with: repository-url: https://test.pypi.org/legacy/ diff --git a/.github/workflows/status-check.yml b/.github/workflows/status-check.yml index 4966faa01..5b6828f00 100644 --- a/.github/workflows/status-check.yml +++ b/.github/workflows/status-check.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: GitHub Checks - uses: poseidon/wait-for-status-checks@v0.6.0 + uses: poseidon/wait-for-status-checks@899c768d191b56eef585c18f8558da19e1f3e707 # v0.6.0 with: token: ${{ secrets.GITHUB_TOKEN }} match_pattern: "CI*" diff --git a/.github/workflows/test-wheel-linux.yml b/.github/workflows/test-wheel-linux.yml index a78a9d611..8a10a9ef7 100644 --- a/.github/workflows/test-wheel-linux.yml +++ b/.github/workflows/test-wheel-linux.yml @@ -141,7 +141,7 @@ jobs: run: nvidia-smi - name: Checkout ${{ github.event.repository.name }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 @@ -149,9 +149,9 @@ jobs: uses: ./.github/actions/install_unix_deps continue-on-error: false with: - # gcc for Cython tests, jq/wget for artifact fetching - dependencies: "build-essential jq wget" - dependent_exes: "gcc jq wget" + # for artifact fetching + dependencies: "jq wget" + dependent_exes: "jq wget" - name: Set environment variables run: | @@ -167,15 +167,15 @@ jobs: TEST_CUDA_MAJOR="$(cut -d '.' -f 1 <<< ${{ matrix.CUDA_VER }})" if [[ $BUILD_CUDA_MAJOR != $TEST_CUDA_MAJOR ]]; then SKIP_CUDA_BINDINGS_TEST=1 - SKIP_CUDA_CORE_CYTHON_TEST=0 + SKIP_CYTHON_TEST=1 else SKIP_CUDA_BINDINGS_TEST=0 BUILD_CUDA_MINOR="$(cut -d '.' -f 2 <<< ${{ inputs.build-ctk-ver }})" TEST_CUDA_MINOR="$(cut -d '.' -f 2 <<< ${{ matrix.CUDA_VER }})" if [[ $BUILD_CUDA_MINOR != $TEST_CUDA_MINOR ]]; then - SKIP_CUDA_CORE_CYTHON_TEST=1 + SKIP_CYTHON_TEST=1 else - SKIP_CUDA_CORE_CYTHON_TEST=0 + SKIP_CYTHON_TEST=0 fi fi @@ -196,23 +196,26 @@ jobs: echo "CUDA_CORE_ARTIFACT_BASENAME=${CUDA_CORE_ARTIFACT_BASENAME}" >> $GITHUB_ENV echo "CUDA_CORE_ARTIFACT_NAME=${CUDA_CORE_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV echo "CUDA_CORE_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_core/dist")" >> $GITHUB_ENV + echo "CUDA_CORE_CYTHON_TESTS_DIR=$(realpath "$REPO_DIR/cuda_core/tests/cython")" >> $GITHUB_ENV CUDA_BINDINGS_ARTIFACT_BASENAME="cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ inputs.build-ctk-ver }}-${{ inputs.host-platform }}" echo "CUDA_BINDINGS_ARTIFACT_BASENAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}" >> $GITHUB_ENV echo "CUDA_BINDINGS_ARTIFACT_NAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}-${{ github.sha }}" >> $GITHUB_ENV echo "CUDA_BINDINGS_ARTIFACTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/dist")" >> $GITHUB_ENV + echo "CUDA_BINDINGS_CYTHON_TESTS_DIR=$(realpath "$REPO_DIR/cuda_bindings/tests/cython")" >> $GITHUB_ENV + echo "SKIP_CUDA_BINDINGS_TEST=${SKIP_CUDA_BINDINGS_TEST}" >> $GITHUB_ENV - echo "SKIP_CUDA_CORE_CYTHON_TEST=${SKIP_CUDA_CORE_CYTHON_TEST}" >> $GITHUB_ENV + echo "SKIP_CYTHON_TEST=${SKIP_CYTHON_TEST}" >> $GITHUB_ENV - name: Download cuda-python build artifacts if: ${{ env.SKIP_CUDA_BINDINGS_TEST == '0'}} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: cuda-python-wheel path: . - name: Download cuda.bindings build artifacts if: ${{ env.SKIP_CUDA_BINDINGS_TEST == '0'}} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }} path: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} @@ -261,8 +264,21 @@ jobs: pwd ls -lahR $CUDA_BINDINGS_ARTIFACTS_DIR + - name: Download cuda.bindings Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}-tests + path: ${{ env.CUDA_BINDINGS_CYTHON_TESTS_DIR }} + + - name: Display structure of downloaded cuda.bindings Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + run: | + pwd + ls -lahR $CUDA_BINDINGS_CYTHON_TESTS_DIR + - name: Download cuda.core build artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ env.CUDA_CORE_ARTIFACT_NAME }} path: ${{ env.CUDA_CORE_ARTIFACTS_DIR }} @@ -272,8 +288,21 @@ jobs: pwd ls -lahR $CUDA_CORE_ARTIFACTS_DIR + - name: Download cuda.core Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: ${{ env.CUDA_CORE_ARTIFACT_NAME }}-tests + path: ${{ env.CUDA_CORE_CYTHON_TESTS_DIR }} + + - name: Display structure of downloaded cuda.core Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + run: | + pwd + ls -lahR $CUDA_CORE_CYTHON_TESTS_DIR + - name: Set up Python ${{ matrix.PY_VER }} - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.PY_VER }} env: @@ -326,16 +355,7 @@ jobs: pushd ./cuda_bindings ${SANITIZER_CMD} pytest -rxXs -v tests/ - - # It is a bit convoluted to run the Cython tests against CTK wheels, - # so let's just skip them. - if [[ "${{ matrix.LOCAL_CTK }}" == 1 ]]; then - if [[ "${{ inputs.host-platform }}" == linux* ]]; then - bash tests/cython/build_tests.sh - elif [[ "${{ inputs.host-platform }}" == win* ]]; then - # TODO: enable this once win-64 runners are up - exit 1 - fi + if [[ "${SKIP_CYTHON_TEST}" == 0 ]]; then ${SANITIZER_CMD} pytest -rxXs -v tests/cython fi popd @@ -361,18 +381,9 @@ jobs: pushd ./cuda_core ${SANITIZER_CMD} pytest -rxXs -v tests/ - # It is a bit convoluted to run the Cython tests against CTK wheels, - # so let's just skip them. Also, currently our CI always installs the - # latest bindings (from either major version). This is not compatible - # with the test requirements. - if [[ "${{ matrix.LOCAL_CTK }}" == 1 && "${SKIP_CUDA_CORE_CYTHON_TEST}" == 0 ]]; then - pip install cython setuptools # setuptools needed starting PY312 - if [[ "${{ inputs.host-platform }}" == linux* ]]; then - bash tests/cython/build_tests.sh - elif [[ "${{ inputs.host-platform }}" == win* ]]; then - # TODO: enable this once win-64 runners are up - exit 1 - fi + # Currently our CI always installs the latest bindings (from either major version). + # This is not compatible with the test requirements. + if [[ "${SKIP_CYTHON_TEST}" == 0 ]]; then ${SANITIZER_CMD} pytest -rxXs -v tests/cython fi popd diff --git a/.github/workflows/test-wheel-windows.yml b/.github/workflows/test-wheel-windows.yml index 09b2b69ad..04ed9f341 100644 --- a/.github/workflows/test-wheel-windows.yml +++ b/.github/workflows/test-wheel-windows.yml @@ -85,7 +85,7 @@ jobs: runs-on: 'cuda-python-windows-gpu-github' steps: - name: Checkout ${{ github.event.repository.name }} - uses: actions/checkout@v4 + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 with: fetch-depth: 0 @@ -105,8 +105,16 @@ jobs: $TEST_CUDA_MAJOR = '${{ matrix.CUDA_VER }}' -split '\.' | Select-Object -First 1 if ($BUILD_CUDA_MAJOR -ne $TEST_CUDA_MAJOR) { $SKIP_CUDA_BINDINGS_TEST = 1 + $SKIP_CYTHON_TEST = 1 } else { $SKIP_CUDA_BINDINGS_TEST = 0 + $BUILD_CUDA_MINOR = '${{ inputs.build-ctk-ver }}' -split '\.' | Select-Object -Skip 1 -First 1 + $TEST_CUDA_MINOR = '${{ matrix.CUDA_VER }}' -split '\.' | Select-Object -Skip 1 -First 1 + if ($BUILD_CUDA_MINOR -ne $TEST_CUDA_MINOR) { + $SKIP_CYTHON_TEST = 1 + } else { + $SKIP_CYTHON_TEST = 0 + } } # Make outputs from the previous job as env vars @@ -115,22 +123,25 @@ jobs: "CUDA_CORE_ARTIFACT_BASENAME=${CUDA_CORE_ARTIFACT_BASENAME}" >> $env:GITHUB_ENV "CUDA_CORE_ARTIFACT_NAME=${CUDA_CORE_ARTIFACT_BASENAME}-${{ github.sha }}" >> $env:GITHUB_ENV "CUDA_CORE_ARTIFACTS_DIR=$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$REPO_DIR\cuda_core\dist"))" >> $env:GITHUB_ENV + "CUDA_CORE_CYTHON_TESTS_DIR=$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$REPO_DIR\cuda_core\tests\cython"))" >> $env:GITHUB_ENV $CUDA_BINDINGS_ARTIFACT_BASENAME = "cuda-bindings-python${PYTHON_VERSION_FORMATTED}-cuda${{ inputs.build-ctk-ver }}-${{ inputs.host-platform }}" "CUDA_BINDINGS_ARTIFACT_BASENAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}" >> $env:GITHUB_ENV "CUDA_BINDINGS_ARTIFACT_NAME=${CUDA_BINDINGS_ARTIFACT_BASENAME}-${{ github.sha }}" >> $env:GITHUB_ENV "CUDA_BINDINGS_ARTIFACTS_DIR=$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$REPO_DIR\cuda_bindings\dist"))" >> $env:GITHUB_ENV + "CUDA_BINDINGS_CYTHON_TESTS_DIR=$($ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath("$REPO_DIR\cuda_bindings\tests\cython"))" >> $env:GITHUB_ENV "SKIP_CUDA_BINDINGS_TEST=${SKIP_CUDA_BINDINGS_TEST}" >> $env:GITHUB_ENV + "SKIP_CYTHON_TEST=${SKIP_CYTHON_TEST}" >> $env:GITHUB_ENV - name: Download cuda-python build artifacts if: ${{ env.SKIP_CUDA_BINDINGS_TEST == '0'}} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: cuda-python-wheel path: . - name: Download cuda.bindings build artifacts if: ${{ env.SKIP_CUDA_BINDINGS_TEST == '0'}} - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }} path: ${{ env.CUDA_BINDINGS_ARTIFACTS_DIR }} @@ -215,8 +226,21 @@ jobs: Get-Location Get-ChildItem -Recurse -Force $env:CUDA_BINDINGS_ARTIFACTS_DIR | Select-Object Mode, LastWriteTime, Length, FullName + - name: Download cuda.bindings Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: ${{ env.CUDA_BINDINGS_ARTIFACT_NAME }}-tests + path: ${{ env.CUDA_BINDINGS_CYTHON_TESTS_DIR }} + + - name: Display structure of downloaded cuda.bindings Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + run: | + Get-Location + Get-ChildItem -Recurse -Force $env:CUDA_BINDINGS_CYTHON_TESTS_DIR | Select-Object Mode, LastWriteTime, Length, FullName + - name: Download cuda.core build artifacts - uses: actions/download-artifact@v4 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ env.CUDA_CORE_ARTIFACT_NAME }} path: ${{ env.CUDA_CORE_ARTIFACTS_DIR }} @@ -226,8 +250,21 @@ jobs: Get-Location Get-ChildItem -Recurse -Force $env:CUDA_CORE_ARTIFACTS_DIR | Select-Object Mode, LastWriteTime, Length, FullName + - name: Download cuda.core Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 + with: + name: ${{ env.CUDA_CORE_ARTIFACT_NAME }}-tests + path: ${{ env.CUDA_CORE_CYTHON_TESTS_DIR }} + + - name: Display structure of downloaded cuda.core Cython tests + if: ${{ env.SKIP_CYTHON_TEST == '0' }} + run: | + Get-Location + Get-ChildItem -Recurse -Force $env:CUDA_CORE_CYTHON_TESTS_DIR | Select-Object Mode, LastWriteTime, Length, FullName + - name: Set up Python ${{ matrix.PY_VER }} - uses: actions/setup-python@v5 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: ${{ matrix.PY_VER }} @@ -254,7 +291,9 @@ jobs: Push-Location ./cuda_bindings pytest -rxXs -v tests/ - # skip Cython tests for now (NVIDIA/cuda-python#466) + if ($env:SKIP_CYTHON_TEST -eq '0') { + pytest -rxXs -v tests/cython + } Pop-Location - name: Run cuda.core tests @@ -277,6 +316,9 @@ jobs: Push-Location ./cuda_core pytest -rxXs -v tests/ + if ($env:SKIP_CYTHON_TEST -eq '0') { + pytest -rxXs -v tests/cython + } Pop-Location - name: Ensure cuda-python installable diff --git a/cuda_bindings/pyproject.toml b/cuda_bindings/pyproject.toml index f1a97e806..42ea4bd96 100644 --- a/cuda_bindings/pyproject.toml +++ b/cuda_bindings/pyproject.toml @@ -2,7 +2,7 @@ # SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE [build-system] -requires = ["setuptools>=77.0.0", "cython>=3.0", "pyclibrary>=0.1.7"] +requires = ["setuptools>=77.0.0", "cython>=3.0,<3.1.0", "pyclibrary>=0.1.7"] build-backend = "setuptools.build_meta" [project] @@ -38,8 +38,8 @@ all = [ ] test = [ - "cython>=3.0", - "setuptools", + "cython>=3.0,<3.1.0", + "setuptools>=77.0.0", "numpy>=1.21.1", "pytest>=6.2.4", "pytest-benchmark>=3.4.1", diff --git a/cuda_bindings/tests/cython/build_tests.sh b/cuda_bindings/tests/cython/build_tests.sh index 236151bfa..33c2a37ed 100755 --- a/cuda_bindings/tests/cython/build_tests.sh +++ b/cuda_bindings/tests/cython/build_tests.sh @@ -3,4 +3,15 @@ # Copyright (c) 2024-2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. # SPDX-License-Identifier: LicenseRef-NVIDIA-SOFTWARE-LICENSE -CPLUS_INCLUDE_PATH=$CUDA_HOME/include:$CPLUS_INCLUDE_PATH cythonize -3 -i $(dirname "$0")/test_*.pyx +UNAME=$(uname) +if [ "$UNAME" == "Linux" ] ; then + SCRIPTPATH=$(dirname $(realpath "$0")) + export CPLUS_INCLUDE_PATH=$CUDA_HOME/include:$CPLUS_INCLUDE_PATH +elif [[ "$UNAME" == CYGWIN* || "$UNAME" == MINGW* || "$UNAME" == MSYS* ]] ; then + SCRIPTPATH="$(dirname $(cygpath -w $(realpath "$0")))" + export CL="/I\"${CUDA_HOME}\\include\" ${CL}" +else + exit 1 +fi + +cythonize -3 -i ${SCRIPTPATH}/test_*.pyx diff --git a/cuda_core/tests/cython/build_tests.sh b/cuda_core/tests/cython/build_tests.sh index 3ffe61ef7..61ecafc6e 100755 --- a/cuda_core/tests/cython/build_tests.sh +++ b/cuda_core/tests/cython/build_tests.sh @@ -3,5 +3,16 @@ # Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. ALL RIGHTS RESERVED. # SPDX-License-Identifier: Apache-2.0 -SCRIPTPATH=$(dirname $(realpath "$0")) -CPLUS_INCLUDE_PATH=$SCRIPTPATH/../../cuda/core/experimental/include:$CUDA_HOME/include:$CPLUS_INCLUDE_PATH cythonize -3 -i $(dirname "$0")/test_*.pyx +UNAME=$(uname) +if [ "$UNAME" == "Linux" ] ; then + SCRIPTPATH=$(dirname $(realpath "$0")) + export CPLUS_INCLUDE_PATH=${SCRIPTPATH}/../../cuda/core/experimental/include:$CUDA_HOME/include:$CPLUS_INCLUDE_PATH +elif [[ "$UNAME" == CYGWIN* || "$UNAME" == MINGW* || "$UNAME" == MSYS* ]] ; then + SCRIPTPATH="$(dirname $(cygpath -w $(realpath "$0")))" + CUDA_CORE_INCLUDE_PATH=$(echo "${SCRIPTPATH}\..\..\cuda\core\experimental\include" | sed 's/\\/\\\\/g') + export CL="/I\"${CUDA_CORE_INCLUDE_PATH}\" /I\"${CUDA_HOME}\\include\" ${CL}" +else + exit 1 +fi + +cythonize -3 -i ${SCRIPTPATH}/test_*.pyx