From 22c9fc075340a121004c98cf1caae9905b62364d Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:05:36 -0400 Subject: [PATCH 01/15] Update CI workflows for WPILib 2027 alpha toolchain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Switch build.yml to wpilib/roborio-cross-ubuntu:2027_alpha5-22.04 (JDK 25) and add required safe.directory git config step. Bump spotless.yml from JDK 17 to JDK 21 — required by google-java-format 1.28.0. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build.yml | 6 ++++-- .github/workflows/spotless.yml | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0010805..7dcd194 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,11 +6,13 @@ on: jobs: build: name: Build - runs-on: ubuntu-latest - container: wpilib/roborio-cross-ubuntu:2024-22.04 + runs-on: ubuntu-22.04 + container: wpilib/roborio-cross-ubuntu:2027_alpha5-22.04 steps: - name: Checkout repository uses: actions/checkout@v4 + - name: Add repository to git safe directories + run: git config --global --add safe.directory $GITHUB_WORKSPACE - name: Grant execute permission run: chmod +x gradlew - name: Build robot code diff --git a/.github/workflows/spotless.yml b/.github/workflows/spotless.yml index 3af5405..8816840 100644 --- a/.github/workflows/spotless.yml +++ b/.github/workflows/spotless.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: 17 + java-version: 21 - name: Change wrapper permissions run: chmod +x ./gradlew - run: ./gradlew spotlessCheck --stacktrace From aacda26b7d0f247078ce7c32384a5017a1053ffb Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:07:47 -0400 Subject: [PATCH 02/15] =?UTF-8?q?Revert=20spotless.yml=20JDK=20bump=20?= =?UTF-8?q?=E2=80=94=2017=20is=20sufficient?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit google-java-format 1.28.0 supports JDK 17; the JDK 25 issue was only with the default bundled version. Spotless CI was passing on 17. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/spotless.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/spotless.yml b/.github/workflows/spotless.yml index 8816840..3af5405 100644 --- a/.github/workflows/spotless.yml +++ b/.github/workflows/spotless.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/setup-java@v4 with: distribution: 'zulu' - java-version: 21 + java-version: 17 - name: Change wrapper permissions run: chmod +x ./gradlew - run: ./gradlew spotlessCheck --stacktrace From 797f1f24000a37d2432baccd30460c579de45cdb Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:09:54 -0400 Subject: [PATCH 03/15] Bump GitHub Actions to v5 for Node.js 24 compatibility actions/checkout and actions/setup-java v4 use Node.js 20, which is removed from runners on September 16, 2026 (forced switch June 16). Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build.yml | 2 +- .github/workflows/spotless.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7dcd194..a4534d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ jobs: container: wpilib/roborio-cross-ubuntu:2027_alpha5-22.04 steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Add repository to git safe directories run: git config --global --add safe.directory $GITHUB_WORKSPACE - name: Grant execute permission diff --git a/.github/workflows/spotless.yml b/.github/workflows/spotless.yml index 3af5405..51de4cb 100644 --- a/.github/workflows/spotless.yml +++ b/.github/workflows/spotless.yml @@ -9,10 +9,10 @@ jobs: # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: fetch-depth: 0 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: distribution: 'zulu' java-version: 17 From f01451d64b9bd642a24c2f8ebc10c99f321ca680 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:12:46 -0400 Subject: [PATCH 04/15] Switch build CI to actions/setup-java JDK 21 (no 2027 container yet) wpilib/roborio-cross-ubuntu has no 2027 alpha image. Since this branch is sim-only (no roboRIO deployment), drop the container and use Temurin JDK 21, which satisfies the minimum required by ReduxLib 2027. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a4534d7..732eb02 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,12 +7,14 @@ jobs: build: name: Build runs-on: ubuntu-22.04 - container: wpilib/roborio-cross-ubuntu:2027_alpha5-22.04 steps: - name: Checkout repository uses: actions/checkout@v5 - - name: Add repository to git safe directories - run: git config --global --add safe.directory $GITHUB_WORKSPACE + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: 21 - name: Grant execute permission run: chmod +x gradlew - name: Build robot code From 29ca91d3c33ecf0900f379c4bad8c474795fc4b3 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:15:10 -0400 Subject: [PATCH 05/15] Switch CI runner to ubuntu-24.04 for GLIBCXX_3.4.31 support WPILib 2027 JNI libs require GLIBCXX_3.4.31 (GCC 13+), which ships with Ubuntu 24.04. Ubuntu 22.04 only provides up to 3.4.30. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 732eb02..0a3af80 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ on: jobs: build: name: Build - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Checkout repository uses: actions/checkout@v5 From 6b1c9706ca592236001d995c21ce022a02ee3b75 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:25:41 -0400 Subject: [PATCH 06/15] Switch build CI to wpilib/systemcore-cross-ubuntu:2027-24.04 container Replaces the bare ubuntu-24.04 runner + setup-java step with the WPILib-provided cross-build container, which bundles the 2027 toolchain. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build.yml | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0a3af80..accb41f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -7,14 +7,10 @@ jobs: build: name: Build runs-on: ubuntu-24.04 + container: wpilib/systemcore-cross-ubuntu:2027-24.04 steps: - name: Checkout repository uses: actions/checkout@v5 - - name: Set up JDK 21 - uses: actions/setup-java@v5 - with: - distribution: 'temurin' - java-version: 21 - name: Grant execute permission run: chmod +x gradlew - name: Build robot code From bb407a4ef3e26fb8c82fb889590568b4be0e2100 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:31:30 -0400 Subject: [PATCH 07/15] Switch runner to ubuntu-latest; container provides the toolchain MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since the job runs inside wpilib/systemcore-cross-ubuntu, the host runner version is irrelevant — ubuntu-latest is sufficient. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index accb41f..5c70502 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,7 +6,7 @@ on: jobs: build: name: Build - runs-on: ubuntu-24.04 + runs-on: ubuntu-latest container: wpilib/systemcore-cross-ubuntu:2027-24.04 steps: - name: Checkout repository From 27f2c276a851db6ad38ad292066f1bce342602dd Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:37:48 -0400 Subject: [PATCH 08/15] Split CI into separate SystemCore and simulation workflows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename build.yml → build-systemcore.yml; switch to minimal container - Add build-simulation.yml using actions/setup-java for host-platform sim build Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 21 +++++++++++++++++++ .../{build.yml => build-systemcore.yml} | 6 +++--- 2 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/build-simulation.yml rename .github/workflows/{build.yml => build-systemcore.yml} (68%) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml new file mode 100644 index 0000000..63d48f0 --- /dev/null +++ b/.github/workflows/build-simulation.yml @@ -0,0 +1,21 @@ +name: Build (Simulation) + +on: + push: + +jobs: + build: + name: Build (Simulation) + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v5 + - name: Set up JDK 21 + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: 21 + - name: Grant execute permission + run: chmod +x gradlew + - name: Build simulation + run: ./gradlew simulateJavaRelease diff --git a/.github/workflows/build.yml b/.github/workflows/build-systemcore.yml similarity index 68% rename from .github/workflows/build.yml rename to .github/workflows/build-systemcore.yml index 5c70502..e284f3c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build-systemcore.yml @@ -1,13 +1,13 @@ -name: Build +name: Build (SystemCore) on: push: jobs: build: - name: Build + name: Build (SystemCore) runs-on: ubuntu-latest - container: wpilib/systemcore-cross-ubuntu:2027-24.04 + container: wpilib/systemcore-cross-ubuntu-minimal:2027-24.04 steps: - name: Checkout repository uses: actions/checkout@v5 From 436ff54c9e34c0c905d7b0ccb849bd9690e52226 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:42:40 -0400 Subject: [PATCH 09/15] Fix simulation CI hanging by adding 30s timeout The sim runs indefinitely; timeout 30 kills it after startup and treat exit code 124 (timeout) as success. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml index 63d48f0..d599b2a 100644 --- a/.github/workflows/build-simulation.yml +++ b/.github/workflows/build-simulation.yml @@ -18,4 +18,4 @@ jobs: - name: Grant execute permission run: chmod +x gradlew - name: Build simulation - run: ./gradlew simulateJavaRelease + run: timeout 30 ./gradlew simulateJavaRelease || test $? -eq 124 From 02ff80dbbd9385f03aab54e17aaf66ecd8e902f1 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:46:40 -0400 Subject: [PATCH 10/15] Fix simulation CI: grep for startup message instead of timeout; add Gradle cache Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml index d599b2a..2b2b7b6 100644 --- a/.github/workflows/build-simulation.yml +++ b/.github/workflows/build-simulation.yml @@ -15,7 +15,8 @@ jobs: with: distribution: temurin java-version: 21 + cache: gradle - name: Grant execute permission run: chmod +x gradlew - name: Build simulation - run: timeout 30 ./gradlew simulateJavaRelease || test $? -eq 124 + run: ./gradlew simulateJavaRelease 2>&1 | grep -m1 "Robot program startup complete" From 1bb56a907c8fc706638c39d9e3d19a5691bd5bc2 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:50:27 -0400 Subject: [PATCH 11/15] Skip spotless in systemcore build; spotless.yml handles formatting Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-systemcore.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-systemcore.yml b/.github/workflows/build-systemcore.yml index e284f3c..28e85e9 100644 --- a/.github/workflows/build-systemcore.yml +++ b/.github/workflows/build-systemcore.yml @@ -14,4 +14,4 @@ jobs: - name: Grant execute permission run: chmod +x gradlew - name: Build robot code - run: ./gradlew build + run: ./gradlew assemble test From 5d4d7b2ff94b8cbbc8f1ef9866b8e86bb36e4ea2 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:54:56 -0400 Subject: [PATCH 12/15] Fix simulation CI hanging: kill process group after startup detected JVM ignores SIGPIPE so the pipe trick alone doesn't terminate it. Run Gradle in background, detect startup via tail+grep, then kill the entire process group. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml index 2b2b7b6..12add3d 100644 --- a/.github/workflows/build-simulation.yml +++ b/.github/workflows/build-simulation.yml @@ -19,4 +19,8 @@ jobs: - name: Grant execute permission run: chmod +x gradlew - name: Build simulation - run: ./gradlew simulateJavaRelease 2>&1 | grep -m1 "Robot program startup complete" + run: | + ./gradlew simulateJavaRelease &>/tmp/sim.log & + GRADLE_PID=$! + tail -f /tmp/sim.log | grep -m1 "Robot program startup complete" + kill -- -$(ps -o pgid= "$GRADLE_PID" | tr -d ' ') 2>/dev/null || kill "$GRADLE_PID" 2>/dev/null || true From 0fac48a85a98fac9279cc8e9411a183489651780 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 12:55:59 -0400 Subject: [PATCH 13/15] Print simulation log to CI output after startup Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml index 12add3d..5432551 100644 --- a/.github/workflows/build-simulation.yml +++ b/.github/workflows/build-simulation.yml @@ -24,3 +24,4 @@ jobs: GRADLE_PID=$! tail -f /tmp/sim.log | grep -m1 "Robot program startup complete" kill -- -$(ps -o pgid= "$GRADLE_PID" | tr -d ' ') 2>/dev/null || kill "$GRADLE_PID" 2>/dev/null || true + cat /tmp/sim.log From 503e59923bcb306fe177b243d3aea85403f5122b Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 13:00:56 -0400 Subject: [PATCH 14/15] Fix simulation CI exit 143: use setsid to isolate Gradle process group setsid gives Gradle its own session/pgid so kill -- -$GRADLE_PID only terminates the sim, not the shell. Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml index 5432551..2186df2 100644 --- a/.github/workflows/build-simulation.yml +++ b/.github/workflows/build-simulation.yml @@ -20,8 +20,8 @@ jobs: run: chmod +x gradlew - name: Build simulation run: | - ./gradlew simulateJavaRelease &>/tmp/sim.log & + setsid ./gradlew simulateJavaRelease &>/tmp/sim.log & GRADLE_PID=$! tail -f /tmp/sim.log | grep -m1 "Robot program startup complete" - kill -- -$(ps -o pgid= "$GRADLE_PID" | tr -d ' ') 2>/dev/null || kill "$GRADLE_PID" 2>/dev/null || true + kill -- -$GRADLE_PID 2>/dev/null || true cat /tmp/sim.log From fc7f93b02afe34ca4ac7ee4c5097277f3aeda9c5 Mon Sep 17 00:00:00 2001 From: nlaverdure Date: Thu, 11 Jun 2026 13:20:26 -0400 Subject: [PATCH 15/15] Simplify simulation CI: assemble and test only, no sim execution Co-Authored-By: Claude Sonnet 4.6 --- .github/workflows/build-simulation.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/build-simulation.yml b/.github/workflows/build-simulation.yml index 2186df2..042d979 100644 --- a/.github/workflows/build-simulation.yml +++ b/.github/workflows/build-simulation.yml @@ -19,9 +19,4 @@ jobs: - name: Grant execute permission run: chmod +x gradlew - name: Build simulation - run: | - setsid ./gradlew simulateJavaRelease &>/tmp/sim.log & - GRADLE_PID=$! - tail -f /tmp/sim.log | grep -m1 "Robot program startup complete" - kill -- -$GRADLE_PID 2>/dev/null || true - cat /tmp/sim.log + run: ./gradlew assemble test