From f78143307c7baa237f2611c58e76c7a6a9eb0e35 Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:18:46 +0000 Subject: [PATCH 1/7] Add cuDF Java Maven Central publish job * Add a tag-gated `java-publish` job that deploys the gathered maven repo as an RC through shared-workflows, with GPG signing and Sonatype staging for manual Central publish. * On release-tag builds, strip `-SNAPSHOT` and rewrite `java/pom.xml` so packaged artifacts use the release version. * Copy the `cuda12` classifier JAR as the unclassified primary so consumers of `ai.rapids:cudf` without a classifier still resolve. * Forward `GITHUB_REF` into the jar-build container so the release-tag check can see it and switch on release versioning. * Make `HOST_UID`/`HOST_GID` required and always chown outputs on EXIT. * Update `java/ci/README.md` for release vs SNAPSHOT versioning, sources/javadoc jars, and the unclassified primary layout. --- .github/workflows/build.yaml | 22 +++++++++ ci/build_java.sh | 3 ++ java/ci/README.md | 50 +++++++++++++++----- java/ci/assemble_maven_repo.sh | 14 +++++- java/ci/build_cudf_java_jar.sh | 4 ++ java/ci/build_cudf_java_jar_in_container.sh | 28 +++++++++-- java/ci/build_static_libcudf_in_container.sh | 15 ++++-- 7 files changed, 115 insertions(+), 21 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 65797b73afa4..7830f8f59457 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -568,3 +568,25 @@ jobs: name: cudf_java_maven_repo path: ${{ runner.temp }}/maven-repo if-no-files-found: error + + # Publish tagged release candidates to Maven Central via the Sonatype + # Central Publisher Portal. Release path only (vYY.MM.PP tags). Does not + # publish nightlies. + # TODO: add nightly Sonatype snapshot publishing. + java-publish: + needs: [java-gather] + if: ${{ github.ref_type == 'tag' && (inputs.build_type || 'branch') == 'branch' }} + permissions: + actions: read + contents: read + uses: rapidsai/shared-workflows/.github/workflows/maven-publish.yaml@main + secrets: + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + MAVEN_DEPLOY_TOKEN: ${{ secrets.MAVEN_DEPLOY_TOKEN }} + with: + publication-type: 'rc' + artifact-name: cudf_java_maven_repo + source-git-sha: ${{ inputs.sha || github.sha }} + # false = validate + drop (safe). true = stage PENDING for manual publish. + stage-for-maven-central-publish: true diff --git a/ci/build_java.sh b/ci/build_java.sh index 93f84cc955c9..7436a2706758 100755 --- a/ci/build_java.sh +++ b/ci/build_java.sh @@ -28,6 +28,9 @@ if [[ -z ${RAPIDS_CUDA_VERSION:-} ]]; then exit 1 fi +export HOST_UID="${HOST_UID:-$(id -u)}" +export HOST_GID="${HOST_GID:-$(id -g)}" + RAPIDS_CUDA_VERSION="$(cudf_java_normalize_cuda_version "${RAPIDS_CUDA_VERSION}")" export RAPIDS_CUDA_VERSION CLASSIFIER="$(cudf_java_maven_classifier "${RAPIDS_CUDA_VERSION}")" diff --git a/java/ci/README.md b/java/ci/README.md index 95f819a972a4..04328c0541b2 100644 --- a/java/ci/README.md +++ b/java/ci/README.md @@ -40,9 +40,13 @@ so plain `rm -rf` works. --cuda-version 12.9 ``` -This compiles the JNI layer against the static libcudf from Step 1 and emits a -single classifier JAR (e.g. `cudf-26.10.0-SNAPSHOT-cuda12.jar`) plus its POM -into a classifier-named subdirectory under `--output-dir`: +Optional `GITHUB_REF` selects release tag vs SNAPSHOT versioning. Unset means +SNAPSHOT. See the versioning section below. + +This compiles the JNI layer against the static libcudf from Step 1 and emits +the classifier JAR (e.g. `cudf-26.10.0-SNAPSHOT-cuda12.jar`), a +classifier-independent sources jar and javadoc jar, and the POM into a +classifier-named subdirectory under `--output-dir`: ``` /tmp/jars/cuda12/ @@ -68,21 +72,45 @@ inside the container. ``` This walks every subdirectory of `--jars-dir` (each subdir name IS the -classifier), gathers the per-classifier JAR and shared POM, derives the -artifact version from the JAR filenames (requiring a single unique version -across subdirs), and lays them out as: +classifier), gathers the per-classifier JAR, one shared sources jar, one +shared javadoc jar, the shared POM, and seeds an unclassified primary JAR +as a copy of the `cuda12` classifier. Derives the artifact version from +the JAR filenames (requiring a single unique version across subdirs) and +lays them out as: ``` -/tmp/maven-repo/ai/rapids/cudf/26.10.0-SNAPSHOT/ - cudf-26.10.0-SNAPSHOT-cuda12.jar - cudf-26.10.0-SNAPSHOT-cuda13.jar - cudf-26.10.0-SNAPSHOT.pom +/tmp/maven-repo/ai/rapids/cudf/-SNAPSHOT/ + cudf--SNAPSHOT.jar + cudf--SNAPSHOT-cuda12.jar + cudf--SNAPSHOT-cuda13.jar + cudf--SNAPSHOT-sources.jar + cudf--SNAPSHOT-javadoc.jar + cudf--SNAPSHOT.pom ``` The set of classifiers is whatever subdirectories are present under `--jars-dir`. For a local `x86_64`-only run, populate `/tmp/jars/cuda12/` and `/tmp/jars/cuda13/`. For the full four-way release build, add -`/tmp/jars/cuda12-arm64/` and `/tmp/jars/cuda13-arm64/`. +`/tmp/jars/cuda12-arm64/` and `/tmp/jars/cuda13-arm64/`. The `cuda12` +subdirectory is required because the unclassified primary JAR is copied from +it, so an `aarch64`-only set of subdirectories is not a valid gather input. + +### Release Tag vs SNAPSHOT Versioning + +Release tag CI runs (`GITHUB_REF=refs/tags/vYY.MM.PP`) produce release-versioned +JARs (`cudf--*.jar`). All other runs produce `-SNAPSHOT`. Gated by +[`rapids-is-release-build`](https://github.com/rapidsai/gha-tools/blob/main/tools/rapids-is-release-build). +`GITHUB_REF` is optional. Unset or non-tag values stay SNAPSHOT. + +To rehearse the release path locally: + +```bash +GITHUB_REF=refs/tags/vYY.MM.PP ./java/ci/test_java_build_local.sh +``` + +Rewrites `java/pom.xml` in place for packaging, then restores it on exit. + +### GitHub Actions In GitHub Actions (`.github/workflows/build.yaml`), the `java-build` matrix job runs Steps 1-2 per (CUDA x arch) entry and uploads each classifier subdir as a diff --git a/java/ci/assemble_maven_repo.sh b/java/ci/assemble_maven_repo.sh index 96bf8c8f33f3..a994d9e4ea63 100755 --- a/java/ci/assemble_maven_repo.sh +++ b/java/ci/assemble_maven_repo.sh @@ -166,12 +166,24 @@ if [[ -z "${FIRST_VERSION}" ]]; then exit 1 fi +DEST_DIR="${OUTPUT_DIR}/${GROUP_PATH}/${ARTIFACT_ID}/${FIRST_VERSION}" + +# Seed the unclassified primary from cuda12. Maven Central serves this to +# consumers depending on ai.rapids:cudf without a . +PRIMARY_SOURCE="${DEST_DIR}/cudf-${FIRST_VERSION}-cuda12.jar" +if [[ ! -f "${PRIMARY_SOURCE}" ]]; then + echo "Error: ${PRIMARY_SOURCE} missing." >&2 + exit 1 +fi +UNCLASSIFIED="${DEST_DIR}/cudf-${FIRST_VERSION}.jar" +cp -f "${PRIMARY_SOURCE}" "${UNCLASSIFIED}" +echo " + cudf-${FIRST_VERSION}.jar (unclassified primary, copy of cuda12)" + # Sources and javadoc jars are classifier-independent (pure Java, no arch or # cuda variation). Every classifier subdir produces byte-equivalent copies; # pick the lexicographically first subdir's copy as canonical. Fail fast if # any subdir is missing either file - that indicates -Prelease or # -Pjavadoc-jdk17 did not activate for that classifier's build. -DEST_DIR="${OUTPUT_DIR}/${GROUP_PATH}/${ARTIFACT_ID}/${FIRST_VERSION}" FIRST_CLASSIFIER_SUBDIR="" for subdir in "${JARS_DIR}"/*/; do if [[ -z ${FIRST_CLASSIFIER_SUBDIR} ]]; then diff --git a/java/ci/build_cudf_java_jar.sh b/java/ci/build_cudf_java_jar.sh index f9cf9c98dd2f..771cc132c354 100755 --- a/java/ci/build_cudf_java_jar.sh +++ b/java/ci/build_cudf_java_jar.sh @@ -185,6 +185,10 @@ DOCKER_ARGS=( --env REPO_ROOT=/repo ) +if [[ -n ${GITHUB_REF:-} ]]; then + DOCKER_ARGS+=(--env GITHUB_REF="${GITHUB_REF}") +fi + if [[ -n ${CMAKE_CUDA_ARCHITECTURES} ]]; then DOCKER_ARGS+=(--env CMAKE_CUDA_ARCHITECTURES="${CMAKE_CUDA_ARCHITECTURES}") fi diff --git a/java/ci/build_cudf_java_jar_in_container.sh b/java/ci/build_cudf_java_jar_in_container.sh index 53fc028ce875..88e772dc012e 100755 --- a/java/ci/build_cudf_java_jar_in_container.sh +++ b/java/ci/build_cudf_java_jar_in_container.sh @@ -35,12 +35,19 @@ if [[ -z ${RAPIDS_CUDA_VERSION:-} ]]; then exit 1 fi -_chown_outputs_on_exit() { - if [[ -n ${HOST_UID:-} && -n ${HOST_GID:-} ]]; then - chown -R "${HOST_UID}:${HOST_GID}" "${OUTPUT_DIR}" "${REPO_ROOT}/java/target" 2>/dev/null || true +if [[ -z ${HOST_UID} || -z ${HOST_GID} ]]; then + echo "Error: HOST_UID and HOST_GID must both be set" >&2 + exit 1 +fi + +POM_WAS_REWRITTEN=0 +_cleanup_on_exit() { + if [[ ${POM_WAS_REWRITTEN} -eq 1 ]]; then + git -C "${REPO_ROOT}" checkout -- java/pom.xml 2>/dev/null || true fi + chown -R "${HOST_UID}:${HOST_GID}" "${OUTPUT_DIR}" "${REPO_ROOT}/java/target" 2>/dev/null || true } -trap _chown_outputs_on_exit EXIT +trap _cleanup_on_exit EXIT BUILD_ARG=( -B @@ -83,7 +90,17 @@ BUILD_ARG+=("-Dcmake.ccache.opts=${CMAKE_CCACHE_OPTS[*]}") cd "${REPO_ROOT}/java" -CUDF_VERSION="$(cudf_java_scl mvn help:evaluate -Dexpression=project.version -q -DforceStdout "${BUILD_ARG[@]}")" +CUDF_VERSION="$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout "${BUILD_ARG[@]}")" + +# Release tag builds strip -SNAPSHOT and rewrite the POM so packaged artifacts +# carry the release version. Non-release builds keep -SNAPSHOT. The EXIT trap +# restores java/pom.xml after packaging (the rewritten POM is copied to OUTPUT_DIR). +if rapids-is-release-build; then + CUDF_VERSION="${CUDF_VERSION%-SNAPSHOT}" + mvn versions:set -DnewVersion="${CUDF_VERSION}" -DgenerateBackupPoms=false "${BUILD_ARG[@]}" + POM_WAS_REWRITTEN=1 +fi + rapids-logger "Packaging cuDF Java JAR ${CUDF_VERSION}" # Omit the `clean` goal: java/target may be a bind-mount point, so `mvn clean` @@ -136,6 +153,7 @@ done cp -f "${MAIN_JAR}" "${OUTPUT_DIR}/" cp -f pom.xml "${OUTPUT_DIR}/cudf-${CUDF_VERSION}.pom" + rapids-logger "Emitted artifacts to ${OUTPUT_DIR}" if command -v sccache >/dev/null 2>&1; then sccache --show-adv-stats || true diff --git a/java/ci/build_static_libcudf_in_container.sh b/java/ci/build_static_libcudf_in_container.sh index b911b131aad3..b0a3251261d0 100755 --- a/java/ci/build_static_libcudf_in_container.sh +++ b/java/ci/build_static_libcudf_in_container.sh @@ -34,6 +34,16 @@ if [[ -z ${RAPIDS_CUDA_VERSION:-} ]]; then exit 1 fi +if [[ -z ${HOST_UID} || -z ${HOST_GID} ]]; then + echo "Error: HOST_UID and HOST_GID must both be set" >&2 + exit 1 +fi + +_cleanup_on_exit() { + chown -R "${HOST_UID}:${HOST_GID}" "${INSTALL_PREFIX}" 2>/dev/null || true +} +trap _cleanup_on_exit EXIT + CMAKE_ARGS=( -S "${REPO_ROOT}/cpp" -B "${BUILD_DIR}" @@ -75,10 +85,7 @@ cudf_java_scl cmake "${CMAKE_ARGS[@]}" cmake --build "${BUILD_DIR}" --parallel "${PARALLEL_LEVEL}" cmake --install "${BUILD_DIR}" -# Hand the install tree back to the host user (host wrapper passes HOST_UID/GID). -if [[ -n ${HOST_UID:-} && -n ${HOST_GID:-} ]]; then - chown -R "${HOST_UID}:${HOST_GID}" "${INSTALL_PREFIX}" -fi +rapids-logger "Emitted static libcudf install tree to ${INSTALL_PREFIX}" if command -v sccache >/dev/null 2>&1; then sccache --show-adv-stats || true fi From db9647421383a13869176e054bd526e9d668d080 Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:40:31 +0000 Subject: [PATCH 2/7] TEMPORARY: CI release validation test --- .github/workflows/pr.yaml | 989 ++------------------------------------ 1 file changed, 51 insertions(+), 938 deletions(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 27195b379a61..b45400b98862 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -1,3 +1,6 @@ +# TEMP: pr.yaml slimmed to the Java Maven Central publish path for a +# 26.08 release-candidate rehearsal on a PR. All other jobs were removed +# for this test run and must be restored before merge. name: pr on: push: @@ -11,44 +14,12 @@ jobs: # Please keep pr-builder as the top job here pr-builder: needs: + - telemetry-setup - build-details - - check-nightly-ci - - changed-files - - checks - - cmake-tests - - conda-cpp-build - - cpp-linters - - conda-cpp-checks - - conda-cpp-tests - - conda-python-build - - conda-python-build-noarch - - conda-python-cudf-tests - - conda-python-other-tests - - conda-java-tests - java-build-matrix - java-build - - java-tests - - conda-notebook-tests - - docs-build - - publish-api-docs - - wheel-build-libcudf - - wheel-build-libcudf-streaming - - wheel-build-cudf-streaming - - wheel-tests-cudf-streaming - - wheel-build-pylibcudf - - wheel-build-cudf - - wheel-tests-cudf - - wheel-build-cudf-polars - - wheel-tests-cudf-polars - - cudf-polars-polars-tests - - wheel-build-dask-cudf - - wheel-tests-dask-cudf - - devcontainer - - unit-tests-cudf-pandas - - pandas-tests - - narwhals-tests - - telemetry-setup - - third-party-integration-tests-cudf-pandas + - java-gather + - java-publish uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@main permissions: contents: read @@ -68,470 +39,9 @@ jobs: uses: rapidsai/shared-actions/telemetry-dispatch-stash-base-env-vars@main build-details: uses: rapidsai/shared-workflows/.github/workflows/compute-build-details.yaml@main - check-nightly-ci: - runs-on: ubuntu-latest - permissions: - actions: read - id-token: write - env: - GH_TOKEN: ${{ github.token }} - steps: - - name: Get PR Info - id: get-pr-info - uses: nv-gha-runners/get-pr-info@090577647b8ddc4e06e809e264f7881650ecdccf # main - - name: Check if nightly CI is passing - uses: rapidsai/shared-actions/check_nightly_success/dispatch@main - with: - repo: ${{ github.repository }} - target-branch: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.ref }} - max-days-without-success: 14 - changed-files: - permissions: - actions: read - contents: read - packages: read - pull-requests: read - needs: telemetry-setup - uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@main - with: - files_yaml: | - build_docs: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.clang-format' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!ci/build_wheel*.sh' - - '!ci/check_style.sh' - - '!ci/discover_libcudf_tests.sh' - - '!ci/release/update-version.sh' - - '!ci/run_*.sh' - - '!ci/test_*.sh' - - '!ci/validate_wheel.sh' - - '!codecov.yml' - - '!SECURITY.md' - test_cpp: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!CONTRIBUTING.md' - - '!README.md' - - '!SECURITY.md' - - '!ci/cudf_pandas_scripts/**' - - '!ci/build_docs.sh' - - '!ci/build_python*.sh' - - '!ci/build_wheel*.sh' - - '!ci/check_style.sh' - - '!ci/cudf_pandas_scripts/**' - - '!ci/release/update-version.sh' - - '!ci/test_python*.sh' - - '!ci/test_wheel*.sh' - - '!ci/validate_wheel.sh' - - '!docs/**' - - '!img/**' - - '!java/**' - - '!notebooks/**' - - '!python/**' - test_cudf_pandas: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.clang-format' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!CONTRIBUTING.md' - - '!README.md' - - '!SECURITY.md' - - '!ci/release/update-version.sh' - - '!ci/test_java.sh' - - '!ci/validate_wheel.sh' - - '!docs/**' - - '!img/**' - - '!java/**' - - '!notebooks/**' - test_java: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.clang-format' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!CONTRIBUTING.md' - - '!README.md' - - '!SECURITY.md' - - '!ci/build_docs.sh' - - '!ci/build_wheel*.sh' - - '!ci/check_style.sh' - - '!ci/cudf_pandas_scripts/**' - - '!ci/release/update-version.sh' - - '!ci/test_wheel*.sh' - - '!ci/validate_wheel.sh' - - '!ci/release/update-version.sh' - - '!codecov.yml' - - '!docs/**' - - '!img/**' - - '!notebooks/**' - - '!python/**' - test_notebooks: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.clang-format' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!CONTRIBUTING.md' - - '!README.md' - - '!SECURITY.md' - - '!ci/build_wheel*.sh' - - '!ci/cudf_pandas_scripts/**' - - '!ci/release/update-version.sh' - - '!ci/test_wheel*.sh' - - '!ci/validate_wheel.sh' - - '!codecov.yml' - - '!java/**' - test_python_conda: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.clang-format' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!CONTRIBUTING.md' - - '!README.md' - - '!SECURITY.md' - - '!ci/build_docs.sh' - - '!ci/build_wheel*.sh' - - '!ci/check_style.sh' - - '!ci/cudf_pandas_scripts/**' - - '!ci/release/update-version.sh' - - '!ci/test_java.sh' - - '!ci/test_wheel*.sh' - - '!ci/validate_wheel.sh' - - '!docs/**' - - '!img/**' - - '!java/**' - - '!notebooks/**' - test_python_wheels: - - '**' - - '!**/REVIEW_GUIDELINES.md' - - '!.coderabbit.yaml' - - '!.clang-format' - - '!.devcontainer/**' - - '!.github/CODEOWNERS' - - '!.github/ISSUE_TEMPLATE/**' - - '!.github/PULL_REQUEST_TEMPLATE.md' - - '!.github/copy-pr-bot.yaml' - - '!.github/labeler.yml' - - '!.github/ops-bot.yaml' - - '!.github/release.yml' - - '!.github/workflows/auto-assign.yml' - - '!.github/workflows/build.yaml' - - '!.github/workflows/issue-release-scheduled.yml' - - '!.github/workflows/labeler.yml' - - '!.github/workflows/pr_issue_status_automation.yml' - - '!.github/workflows/test.yaml' - - '!.github/workflows/trigger-breaking-change-alert.yaml' - - '!.pre-commit-config.yaml' - - '!.yamllint.yaml' - - '!CONTRIBUTING.md' - - '!README.md' - - '!SECURITY.md' - - '!ci/build_cpp.sh' - - '!ci/build_docs.sh' - - '!ci/build_python_noarch.sh' - - '!ci/build_python.sh' - - '!ci/check-style.sh' - - '!ci/cudf_pandas_scripts/**' - - '!ci/release/update-version.sh' - - '!ci/test_cpp.sh' - - '!ci/test_cpp_common.sh' - - '!ci/test_cpp_memcheck.sh' - - '!ci/test_java.sh' - - '!ci/test_notebooks.sh' - - '!ci/test_python_common.sh' - - '!ci/test_python_cudf.sh' - - '!ci/test_python_other.sh' - - '!codecov.yml' - - '!conda/**' - - '!docs/**' - - '!img/**' - - '!java/**' - - '!notebooks/**' - not_cudf_polars: - - '**' - - '!python/cudf_polars/**' - neither_cudf_polars_nor_dask_cudf: - - '**' - - '!python/cudf_polars/**' - - '!python/dask_cudf/**' - neither_cudf_nor_dask_cudf: - - '**' - - '!python/cudf/**' - - '!python/dask_cudf/**' - neither_cpp_nor_cudf_polars_nor_dask_cudf: - - '**' - - '!cpp/**' - - '!python/cudf_polars/**' - - '!python/dask_cudf/**' - checks: - permissions: - contents: read - needs: telemetry-setup - uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@main - with: - enable_check_generated_files: false - ignored_pr_jobs: "telemetry-summarize spark-rapids-jni cuml-compat-tests" - conda-cpp-build: - needs: [build-details, checks] - 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@main - with: - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu16 - script: ci/build_cpp.sh - cmake-tests: - needs: checks - 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@main - with: - build_type: pull-request - node_type: cpu16 - arch: "amd64" - container_image: "rapidsai/ci-conda:26.10-latest" - script: "ci/test_cmake.sh" - cpp-linters: - permissions: - actions: read - contents: read - id-token: write - packages: read - pull-requests: read - secrets: inherit # zizmor: ignore[secrets-inherit] - needs: checks - uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main - with: - build_type: pull-request - script: "ci/cpp_linters.sh" - conda-cpp-checks: - needs: conda-cpp-build - permissions: - actions: read - contents: read - id-token: write - packages: read - pull-requests: read - uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-post-build-checks.yaml@main - with: - build_type: pull-request - package_name: libcudf - conda-cpp-tests: - needs: [conda-cpp-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/conda-cpp-tests.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp - with: - build_type: pull-request - script: ci/test_cpp.sh - # https://github.com/NVIDIA/cudf/issues/23498 - matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) - conda-python-build: - needs: [build-details, conda-cpp-build] - 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@main - with: - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - script: ci/build_python.sh - # Build a conda package for each CUDA x ARCH x minimum supported Python version - matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) - conda-python-build-noarch: - needs: [build-details, conda-cpp-build, conda-python-build] - 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@main - with: - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - script: ci/build_python_noarch.sh - pure-conda: cuda_major - conda-python-cudf-tests: - needs: [conda-python-build, conda-python-build-noarch, 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/conda-python-tests.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_polars_nor_dask_cudf - with: - build_type: pull-request - script: "ci/test_python_cudf.sh" - # https://github.com/NVIDIA/cudf/issues/23498 - matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) - conda-python-other-tests: - # Tests for dask_cudf, cudf_polars, custreamz, cudf_kafka are separated for CI parallelism - needs: [conda-python-build-noarch, 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/conda-python-tests.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda - with: - build_type: pull-request - # https://github.com/NVIDIA/cudf/pull/22381/changes#r3196736965 - container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" - script: "ci/test_python_other.sh" - # https://github.com/NVIDIA/cudf/issues/23498 - matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) - conda-java-tests: - needs: [conda-cpp-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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_java - with: - build_type: pull-request - node_type: "gpu-l4-latest-1" - arch: "amd64" - container_image: "rapidsai/ci-conda:26.10-latest" - script: "ci/test_java.sh" - # Build and test the cuDF Java JAR for every Maven classifier. + # Build the cuDF Java JAR for every Maven classifier. java-build-matrix: - needs: [checks] + needs: [telemetry-setup] permissions: contents: read uses: rapidsai/shared-workflows/.github/workflows/compute-matrix.yaml@main @@ -540,7 +50,7 @@ jobs: matrix_name: conda-cpp-build matrix_filter: 'map(. + {CUDA_MAJOR: (.CUDA_VER | split(".") | .[0])})' java-build: - needs: [build-details, java-build-matrix, changed-files] + needs: [build-details, telemetry-setup, java-build-matrix] permissions: actions: read contents: read @@ -549,7 +59,6 @@ jobs: pull-requests: read secrets: inherit # zizmor: ignore[secrets-inherit] uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_java strategy: fail-fast: false matrix: ${{ fromJSON(needs.java-build-matrix.outputs.matrix) }} @@ -559,456 +68,60 @@ jobs: arch: ${{ matrix.ARCH }} node_type: cpu16 container_image: "rapidsai/ci-wheel:26.10-cuda${{ matrix.CUDA_VER }}-${{ matrix.LINUX_VER }}-py${{ matrix.PY_VER }}" - script: "ci/build_java.sh" + # TEMP: 26.08 release rehearsal - rewrite pom version and force + # release-tag path via GITHUB_REF so packaged artifacts are 26.08.0. + # `custom-job.yaml` expands `$INPUTS_SCRIPT` unquoted, so quotes / + # operators inside the value are literal on first pass. Prepending + # `eval` re-parses the joined args as a fresh shell command, which + # restores quote and `&&` handling. + script: "eval sed -i 's|26.10.0-SNAPSHOT|26.08.0-SNAPSHOT|' java/pom.xml && GITHUB_REF=refs/tags/v26.08.00 ci/build_java.sh" file_to_upload: output_jars artifact-name: cudf_java_${{ matrix.ARCH }}_cu${{ matrix.CUDA_MAJOR }} - java-tests: - needs: [java-build, java-build-matrix] - if: ${{ !cancelled() && needs.java-build.result == 'success' }} + # Assemble the per-classifier JARs into one Maven-repository layout. + java-gather: + needs: [java-build] + runs-on: linux-amd64-cpu4 permissions: - actions: read contents: read - packages: read - strategy: - fail-fast: false - matrix: ${{ fromJSON(needs.java-build-matrix.outputs.matrix) }} - runs-on: linux-${{ matrix.ARCH }}-gpu-l4-latest-1 - container: - image: rapidsai/ci-wheel:26.10-cuda${{ matrix.CUDA_VER }}-${{ matrix.LINUX_VER }}-py${{ matrix.PY_VER }} # zizmor: ignore[unpinned-images] - env: - NVIDIA_VISIBLE_DEVICES: ${{ env.NVIDIA_VISIBLE_DEVICES }} - defaults: - run: - shell: bash steps: - - name: Checkout + - name: Checkout code repo uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: + ref: ${{ github.sha }} persist-credentials: false - - name: Download java-build artifact + - name: Download per-entry JAR artifacts uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: - name: cudf_java_${{ matrix.ARCH }}_cu${{ matrix.CUDA_MAJOR }} - path: java_pkg - - name: Run Java tests - env: - LIBCUDF_LARGE_STRINGS_ENABLED: "0" + pattern: cudf_java_* + path: ${{ runner.temp }}/jars + merge-multiple: true + - name: Assemble Maven repository layout run: | - . java/ci/java_classifier.sh - JAVA_JAR="$(cudf_java_resolve_artifact_jar java_pkg)" - export JAVA_JAR - ci/test_packaged_java.sh - conda-notebook-tests: - needs: [conda-python-build, conda-python-build-noarch, 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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_notebooks - with: - build_type: pull-request - node_type: "gpu-l4-latest-1" - arch: "amd64" - container_image: "rapidsai/ci-conda:26.10-latest" - script: "ci/test_notebooks.sh" - docs-build: - needs: [conda-python-build, conda-python-build-noarch, changed-files] + ./java/ci/assemble_maven_repo.sh \ + --jars-dir "${RUNNER_TEMP}/jars" \ + --output-dir "${RUNNER_TEMP}/maven-repo" + - name: Upload combined Maven repository artifact + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 + with: + name: cudf_java_maven_repo + path: ${{ runner.temp }}/maven-repo + if-no-files-found: error + + # TEMP: 26.08 rehearsal - validate against Sonatype only, do not stage. + # The tag/build_type gate from build.yaml is removed so this runs on PR. + java-publish: + needs: [java-gather] 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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs - with: - build_type: pull-request - node_type: "gpu-l4-latest-1" - arch: "amd64" - container_image: "rapidsai/ci-conda:26.10-latest" - script: "ci/build_docs.sh" - publish-api-docs: - needs: [docs-build] - permissions: - contents: read - id-token: write + uses: rapidsai/shared-workflows/.github/workflows/maven-publish.yaml@main secrets: - akamai-access-token: ${{ secrets.NVIDIA_DOCS_AKAMAI_ACCESS_TOKEN }} - akamai-client-token: ${{ secrets.NVIDIA_DOCS_AKAMAI_CLIENT_TOKEN }} - akamai-client-secret: ${{ secrets.NVIDIA_DOCS_AKAMAI_CLIENT_SECRET }} - akamai-emails-to-notify: ${{ secrets.NVIDIA_DOCS_AKAMAI_EMAILS_TO_NOTIFY }} - akamai-host: ${{ secrets.NVIDIA_DOCS_AKAMAI_HOST }} - target-aws-access-key-id: ${{ secrets.NVIDIA_DOCS_AWS_ACCESS_KEY_ID }} - target-aws-region: ${{ secrets.NVIDIA_DOCS_AWS_REGION }} - target-aws-secret-access-key: ${{ secrets.NVIDIA_DOCS_AWS_SECRET_ACCESS_KEY }} - target-s3-bucket: ${{ secrets.NVIDIA_DOCS_S3_BUCKET }} - uses: rapidsai/shared-workflows/.github/workflows/publish-api-docs.yaml@main - with: - docs-projects: cudf,libcudf - dry-run: true - version-map: '{"26.04": "legacy", "26.06": "stable"}' - wheel-build-libcudf: - needs: [build-details, checks] - 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@main - with: - # build for every combination of arch and CUDA version, but only for the latest Python - matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu16 - script: "ci/build_wheel_libcudf.sh" - package-name: libcudf - package-type: cpp - wheel-build-libcudf-streaming: - needs: [build-details, checks, wheel-build-libcudf] - 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@main - with: - # build for every combination of arch and CUDA version, but only for the latest Python - matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu16 - script: "ci/build_wheel_libcudf_streaming.sh" - package-name: libcudf_streaming - package-type: cpp - wheel-build-cudf-streaming: - needs: [build-details, checks, wheel-build-libcudf-streaming, wheel-build-pylibcudf] - 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@main - with: - # Build a wheel for each CUDA x ARCH x minimum supported Python version - matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu16 - script: "ci/build_wheel_cudf_streaming.sh" - package-name: cudf_streaming - package-type: python - wheel-tests-cudf-streaming: - needs: [wheel-build-cudf-streaming, 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/wheels-test.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels - with: - build_type: pull-request - script: ci/test_wheel_cudf_streaming.sh - # https://github.com/NVIDIA/cudf/issues/23498 - matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) - wheel-build-pylibcudf: - needs: [build-details, checks, wheel-build-libcudf] - 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@main - with: - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu8 - script: "ci/build_wheel_pylibcudf.sh" - package-name: pylibcudf - package-type: python - # Build a wheel for each CUDA x ARCH x minimum supported Python version - matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) - wheel-build-cudf: - needs: [build-details, wheel-build-pylibcudf] - 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@main - with: - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu8 - script: "ci/build_wheel_cudf.sh" - package-name: cudf - package-type: python - # Build a wheel for each CUDA x ARCH x minimum supported Python version - matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) - wheel-tests-cudf: - needs: [wheel-build-cudf, 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/wheels-test.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_polars_nor_dask_cudf - with: - build_type: pull-request - script: ci/test_wheel_cudf.sh - # https://github.com/NVIDIA/cudf/issues/23498 - matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) - wheel-build-cudf-polars: - needs: [build-details, wheel-build-pylibcudf] - 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@main - with: - # This selects "ARCH=amd64 + the latest supported Python + CUDA". - matrix_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))])) - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu8 - script: "ci/build_wheel_cudf_polars.sh" - package-name: cudf_polars - package-type: python - pure-wheel: true - wheel-tests-cudf-polars: - needs: [wheel-build-cudf-polars, wheel-build-cudf-streaming, 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/wheels-test.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_nor_dask_cudf - with: - # This selects "ARCH=amd64 + the latest supported Python + CUDA". - matrix_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))])) - build_type: pull-request - container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" - script: "env POLARS_VERSIONS=endpoints ci/test_wheel_cudf_polars.sh" - cudf-polars-polars-tests: - needs: [wheel-build-cudf-polars, wheel-build-cudf-streaming, 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/wheels-test.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_nor_dask_cudf - with: - # This selects "ARCH=amd64 + the latest supported Python + CUDA". - matrix_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))])) - build_type: pull-request - script: "ci/test_cudf_polars_polars_tests.sh" - wheel-build-dask-cudf: - needs: [build-details, wheel-build-cudf] - 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@main - with: - # This selects "ARCH=amd64 + the latest supported Python + CUDA". - matrix_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))])) - build_type: pull-request - build-datetime: ${{ needs.build-details.outputs.build-datetime }} - node_type: cpu8 - script: "ci/build_wheel_dask_cudf.sh" - package-name: dask_cudf - package-type: python - pure-wheel: true - wheel-tests-dask-cudf: - needs: [wheel-build-dask-cudf, 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/wheels-test.yaml@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).not_cudf_polars - with: - # This selects "ARCH=amd64 + the latest supported Python + CUDA". - matrix_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))])) - build_type: pull-request - script: ci/test_wheel_dask_cudf.sh - # build cudf with benchmarks but disable for cudf_streaming since we can't use MPI/UCX in wheel-based builds - devcontainer: - permissions: - actions: read - contents: read - id-token: write - packages: read - pull-requests: read - secrets: inherit # zizmor: ignore[secrets-inherit] - needs: telemetry-setup - uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@main - with: - arch: '["amd64", "arm64"]' - cuda: '["13.3"]' - node_type: "cpu8" - timeout-minutes: 90 - env: | - SCCACHE_DIST_MAX_RETRIES=inf - SCCACHE_SERVER_LOG=sccache=debug - SCCACHE_DIST_FALLBACK_TO_LOCAL_COMPILE=false - build_command: | - sccache --zero-stats; - build-all -j0 --verbose -DBUILD_BENCHMARKS=ON 2>&1 | tee telemetry-artifacts/build.log; - sccache --show-adv-stats | tee telemetry-artifacts/sccache-stats.txt; - unit-tests-cudf-pandas: - needs: [wheel-build-cudf, 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/wheels-test.yaml@main - if: (fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels || fromJSON(needs.changed-files.outputs.changed_file_groups).test_cudf_pandas) && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_polars_nor_dask_cudf - with: - # This selects the latest supported Python + CUDA minor versions for each ARCH/CUDA major version combo - # Filter out GB300 due to https://github.com/NVIDIA/cudf/issues/23498 - matrix_filter: group_by([(.ARCH), (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by([(.PY_VER|split(".")|map(tonumber)), (.CUDA_VER|split(".")|map(tonumber))])) | map(select(.GPU != "gb300" and .GPU != "gh200")) - build_type: pull-request - script: ci/cudf_pandas_scripts/run_tests.sh - third-party-integration-tests-cudf-pandas: - needs: [conda-python-build, conda-python-build-noarch, 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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf - with: - build_type: pull-request - branch: ${{ inputs.branch }} - date: ${{ inputs.date }} - sha: ${{ inputs.sha }} - node_type: "gpu-l4-latest-1" - continue-on-error: true - container_image: "rapidsai/ci-conda:26.10-latest" - script: | - ci/cudf_pandas_scripts/third-party-integration/test.sh python/cudf/cudf_pandas_tests/third_party_integration_tests/dependencies.yaml - cuml-compat-tests: - needs: [conda-python-build, conda-python-build-noarch, 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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf - with: - build_type: pull-request - branch: ${{ inputs.branch }} - date: ${{ inputs.date }} - sha: ${{ inputs.sha }} - node_type: "gpu-l4-latest-1" - continue-on-error: true - container_image: "rapidsai/ci-conda:26.10-latest" - script: "ci/test_cuml_compat.sh" - pandas-tests: - # run the Pandas unit tests using PR branch - needs: [wheel-build-cudf, 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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf - with: - build_type: pull-request - branch: ${{ inputs.branch }} - date: ${{ inputs.date }} - sha: ${{ inputs.sha }} - node_type: "gpu-l4-latest-1" - container_image: "rapidsai/citestwheel:26.10-latest" - script: ci/cudf_pandas_scripts/pandas-tests/run.sh pr - narwhals-tests: - needs: [conda-python-build, conda-python-build-noarch, 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@main - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf - with: - build_type: pull-request - branch: ${{ inputs.branch }} - date: ${{ inputs.date }} - sha: ${{ inputs.sha }} - node_type: "gpu-l4-latest-1" - container_image: "rapidsai/ci-conda:26.10-latest" - script: ci/test_narwhals.sh - spark-rapids-jni: - needs: changed-files - permissions: - actions: read - contents: read - id-token: write - packages: read - pull-requests: read - uses: ./.github/workflows/spark-rapids-jni.yaml - if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_java - telemetry-summarize: - # This job must use a self-hosted runner to record telemetry traces. - runs-on: linux-amd64-cpu4 - permissions: - actions: write - needs: pr-builder - if: ${{ vars.TELEMETRY_ENABLED == 'true' && !cancelled() }} - continue-on-error: true - steps: - - name: Telemetry summarize - uses: rapidsai/shared-actions/telemetry-dispatch-summarize@main - env: - GH_TOKEN: ${{ github.token }} + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} + MAVEN_DEPLOY_TOKEN: ${{ secrets.MAVEN_DEPLOY_TOKEN }} + with: + publication-type: 'rc' + artifact-name: cudf_java_maven_repo + source-git-sha: ${{ github.sha }} + # false = validate + drop (safe). true = stage PENDING for manual publish. + stage-for-maven-central-publish: false From e7746fe3787191b6e569497fcd87928bc8310fdc Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Thu, 20 Aug 2026 17:03:06 +0000 Subject: [PATCH 3/7] TEMPORARY: CI release validation test --- .github/workflows/pr.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b45400b98862..637a0053820a 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -69,12 +69,12 @@ jobs: node_type: cpu16 container_image: "rapidsai/ci-wheel:26.10-cuda${{ matrix.CUDA_VER }}-${{ matrix.LINUX_VER }}-py${{ matrix.PY_VER }}" # TEMP: 26.08 release rehearsal - rewrite pom version and force - # release-tag path via GITHUB_REF so packaged artifacts are 26.08.0. + # release-tag path via GITHUB_REF so packaged artifacts are 26.08.01. # `custom-job.yaml` expands `$INPUTS_SCRIPT` unquoted, so quotes / # operators inside the value are literal on first pass. Prepending # `eval` re-parses the joined args as a fresh shell command, which # restores quote and `&&` handling. - script: "eval sed -i 's|26.10.0-SNAPSHOT|26.08.0-SNAPSHOT|' java/pom.xml && GITHUB_REF=refs/tags/v26.08.00 ci/build_java.sh" + script: "eval sed -i 's|26.10.0-SNAPSHOT|26.08.01-SNAPSHOT|' java/pom.xml && GITHUB_REF=refs/tags/v26.08.01 ci/build_java.sh" file_to_upload: output_jars artifact-name: cudf_java_${{ matrix.ARCH }}_cu${{ matrix.CUDA_MAJOR }} # Assemble the per-classifier JARs into one Maven-repository layout. From 29c868070904608b922a3706879303f493ca93cb Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:59:43 +0000 Subject: [PATCH 4/7] Revert "TEMPORARY: CI release validation test" This reverts commit e7746fe3787191b6e569497fcd87928bc8310fdc. --- .github/workflows/pr.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index 637a0053820a..b45400b98862 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -69,12 +69,12 @@ jobs: node_type: cpu16 container_image: "rapidsai/ci-wheel:26.10-cuda${{ matrix.CUDA_VER }}-${{ matrix.LINUX_VER }}-py${{ matrix.PY_VER }}" # TEMP: 26.08 release rehearsal - rewrite pom version and force - # release-tag path via GITHUB_REF so packaged artifacts are 26.08.01. + # release-tag path via GITHUB_REF so packaged artifacts are 26.08.0. # `custom-job.yaml` expands `$INPUTS_SCRIPT` unquoted, so quotes / # operators inside the value are literal on first pass. Prepending # `eval` re-parses the joined args as a fresh shell command, which # restores quote and `&&` handling. - script: "eval sed -i 's|26.10.0-SNAPSHOT|26.08.01-SNAPSHOT|' java/pom.xml && GITHUB_REF=refs/tags/v26.08.01 ci/build_java.sh" + script: "eval sed -i 's|26.10.0-SNAPSHOT|26.08.0-SNAPSHOT|' java/pom.xml && GITHUB_REF=refs/tags/v26.08.00 ci/build_java.sh" file_to_upload: output_jars artifact-name: cudf_java_${{ matrix.ARCH }}_cu${{ matrix.CUDA_MAJOR }} # Assemble the per-classifier JARs into one Maven-repository layout. From 88feafb227e8fb97e28bcf00579e721975f9a71e Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Thu, 20 Aug 2026 18:59:55 +0000 Subject: [PATCH 5/7] Revert "TEMPORARY: CI release validation test" This reverts commit db9647421383a13869176e054bd526e9d668d080. --- .github/workflows/pr.yaml | 989 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 938 insertions(+), 51 deletions(-) diff --git a/.github/workflows/pr.yaml b/.github/workflows/pr.yaml index b45400b98862..27195b379a61 100644 --- a/.github/workflows/pr.yaml +++ b/.github/workflows/pr.yaml @@ -1,6 +1,3 @@ -# TEMP: pr.yaml slimmed to the Java Maven Central publish path for a -# 26.08 release-candidate rehearsal on a PR. All other jobs were removed -# for this test run and must be restored before merge. name: pr on: push: @@ -14,12 +11,44 @@ jobs: # Please keep pr-builder as the top job here pr-builder: needs: - - telemetry-setup - build-details + - check-nightly-ci + - changed-files + - checks + - cmake-tests + - conda-cpp-build + - cpp-linters + - conda-cpp-checks + - conda-cpp-tests + - conda-python-build + - conda-python-build-noarch + - conda-python-cudf-tests + - conda-python-other-tests + - conda-java-tests - java-build-matrix - java-build - - java-gather - - java-publish + - java-tests + - conda-notebook-tests + - docs-build + - publish-api-docs + - wheel-build-libcudf + - wheel-build-libcudf-streaming + - wheel-build-cudf-streaming + - wheel-tests-cudf-streaming + - wheel-build-pylibcudf + - wheel-build-cudf + - wheel-tests-cudf + - wheel-build-cudf-polars + - wheel-tests-cudf-polars + - cudf-polars-polars-tests + - wheel-build-dask-cudf + - wheel-tests-dask-cudf + - devcontainer + - unit-tests-cudf-pandas + - pandas-tests + - narwhals-tests + - telemetry-setup + - third-party-integration-tests-cudf-pandas uses: rapidsai/shared-workflows/.github/workflows/pr-builder.yaml@main permissions: contents: read @@ -39,9 +68,470 @@ jobs: uses: rapidsai/shared-actions/telemetry-dispatch-stash-base-env-vars@main build-details: uses: rapidsai/shared-workflows/.github/workflows/compute-build-details.yaml@main - # Build the cuDF Java JAR for every Maven classifier. + check-nightly-ci: + runs-on: ubuntu-latest + permissions: + actions: read + id-token: write + env: + GH_TOKEN: ${{ github.token }} + steps: + - name: Get PR Info + id: get-pr-info + uses: nv-gha-runners/get-pr-info@090577647b8ddc4e06e809e264f7881650ecdccf # main + - name: Check if nightly CI is passing + uses: rapidsai/shared-actions/check_nightly_success/dispatch@main + with: + repo: ${{ github.repository }} + target-branch: ${{ fromJSON(steps.get-pr-info.outputs.pr-info).base.ref }} + max-days-without-success: 14 + changed-files: + permissions: + actions: read + contents: read + packages: read + pull-requests: read + needs: telemetry-setup + uses: rapidsai/shared-workflows/.github/workflows/changed-files.yaml@main + with: + files_yaml: | + build_docs: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.clang-format' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!ci/build_wheel*.sh' + - '!ci/check_style.sh' + - '!ci/discover_libcudf_tests.sh' + - '!ci/release/update-version.sh' + - '!ci/run_*.sh' + - '!ci/test_*.sh' + - '!ci/validate_wheel.sh' + - '!codecov.yml' + - '!SECURITY.md' + test_cpp: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!CONTRIBUTING.md' + - '!README.md' + - '!SECURITY.md' + - '!ci/cudf_pandas_scripts/**' + - '!ci/build_docs.sh' + - '!ci/build_python*.sh' + - '!ci/build_wheel*.sh' + - '!ci/check_style.sh' + - '!ci/cudf_pandas_scripts/**' + - '!ci/release/update-version.sh' + - '!ci/test_python*.sh' + - '!ci/test_wheel*.sh' + - '!ci/validate_wheel.sh' + - '!docs/**' + - '!img/**' + - '!java/**' + - '!notebooks/**' + - '!python/**' + test_cudf_pandas: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.clang-format' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!CONTRIBUTING.md' + - '!README.md' + - '!SECURITY.md' + - '!ci/release/update-version.sh' + - '!ci/test_java.sh' + - '!ci/validate_wheel.sh' + - '!docs/**' + - '!img/**' + - '!java/**' + - '!notebooks/**' + test_java: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.clang-format' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!CONTRIBUTING.md' + - '!README.md' + - '!SECURITY.md' + - '!ci/build_docs.sh' + - '!ci/build_wheel*.sh' + - '!ci/check_style.sh' + - '!ci/cudf_pandas_scripts/**' + - '!ci/release/update-version.sh' + - '!ci/test_wheel*.sh' + - '!ci/validate_wheel.sh' + - '!ci/release/update-version.sh' + - '!codecov.yml' + - '!docs/**' + - '!img/**' + - '!notebooks/**' + - '!python/**' + test_notebooks: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.clang-format' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!CONTRIBUTING.md' + - '!README.md' + - '!SECURITY.md' + - '!ci/build_wheel*.sh' + - '!ci/cudf_pandas_scripts/**' + - '!ci/release/update-version.sh' + - '!ci/test_wheel*.sh' + - '!ci/validate_wheel.sh' + - '!codecov.yml' + - '!java/**' + test_python_conda: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.clang-format' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!CONTRIBUTING.md' + - '!README.md' + - '!SECURITY.md' + - '!ci/build_docs.sh' + - '!ci/build_wheel*.sh' + - '!ci/check_style.sh' + - '!ci/cudf_pandas_scripts/**' + - '!ci/release/update-version.sh' + - '!ci/test_java.sh' + - '!ci/test_wheel*.sh' + - '!ci/validate_wheel.sh' + - '!docs/**' + - '!img/**' + - '!java/**' + - '!notebooks/**' + test_python_wheels: + - '**' + - '!**/REVIEW_GUIDELINES.md' + - '!.coderabbit.yaml' + - '!.clang-format' + - '!.devcontainer/**' + - '!.github/CODEOWNERS' + - '!.github/ISSUE_TEMPLATE/**' + - '!.github/PULL_REQUEST_TEMPLATE.md' + - '!.github/copy-pr-bot.yaml' + - '!.github/labeler.yml' + - '!.github/ops-bot.yaml' + - '!.github/release.yml' + - '!.github/workflows/auto-assign.yml' + - '!.github/workflows/build.yaml' + - '!.github/workflows/issue-release-scheduled.yml' + - '!.github/workflows/labeler.yml' + - '!.github/workflows/pr_issue_status_automation.yml' + - '!.github/workflows/test.yaml' + - '!.github/workflows/trigger-breaking-change-alert.yaml' + - '!.pre-commit-config.yaml' + - '!.yamllint.yaml' + - '!CONTRIBUTING.md' + - '!README.md' + - '!SECURITY.md' + - '!ci/build_cpp.sh' + - '!ci/build_docs.sh' + - '!ci/build_python_noarch.sh' + - '!ci/build_python.sh' + - '!ci/check-style.sh' + - '!ci/cudf_pandas_scripts/**' + - '!ci/release/update-version.sh' + - '!ci/test_cpp.sh' + - '!ci/test_cpp_common.sh' + - '!ci/test_cpp_memcheck.sh' + - '!ci/test_java.sh' + - '!ci/test_notebooks.sh' + - '!ci/test_python_common.sh' + - '!ci/test_python_cudf.sh' + - '!ci/test_python_other.sh' + - '!codecov.yml' + - '!conda/**' + - '!docs/**' + - '!img/**' + - '!java/**' + - '!notebooks/**' + not_cudf_polars: + - '**' + - '!python/cudf_polars/**' + neither_cudf_polars_nor_dask_cudf: + - '**' + - '!python/cudf_polars/**' + - '!python/dask_cudf/**' + neither_cudf_nor_dask_cudf: + - '**' + - '!python/cudf/**' + - '!python/dask_cudf/**' + neither_cpp_nor_cudf_polars_nor_dask_cudf: + - '**' + - '!cpp/**' + - '!python/cudf_polars/**' + - '!python/dask_cudf/**' + checks: + permissions: + contents: read + needs: telemetry-setup + uses: rapidsai/shared-workflows/.github/workflows/checks.yaml@main + with: + enable_check_generated_files: false + ignored_pr_jobs: "telemetry-summarize spark-rapids-jni cuml-compat-tests" + conda-cpp-build: + needs: [build-details, checks] + 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@main + with: + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu16 + script: ci/build_cpp.sh + cmake-tests: + needs: checks + 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@main + with: + build_type: pull-request + node_type: cpu16 + arch: "amd64" + container_image: "rapidsai/ci-conda:26.10-latest" + script: "ci/test_cmake.sh" + cpp-linters: + permissions: + actions: read + contents: read + id-token: write + packages: read + pull-requests: read + secrets: inherit # zizmor: ignore[secrets-inherit] + needs: checks + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main + with: + build_type: pull-request + script: "ci/cpp_linters.sh" + conda-cpp-checks: + needs: conda-cpp-build + permissions: + actions: read + contents: read + id-token: write + packages: read + pull-requests: read + uses: rapidsai/shared-workflows/.github/workflows/conda-cpp-post-build-checks.yaml@main + with: + build_type: pull-request + package_name: libcudf + conda-cpp-tests: + needs: [conda-cpp-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/conda-cpp-tests.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_cpp + with: + build_type: pull-request + script: ci/test_cpp.sh + # https://github.com/NVIDIA/cudf/issues/23498 + matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) + conda-python-build: + needs: [build-details, conda-cpp-build] + 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@main + with: + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + script: ci/build_python.sh + # Build a conda package for each CUDA x ARCH x minimum supported Python version + matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) + conda-python-build-noarch: + needs: [build-details, conda-cpp-build, conda-python-build] + 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@main + with: + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + script: ci/build_python_noarch.sh + pure-conda: cuda_major + conda-python-cudf-tests: + needs: [conda-python-build, conda-python-build-noarch, 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/conda-python-tests.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_polars_nor_dask_cudf + with: + build_type: pull-request + script: "ci/test_python_cudf.sh" + # https://github.com/NVIDIA/cudf/issues/23498 + matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) + conda-python-other-tests: + # Tests for dask_cudf, cudf_polars, custreamz, cudf_kafka are separated for CI parallelism + needs: [conda-python-build-noarch, 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/conda-python-tests.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda + with: + build_type: pull-request + # https://github.com/NVIDIA/cudf/pull/22381/changes#r3196736965 + container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" + script: "ci/test_python_other.sh" + # https://github.com/NVIDIA/cudf/issues/23498 + matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) + conda-java-tests: + needs: [conda-cpp-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@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_java + with: + build_type: pull-request + node_type: "gpu-l4-latest-1" + arch: "amd64" + container_image: "rapidsai/ci-conda:26.10-latest" + script: "ci/test_java.sh" + # Build and test the cuDF Java JAR for every Maven classifier. java-build-matrix: - needs: [telemetry-setup] + needs: [checks] permissions: contents: read uses: rapidsai/shared-workflows/.github/workflows/compute-matrix.yaml@main @@ -50,7 +540,7 @@ jobs: matrix_name: conda-cpp-build matrix_filter: 'map(. + {CUDA_MAJOR: (.CUDA_VER | split(".") | .[0])})' java-build: - needs: [build-details, telemetry-setup, java-build-matrix] + needs: [build-details, java-build-matrix, changed-files] permissions: actions: read contents: read @@ -59,6 +549,7 @@ jobs: pull-requests: read secrets: inherit # zizmor: ignore[secrets-inherit] uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_java strategy: fail-fast: false matrix: ${{ fromJSON(needs.java-build-matrix.outputs.matrix) }} @@ -68,60 +559,456 @@ jobs: arch: ${{ matrix.ARCH }} node_type: cpu16 container_image: "rapidsai/ci-wheel:26.10-cuda${{ matrix.CUDA_VER }}-${{ matrix.LINUX_VER }}-py${{ matrix.PY_VER }}" - # TEMP: 26.08 release rehearsal - rewrite pom version and force - # release-tag path via GITHUB_REF so packaged artifacts are 26.08.0. - # `custom-job.yaml` expands `$INPUTS_SCRIPT` unquoted, so quotes / - # operators inside the value are literal on first pass. Prepending - # `eval` re-parses the joined args as a fresh shell command, which - # restores quote and `&&` handling. - script: "eval sed -i 's|26.10.0-SNAPSHOT|26.08.0-SNAPSHOT|' java/pom.xml && GITHUB_REF=refs/tags/v26.08.00 ci/build_java.sh" + script: "ci/build_java.sh" file_to_upload: output_jars artifact-name: cudf_java_${{ matrix.ARCH }}_cu${{ matrix.CUDA_MAJOR }} - # Assemble the per-classifier JARs into one Maven-repository layout. - java-gather: - needs: [java-build] - runs-on: linux-amd64-cpu4 + java-tests: + needs: [java-build, java-build-matrix] + if: ${{ !cancelled() && needs.java-build.result == 'success' }} permissions: + actions: read contents: read + packages: read + strategy: + fail-fast: false + matrix: ${{ fromJSON(needs.java-build-matrix.outputs.matrix) }} + runs-on: linux-${{ matrix.ARCH }}-gpu-l4-latest-1 + container: + image: rapidsai/ci-wheel:26.10-cuda${{ matrix.CUDA_VER }}-${{ matrix.LINUX_VER }}-py${{ matrix.PY_VER }} # zizmor: ignore[unpinned-images] + env: + NVIDIA_VISIBLE_DEVICES: ${{ env.NVIDIA_VISIBLE_DEVICES }} + defaults: + run: + shell: bash steps: - - name: Checkout code repo + - name: Checkout uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4.3.1 with: - ref: ${{ github.sha }} persist-credentials: false - - name: Download per-entry JAR artifacts + - name: Download java-build artifact uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: - pattern: cudf_java_* - path: ${{ runner.temp }}/jars - merge-multiple: true - - name: Assemble Maven repository layout + name: cudf_java_${{ matrix.ARCH }}_cu${{ matrix.CUDA_MAJOR }} + path: java_pkg + - name: Run Java tests + env: + LIBCUDF_LARGE_STRINGS_ENABLED: "0" run: | - ./java/ci/assemble_maven_repo.sh \ - --jars-dir "${RUNNER_TEMP}/jars" \ - --output-dir "${RUNNER_TEMP}/maven-repo" - - name: Upload combined Maven repository artifact - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 - with: - name: cudf_java_maven_repo - path: ${{ runner.temp }}/maven-repo - if-no-files-found: error - - # TEMP: 26.08 rehearsal - validate against Sonatype only, do not stage. - # The tag/build_type gate from build.yaml is removed so this runs on PR. - java-publish: - needs: [java-gather] + . java/ci/java_classifier.sh + JAVA_JAR="$(cudf_java_resolve_artifact_jar java_pkg)" + export JAVA_JAR + ci/test_packaged_java.sh + conda-notebook-tests: + needs: [conda-python-build, conda-python-build-noarch, 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@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_notebooks + with: + build_type: pull-request + node_type: "gpu-l4-latest-1" + arch: "amd64" + container_image: "rapidsai/ci-conda:26.10-latest" + script: "ci/test_notebooks.sh" + docs-build: + needs: [conda-python-build, conda-python-build-noarch, changed-files] permissions: actions: read contents: read - uses: rapidsai/shared-workflows/.github/workflows/maven-publish.yaml@main + id-token: write + packages: read + pull-requests: read + secrets: inherit # zizmor: ignore[secrets-inherit] + uses: rapidsai/shared-workflows/.github/workflows/custom-job.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).build_docs + with: + build_type: pull-request + node_type: "gpu-l4-latest-1" + arch: "amd64" + container_image: "rapidsai/ci-conda:26.10-latest" + script: "ci/build_docs.sh" + publish-api-docs: + needs: [docs-build] + permissions: + contents: read + id-token: write secrets: - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - MAVEN_DEPLOY_TOKEN: ${{ secrets.MAVEN_DEPLOY_TOKEN }} - with: - publication-type: 'rc' - artifact-name: cudf_java_maven_repo - source-git-sha: ${{ github.sha }} - # false = validate + drop (safe). true = stage PENDING for manual publish. - stage-for-maven-central-publish: false + akamai-access-token: ${{ secrets.NVIDIA_DOCS_AKAMAI_ACCESS_TOKEN }} + akamai-client-token: ${{ secrets.NVIDIA_DOCS_AKAMAI_CLIENT_TOKEN }} + akamai-client-secret: ${{ secrets.NVIDIA_DOCS_AKAMAI_CLIENT_SECRET }} + akamai-emails-to-notify: ${{ secrets.NVIDIA_DOCS_AKAMAI_EMAILS_TO_NOTIFY }} + akamai-host: ${{ secrets.NVIDIA_DOCS_AKAMAI_HOST }} + target-aws-access-key-id: ${{ secrets.NVIDIA_DOCS_AWS_ACCESS_KEY_ID }} + target-aws-region: ${{ secrets.NVIDIA_DOCS_AWS_REGION }} + target-aws-secret-access-key: ${{ secrets.NVIDIA_DOCS_AWS_SECRET_ACCESS_KEY }} + target-s3-bucket: ${{ secrets.NVIDIA_DOCS_S3_BUCKET }} + uses: rapidsai/shared-workflows/.github/workflows/publish-api-docs.yaml@main + with: + docs-projects: cudf,libcudf + dry-run: true + version-map: '{"26.04": "legacy", "26.06": "stable"}' + wheel-build-libcudf: + needs: [build-details, checks] + 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@main + with: + # build for every combination of arch and CUDA version, but only for the latest Python + matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu16 + script: "ci/build_wheel_libcudf.sh" + package-name: libcudf + package-type: cpp + wheel-build-libcudf-streaming: + needs: [build-details, checks, wheel-build-libcudf] + 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@main + with: + # build for every combination of arch and CUDA version, but only for the latest Python + matrix_filter: group_by([.ARCH, (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by(.PY_VER|split(".")|map(tonumber))) + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu16 + script: "ci/build_wheel_libcudf_streaming.sh" + package-name: libcudf_streaming + package-type: cpp + wheel-build-cudf-streaming: + needs: [build-details, checks, wheel-build-libcudf-streaming, wheel-build-pylibcudf] + 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@main + with: + # Build a wheel for each CUDA x ARCH x minimum supported Python version + matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu16 + script: "ci/build_wheel_cudf_streaming.sh" + package-name: cudf_streaming + package-type: python + wheel-tests-cudf-streaming: + needs: [wheel-build-cudf-streaming, 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/wheels-test.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels + with: + build_type: pull-request + script: ci/test_wheel_cudf_streaming.sh + # https://github.com/NVIDIA/cudf/issues/23498 + matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) + wheel-build-pylibcudf: + needs: [build-details, checks, wheel-build-libcudf] + 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@main + with: + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu8 + script: "ci/build_wheel_pylibcudf.sh" + package-name: pylibcudf + package-type: python + # Build a wheel for each CUDA x ARCH x minimum supported Python version + matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) + wheel-build-cudf: + needs: [build-details, wheel-build-pylibcudf] + 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@main + with: + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu8 + script: "ci/build_wheel_cudf.sh" + package-name: cudf + package-type: python + # Build a wheel for each CUDA x ARCH x minimum supported Python version + matrix_filter: group_by({CUDA_VER, ARCH}) | map(min_by(.PY_VER | split(".") | map(tonumber))) + wheel-tests-cudf: + needs: [wheel-build-cudf, 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/wheels-test.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_polars_nor_dask_cudf + with: + build_type: pull-request + script: ci/test_wheel_cudf.sh + # https://github.com/NVIDIA/cudf/issues/23498 + matrix_filter: map(select(.GPU != "gb300" and .GPU != "gh200")) + wheel-build-cudf-polars: + needs: [build-details, wheel-build-pylibcudf] + 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@main + with: + # This selects "ARCH=amd64 + the latest supported Python + CUDA". + matrix_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))])) + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu8 + script: "ci/build_wheel_cudf_polars.sh" + package-name: cudf_polars + package-type: python + pure-wheel: true + wheel-tests-cudf-polars: + needs: [wheel-build-cudf-polars, wheel-build-cudf-streaming, 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/wheels-test.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_nor_dask_cudf + with: + # This selects "ARCH=amd64 + the latest supported Python + CUDA". + matrix_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))])) + build_type: pull-request + container-options: "--cap-add CAP_SYS_PTRACE --shm-size=8g --ulimit=nofile=1000000:1000000" + script: "env POLARS_VERSIONS=endpoints ci/test_wheel_cudf_polars.sh" + cudf-polars-polars-tests: + needs: [wheel-build-cudf-polars, wheel-build-cudf-streaming, 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/wheels-test.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_nor_dask_cudf + with: + # This selects "ARCH=amd64 + the latest supported Python + CUDA". + matrix_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))])) + build_type: pull-request + script: "ci/test_cudf_polars_polars_tests.sh" + wheel-build-dask-cudf: + needs: [build-details, wheel-build-cudf] + 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@main + with: + # This selects "ARCH=amd64 + the latest supported Python + CUDA". + matrix_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))])) + build_type: pull-request + build-datetime: ${{ needs.build-details.outputs.build-datetime }} + node_type: cpu8 + script: "ci/build_wheel_dask_cudf.sh" + package-name: dask_cudf + package-type: python + pure-wheel: true + wheel-tests-dask-cudf: + needs: [wheel-build-dask-cudf, 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/wheels-test.yaml@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).not_cudf_polars + with: + # This selects "ARCH=amd64 + the latest supported Python + CUDA". + matrix_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))])) + build_type: pull-request + script: ci/test_wheel_dask_cudf.sh + # build cudf with benchmarks but disable for cudf_streaming since we can't use MPI/UCX in wheel-based builds + devcontainer: + permissions: + actions: read + contents: read + id-token: write + packages: read + pull-requests: read + secrets: inherit # zizmor: ignore[secrets-inherit] + needs: telemetry-setup + uses: rapidsai/shared-workflows/.github/workflows/build-in-devcontainer.yaml@main + with: + arch: '["amd64", "arm64"]' + cuda: '["13.3"]' + node_type: "cpu8" + timeout-minutes: 90 + env: | + SCCACHE_DIST_MAX_RETRIES=inf + SCCACHE_SERVER_LOG=sccache=debug + SCCACHE_DIST_FALLBACK_TO_LOCAL_COMPILE=false + build_command: | + sccache --zero-stats; + build-all -j0 --verbose -DBUILD_BENCHMARKS=ON 2>&1 | tee telemetry-artifacts/build.log; + sccache --show-adv-stats | tee telemetry-artifacts/sccache-stats.txt; + unit-tests-cudf-pandas: + needs: [wheel-build-cudf, 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/wheels-test.yaml@main + if: (fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels || fromJSON(needs.changed-files.outputs.changed_file_groups).test_cudf_pandas) && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cudf_polars_nor_dask_cudf + with: + # This selects the latest supported Python + CUDA minor versions for each ARCH/CUDA major version combo + # Filter out GB300 due to https://github.com/NVIDIA/cudf/issues/23498 + matrix_filter: group_by([(.ARCH), (.CUDA_VER|split(".")|map(tonumber)|.[0])]) | map(max_by([(.PY_VER|split(".")|map(tonumber)), (.CUDA_VER|split(".")|map(tonumber))])) | map(select(.GPU != "gb300" and .GPU != "gh200")) + build_type: pull-request + script: ci/cudf_pandas_scripts/run_tests.sh + third-party-integration-tests-cudf-pandas: + needs: [conda-python-build, conda-python-build-noarch, 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@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf + with: + build_type: pull-request + branch: ${{ inputs.branch }} + date: ${{ inputs.date }} + sha: ${{ inputs.sha }} + node_type: "gpu-l4-latest-1" + continue-on-error: true + container_image: "rapidsai/ci-conda:26.10-latest" + script: | + ci/cudf_pandas_scripts/third-party-integration/test.sh python/cudf/cudf_pandas_tests/third_party_integration_tests/dependencies.yaml + cuml-compat-tests: + needs: [conda-python-build, conda-python-build-noarch, 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@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf + with: + build_type: pull-request + branch: ${{ inputs.branch }} + date: ${{ inputs.date }} + sha: ${{ inputs.sha }} + node_type: "gpu-l4-latest-1" + continue-on-error: true + container_image: "rapidsai/ci-conda:26.10-latest" + script: "ci/test_cuml_compat.sh" + pandas-tests: + # run the Pandas unit tests using PR branch + needs: [wheel-build-cudf, 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@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_wheels && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf + with: + build_type: pull-request + branch: ${{ inputs.branch }} + date: ${{ inputs.date }} + sha: ${{ inputs.sha }} + node_type: "gpu-l4-latest-1" + container_image: "rapidsai/citestwheel:26.10-latest" + script: ci/cudf_pandas_scripts/pandas-tests/run.sh pr + narwhals-tests: + needs: [conda-python-build, conda-python-build-noarch, 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@main + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_python_conda && fromJSON(needs.changed-files.outputs.changed_file_groups).neither_cpp_nor_cudf_polars_nor_dask_cudf + with: + build_type: pull-request + branch: ${{ inputs.branch }} + date: ${{ inputs.date }} + sha: ${{ inputs.sha }} + node_type: "gpu-l4-latest-1" + container_image: "rapidsai/ci-conda:26.10-latest" + script: ci/test_narwhals.sh + spark-rapids-jni: + needs: changed-files + permissions: + actions: read + contents: read + id-token: write + packages: read + pull-requests: read + uses: ./.github/workflows/spark-rapids-jni.yaml + if: fromJSON(needs.changed-files.outputs.changed_file_groups).test_java + telemetry-summarize: + # This job must use a self-hosted runner to record telemetry traces. + runs-on: linux-amd64-cpu4 + permissions: + actions: write + needs: pr-builder + if: ${{ vars.TELEMETRY_ENABLED == 'true' && !cancelled() }} + continue-on-error: true + steps: + - name: Telemetry summarize + uses: rapidsai/shared-actions/telemetry-dispatch-summarize@main + env: + GH_TOKEN: ${{ github.token }} From 06dc96e201e38d5bae2b68d3be45734235101b62 Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Thu, 20 Aug 2026 19:47:17 +0000 Subject: [PATCH 6/7] Address CodeRabbit comments --- java/ci/README.md | 4 ++-- java/ci/build_cudf_java_jar_in_container.sh | 11 ++++++++--- java/ci/build_static_libcudf_in_container.sh | 6 +++++- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/java/ci/README.md b/java/ci/README.md index 04328c0541b2..43dd9aa04e0e 100644 --- a/java/ci/README.md +++ b/java/ci/README.md @@ -48,7 +48,7 @@ the classifier JAR (e.g. `cudf-26.10.0-SNAPSHOT-cuda12.jar`), a classifier-independent sources jar and javadoc jar, and the POM into a classifier-named subdirectory under `--output-dir`: -``` +```text /tmp/jars/cuda12/ cudf-26.10.0-SNAPSHOT-cuda12.jar cudf-26.10.0-SNAPSHOT.pom @@ -78,7 +78,7 @@ as a copy of the `cuda12` classifier. Derives the artifact version from the JAR filenames (requiring a single unique version across subdirs) and lays them out as: -``` +```text /tmp/maven-repo/ai/rapids/cudf/-SNAPSHOT/ cudf--SNAPSHOT.jar cudf--SNAPSHOT-cuda12.jar diff --git a/java/ci/build_cudf_java_jar_in_container.sh b/java/ci/build_cudf_java_jar_in_container.sh index 88e772dc012e..02667fb4c27b 100755 --- a/java/ci/build_cudf_java_jar_in_container.sh +++ b/java/ci/build_cudf_java_jar_in_container.sh @@ -42,10 +42,14 @@ fi POM_WAS_REWRITTEN=0 _cleanup_on_exit() { + local prior_status=$? if [[ ${POM_WAS_REWRITTEN} -eq 1 ]]; then - git -C "${REPO_ROOT}" checkout -- java/pom.xml 2>/dev/null || true + mv -f "${REPO_ROOT}/java/pom.xml.backup" "${REPO_ROOT}/java/pom.xml" fi - chown -R "${HOST_UID}:${HOST_GID}" "${OUTPUT_DIR}" "${REPO_ROOT}/java/target" 2>/dev/null || true + if ! chown -R "${HOST_UID}:${HOST_GID}" "${OUTPUT_DIR}" "${REPO_ROOT}/java/target"; then + echo "Warning: chown -R ${HOST_UID}:${HOST_GID} on ${OUTPUT_DIR} + ${REPO_ROOT}/java/target failed. Outputs may remain owned by root." >&2 + fi + return "${prior_status}" } trap _cleanup_on_exit EXIT @@ -97,8 +101,9 @@ CUDF_VERSION="$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout # restores java/pom.xml after packaging (the rewritten POM is copied to OUTPUT_DIR). if rapids-is-release-build; then CUDF_VERSION="${CUDF_VERSION%-SNAPSHOT}" - mvn versions:set -DnewVersion="${CUDF_VERSION}" -DgenerateBackupPoms=false "${BUILD_ARG[@]}" + cp -p "${REPO_ROOT}/java/pom.xml" "${REPO_ROOT}/java/pom.xml.backup" POM_WAS_REWRITTEN=1 + mvn versions:set -DnewVersion="${CUDF_VERSION}" -DgenerateBackupPoms=false "${BUILD_ARG[@]}" fi rapids-logger "Packaging cuDF Java JAR ${CUDF_VERSION}" diff --git a/java/ci/build_static_libcudf_in_container.sh b/java/ci/build_static_libcudf_in_container.sh index b0a3251261d0..37b015ab7245 100755 --- a/java/ci/build_static_libcudf_in_container.sh +++ b/java/ci/build_static_libcudf_in_container.sh @@ -40,7 +40,11 @@ if [[ -z ${HOST_UID} || -z ${HOST_GID} ]]; then fi _cleanup_on_exit() { - chown -R "${HOST_UID}:${HOST_GID}" "${INSTALL_PREFIX}" 2>/dev/null || true + local prior_status=$? + if ! chown -R "${HOST_UID}:${HOST_GID}" "${INSTALL_PREFIX}"; then + echo "Warning: chown -R ${HOST_UID}:${HOST_GID} on ${INSTALL_PREFIX} failed. Outputs may remain owned by root." >&2 + fi + return "${prior_status}" } trap _cleanup_on_exit EXIT From c3f3705669adba943c3123f5c5dd2bba632693e0 Mon Sep 17 00:00:00 2001 From: Paul Aiyedun <53453937+paul-aiyedun@users.noreply.github.com> Date: Thu, 20 Aug 2026 20:14:55 +0000 Subject: [PATCH 7/7] Add mv error handling and update README --- java/ci/README.md | 7 ++++--- java/ci/build_cudf_java_jar_in_container.sh | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/java/ci/README.md b/java/ci/README.md index 43dd9aa04e0e..df2105a854f6 100644 --- a/java/ci/README.md +++ b/java/ci/README.md @@ -59,9 +59,10 @@ The classifier is derived from `--cuda-version` (major) + host arch (`uname `aarch64`. Producing the ARM classifiers requires a real `aarch64` host. Repeat Step 2 for each classifier, pointing `--libcudf-dir` at the matching static libcudf tree and using the same `--output-dir` (each classifier lands -in its own subdirectory). Concurrent invocations for different classifiers -are safe because each nests its own bind-mount over `/repo/java/target` -inside the container. +in its own subdirectory). Concurrent SNAPSHOT invocations for different +classifiers are safe because each nests its own bind-mount over +`/repo/java/target` inside the container. Release builds rewrite the shared +`java/pom.xml` and must not overlap. ### Step 3 - Assemble the Maven repository layout diff --git a/java/ci/build_cudf_java_jar_in_container.sh b/java/ci/build_cudf_java_jar_in_container.sh index 02667fb4c27b..7bf183725499 100755 --- a/java/ci/build_cudf_java_jar_in_container.sh +++ b/java/ci/build_cudf_java_jar_in_container.sh @@ -44,7 +44,9 @@ POM_WAS_REWRITTEN=0 _cleanup_on_exit() { local prior_status=$? if [[ ${POM_WAS_REWRITTEN} -eq 1 ]]; then - mv -f "${REPO_ROOT}/java/pom.xml.backup" "${REPO_ROOT}/java/pom.xml" + if ! mv -f "${REPO_ROOT}/java/pom.xml.backup" "${REPO_ROOT}/java/pom.xml"; then + echo "Warning: failed to restore ${REPO_ROOT}/java/pom.xml from pom.xml.backup" >&2 + fi fi if ! chown -R "${HOST_UID}:${HOST_GID}" "${OUTPUT_DIR}" "${REPO_ROOT}/java/target"; then echo "Warning: chown -R ${HOST_UID}:${HOST_GID} on ${OUTPUT_DIR} + ${REPO_ROOT}/java/target failed. Outputs may remain owned by root." >&2