From 047a452022b1485e51b9aa17f4b573cac46b63a4 Mon Sep 17 00:00:00 2001 From: ChrisRackauckas-Claude Date: Wed, 18 Mar 2026 15:00:12 -0400 Subject: [PATCH] Replace Buildkite CI with GitHub Actions self-hosted runners Migrate CUDA GPU tests and documentation builds from Buildkite to GitHub Actions using self-hosted runners with the `gpu` label (Tesla T4 on arctic1). - Add .github/workflows/GPU.yml with CUDA tests (60min) and docs build (240min) - Delete .buildkite/ directory (pipeline.yml, testing.yml, documentation.yml, scripts/) Part of the SciML-wide migration from Buildkite to GitHub Actions self-hosted runners. See https://github.com/ChrisRackauckas/InternalJunk/issues/16 for runner infrastructure details. Co-Authored-By: Chris Rackauckas Co-Authored-By: Claude Opus 4.6 (1M context) --- .buildkite/documentation.yml | 30 ----------- .buildkite/pipeline.yml | 40 -------------- .buildkite/scripts/diff.sh | 13 ----- .buildkite/scripts/find_branch_point.sh | 6 --- .buildkite/testing.yml | 49 ----------------- .github/workflows/GPU.yml | 70 +++++++++++++++++++++++++ 6 files changed, 70 insertions(+), 138 deletions(-) delete mode 100644 .buildkite/documentation.yml delete mode 100644 .buildkite/pipeline.yml delete mode 100755 .buildkite/scripts/diff.sh delete mode 100755 .buildkite/scripts/find_branch_point.sh delete mode 100644 .buildkite/testing.yml create mode 100644 .github/workflows/GPU.yml diff --git a/.buildkite/documentation.yml b/.buildkite/documentation.yml deleted file mode 100644 index f59ff3a..0000000 --- a/.buildkite/documentation.yml +++ /dev/null @@ -1,30 +0,0 @@ -steps: - - label: ":julia: Documentation" - plugins: - - JuliaCI/julia#v1: - version: "1" - - JuliaCI/julia-coverage#v1: - codecov: true - command: | - julia --project -e ' - println("--- :julia: Instantiating project") - using Pkg - Pkg.instantiate() - Pkg.activate("docs") - Pkg.instantiate() - push!(LOAD_PATH, @__DIR__) - - println("+++ :julia: Building documentation") - include("docs/make.jl")' - agents: - queue: "juliagpu" - cuda: "*" - if: build.message !~ /\[skip docs\]/ && !build.pull_request.draft - timeout_in_minutes: 1000 - -env: - JULIA_DEBUG: "Documenter" - XLA_REACTANT_GPU_MEM_FRACTION: "0.95" - DATADEPS_ALWAYS_ACCEPT: true - SECRET_CODECOV_TOKEN: "vn5M+4wSwUFje6fl6UB/Q/rTmLHu3OlCCMgoPOXPQHYpLZTLz2hOHsV44MadAnxw8MsNVxLKZlXBKqP3IydU9gUfV7QUBtnvbUmIvgUHbr+r0bVaIVVhw6cnd0s8/b+561nU483eRJd35bjYDOlO+V5eDxkbdh/0bzLefXNXy5+ALxsBYzsp75Sx/9nuREfRqWwU6S45mne2ZlwCDpZlFvBDXQ2ICKYXpA45MpxhW9RuqfpQdi6sSR6I/HdHkV2cuJO99dqqh8xfUy6vWPC/+HUVrn9ETsrXtayX1MX3McKj869htGICpR8vqd311HTONYVprH2AN1bJqr5MOIZ8Xg==;U2FsdGVkX1+W55pTI7zq+NwYrbK6Cgqe+Gp8wMCmXY+W10aXTB0bS6zshiDYSQ1Y3piT91xFyNhS+9AsajY0yQ==" - SECRET_DOCUMENTER_KEY: "hnN1QYai+CvEgtp2M9S9ZxK4xBthWAhx8snqR7MIKk3cqG7qHMsTd49KMSYWLXEsrsMbI2N4OLjNE3SgVZwyfuHop6x3ZqwVWD0OtldK6QvL/c+lmpzYMkIRCqKfXOKm9cQTWrr/eKzEh0uEUEdzCH7vrqLP7ywf5F9BMJbRmHW2f4cE1RKiG5cWVtgyO2OyRg7CxYrWgg0eKba+Vh8dLj1xL1Gs1XpLr7TDYRfSo7VMKYdkvB7Os7hmDN04YwzRFvGQBlroBaiC7KgbI5kZcL33R/whCHUYneSsXozGVyJGGGUbdxCaSslJ3p3Vb3vpnn+eAn0GyriWF/TaKIUlpQ==;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" diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml deleted file mode 100644 index e9d3a79..0000000 --- a/.buildkite/pipeline.yml +++ /dev/null @@ -1,40 +0,0 @@ -steps: - - label: "Triggering Pipelines (Pull Request)" - if: build.branch != "main" && build.tag == null - agents: - queue: "juliagpu" - plugins: - - monebag/monorepo-diff#v2.5.9: - diff: ".buildkite/scripts/diff.sh $BUILDKITE_COMMIT" - interpolation: false - watch: - - path: - - "src/" - - "ext/" - - "test/" - - "Project.toml" - - ".buildkite/" - config: - command: "buildkite-agent pipeline upload .buildkite/testing.yml" - agents: - queue: "juliagpu" - - - path: - - "src/" - - "ext/" - - "test/" - - "docs/" - - "Project.toml" - - ".buildkite/" - config: - command: "buildkite-agent pipeline upload .buildkite/documentation.yml" - agents: - queue: "juliagpu" - - - label: "Triggering Pipelines (Main Branch / Tag)" - if: build.branch == "main" || build.tag != null - agents: - queue: "juliagpu" - command: | - buildkite-agent pipeline upload .buildkite/testing.yml - buildkite-agent pipeline upload .buildkite/documentation.yml diff --git a/.buildkite/scripts/diff.sh b/.buildkite/scripts/diff.sh deleted file mode 100755 index b73437f..0000000 --- a/.buildkite/scripts/diff.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -ueo pipefail - -# Script to output the diff where the branch was created -# Usage: ./diff.sh $BUILDKITE_COMMIT - -COMMIT_HASH=$1 -SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) - -BRANCH_POINT_COMMIT=$($SCRIPT_DIR/find_branch_point.sh "$COMMIT_HASH") -echo >&2 "Cannot find latest build. Running diff against: $BRANCH_POINT_COMMIT" -diff=$(git diff --name-only "$BRANCH_POINT_COMMIT") -echo "$diff" diff --git a/.buildkite/scripts/find_branch_point.sh b/.buildkite/scripts/find_branch_point.sh deleted file mode 100755 index f829535..0000000 --- a/.buildkite/scripts/find_branch_point.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -set -ue - -diff -u <(git rev-list --first-parent "$1") \ - <(git rev-list --first-parent main) | \ - sed -ne 's/^ //p' | head -1 diff --git a/.buildkite/testing.yml b/.buildkite/testing.yml deleted file mode 100644 index 3722d64..0000000 --- a/.buildkite/testing.yml +++ /dev/null @@ -1,49 +0,0 @@ -steps: - - label: ":julia: Julia {{matrix.julia}} + CUDA GPU" - plugins: - - JuliaCI/julia#v1: - version: "{{matrix.julia}}" - - JuliaCI/julia-test#v1: - test_args: "--quickfail" - - JuliaCI/julia-coverage#v1: - codecov: true - agents: - queue: "juliagpu" - cuda: "*" - env: - BACKEND_GROUP: "CUDA" - if: build.message !~ /\[skip tests\]/ - timeout_in_minutes: 60 - matrix: - setup: - julia: - - "1" - - # - label: ":julia: Julia: {{matrix.julia}} + AMD GPU" - # plugins: - # - JuliaCI/julia#v1: - # version: "{{matrix.julia}}" - # - JuliaCI/julia-test#v1: - # test_args: "--quickfail" - # - JuliaCI/julia-coverage#v1: - # codecov: true - # env: - # JULIA_AMDGPU_CORE_MUST_LOAD: "1" - # JULIA_AMDGPU_HIP_MUST_LOAD: "1" - # JULIA_AMDGPU_DISABLE_ARTIFACTS: "1" - # BACKEND_GROUP: "AMDGPU" - # agents: - # queue: "juliagpu" - # rocm: "*" - # rocmgpu: "*" - # if: build.message !~ /\[skip tests\]/ - # timeout_in_minutes: 60 - # matrix: - # setup: - # julia: - # - "1" - -env: - RETESTITEMS_NWORKERS: 4 - RETESTITEMS_NWORKER_THREADS: 2 - SECRET_CODECOV_TOKEN: "vn5M+4wSwUFje6fl6UB/Q/rTmLHu3OlCCMgoPOXPQHYpLZTLz2hOHsV44MadAnxw8MsNVxLKZlXBKqP3IydU9gUfV7QUBtnvbUmIvgUHbr+r0bVaIVVhw6cnd0s8/b+561nU483eRJd35bjYDOlO+V5eDxkbdh/0bzLefXNXy5+ALxsBYzsp75Sx/9nuREfRqWwU6S45mne2ZlwCDpZlFvBDXQ2ICKYXpA45MpxhW9RuqfpQdi6sSR6I/HdHkV2cuJO99dqqh8xfUy6vWPC/+HUVrn9ETsrXtayX1MX3McKj869htGICpR8vqd311HTONYVprH2AN1bJqr5MOIZ8Xg==;U2FsdGVkX1+W55pTI7zq+NwYrbK6Cgqe+Gp8wMCmXY+W10aXTB0bS6zshiDYSQ1Y3piT91xFyNhS+9AsajY0yQ==" diff --git a/.github/workflows/GPU.yml b/.github/workflows/GPU.yml new file mode 100644 index 0000000..cacb491 --- /dev/null +++ b/.github/workflows/GPU.yml @@ -0,0 +1,70 @@ +name: "GPU Tests" + +on: + pull_request: + branches: + - main + paths: + - "src/**" + - "ext/**" + - "test/**" + - "Project.toml" + - ".github/workflows/GPU.yml" + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ startsWith(github.ref, 'refs/pull/') }} + +jobs: + cuda-tests: + name: "CUDA GPU Tests" + runs-on: [self-hosted, Linux, X64, gpu] + timeout-minutes: 60 + env: + RETESTITEMS_NWORKERS: 4 + RETESTITEMS_NWORKER_THREADS: 2 + steps: + - uses: actions/checkout@v6 + - uses: julia-actions/setup-julia@v2 + with: + version: "1" + - uses: julia-actions/julia-buildpkg@v1 + - uses: julia-actions/julia-runtest@v1 + env: + BACKEND_GROUP: "CUDA" + - uses: julia-actions/julia-processcoverage@v1 + - uses: codecov/codecov-action@v5 + with: + files: lcov.info + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: false + + gpu-docs: + name: "Documentation" + runs-on: [self-hosted, Linux, X64, gpu] + timeout-minutes: 240 + if: github.event_name == 'push' || !github.event.pull_request.draft + steps: + - uses: actions/checkout@v6 + - uses: julia-actions/setup-julia@v2 + with: + version: "1" + - run: | + julia --project -e ' + println("--- Instantiating project") + using Pkg + Pkg.instantiate() + Pkg.activate("docs") + Pkg.instantiate() + push!(LOAD_PATH, @__DIR__) + println("+++ Building documentation") + include("docs/make.jl")' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + DOCUMENTER_KEY: ${{ secrets.DOCUMENTER_KEY }} + DATADEPS_ALWAYS_ACCEPT: true + JULIA_DEBUG: "Documenter" + XLA_REACTANT_GPU_MEM_FRACTION: "0.95"