Skip to content

Rewrite of GitHub Actions with Claude #3750

Rewrite of GitHub Actions with Claude

Rewrite of GitHub Actions with Claude #3750

Workflow file for this run

name: CI tests
on:
schedule:
- cron: '0 7 * * *' # Runs daily at 07:00 UTC.
pull_request:
push:
branches: [ "master" ]
# Cancel in-progress workflows on PR updates; never cancel master pushes.
# https://docs.github.com/en/enterprise-cloud@latest/actions/writing-workflows/choosing-what-your-workflow-does/control-the-concurrency-of-workflows-and-jobs
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !contains(github.ref, 'heads/master') }}
# Default minimal permissions for all jobs; individual steps may opt-in to more.
permissions:
contents: read
env:
PRIMARY_JDK: "21"
USE_BAZEL_VERSION: "9.1.0"
# JDK 27 early-access build; bump when a new EA build is published.
JDK_EA_MAJOR: "27"
JDK_EA_BUILD: "22"
jobs:
# Basic sanity tests on the primary JDK.
sanity:
name: ${{ matrix.script }} on JDK ${{ matrix.java_version }}
runs-on: ubuntu-24.04
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
script: ['cftests-junit', 'cftests-nonjunit']
java_version: [21]
env:
JAVA_VERSION: ${{ matrix.java_version }}
steps:
- uses: actions/checkout@v6
- name: Set up JDK ${{ matrix.java_version }}
uses: actions/setup-java@v5
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
# Caching handled by gradle/actions/setup-gradle below.
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6.1.0
- name: Setup Bazel
if: ${{ matrix.script == 'cftests-nonjunit' }}
uses: bazel-contrib/setup-bazel@0.19.0
with:
bazelisk-cache: true
disk-cache: ${{ github.workflow }}
repository-cache: true
- name: Run test script checker/bin-devel/test-${{ matrix.script }}
run: ./checker/bin-devel/test-${{ matrix.script }}.sh
# Remaining tests on the primary JDK. Runs in parallel with `sanity`.
remainder:
name: ${{ matrix.script }} on JDK ${{ matrix.java_version }}
runs-on: ubuntu-24.04
# Don't depend on sanity jobs, to have more parallelism.
# TODO: cancel these jobs if sanity fails.
# needs: sanity
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
# No need to run 'cftests-junit-jdk21' on JDK 21.
script:
- 'typecheck-part1'
- 'typecheck-part2'
- 'guava'
- 'plume-lib'
- 'daikon-part1'
- 'daikon-part2'
- 'jspecify-conformance'
- 'jspecify-reference-checker'
- 'misc'
java_version: [21]
env:
JAVA_VERSION: ${{ matrix.java_version }}
steps:
# `misc` runs `ci-diff` which needs full history; everything else is shallow.
- uses: actions/checkout@v6
if: ${{ matrix.script == 'misc' }}
with:
fetch-depth: 0
- uses: actions/checkout@v6
if: ${{ matrix.script != 'misc' }}
with:
fetch-depth: 1
- name: Set up JDK ${{ matrix.java_version }}
uses: actions/setup-java@v5
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6.1.0
- name: Set up misc test dependencies
if: ${{ matrix.script == 'misc' }}
uses: ./.github/actions/setup-misc
- name: Run test script checker/bin-devel/test-${{ matrix.script }}
run: ./checker/bin-devel/test-${{ matrix.script }}.sh
otherjdks:
name: ${{ matrix.script }} on JDK ${{ matrix.java.version }}
runs-on: ubuntu-24.04
timeout-minutes: 90
needs: [sanity, remainder]
env:
JAVA_VERSION: ${{ matrix.java.version }}
strategy:
# `continue-on-error` below prevents experimental JDK failures from
# triggering fail-fast cancellation of the rest of the matrix.
fail-fast: true
matrix:
# `jspecify-*` only tested on the primary JDK (in `remainder`).
script:
- 'cftests-junit'
- 'cftests-nonjunit'
- 'cftests-junit-jdk21'
- 'typecheck-part1'
- 'typecheck-part2'
- 'guava'
- 'plume-lib'
- 'daikon-part1'
- 'daikon-part2'
- 'misc'
# Keep all LTS versions plus the newest non-LTS version.
# Experimental versions use the $version compiler but run Gradle on the primary JDK.
# Keep $version values in sync with env.JDK_EA_MAJOR above;
# env context is not available in strategy.matrix.
java:
- {version: '27', experimental: true}
- {version: '26', experimental: false}
- {version: '25', experimental: false}
- {version: '17', experimental: false}
- {version: '11', experimental: false}
- {version: '8', experimental: false}
exclude:
# JDK 8 does not allow toolchains, so 'cftests-junit-jdk21' is unnecessary.
- {script: 'cftests-junit-jdk21', java: {version: '8'}}
# `typecheck-*`, `guava`, and `misc` only on core versions (not 11/17).
- {script: 'typecheck-part1', java: {version: '11'}}
- {script: 'typecheck-part1', java: {version: '17'}}
- {script: 'typecheck-part2', java: {version: '11'}}
- {script: 'typecheck-part2', java: {version: '17'}}
- {script: 'guava', java: {version: '11'}}
- {script: 'guava', java: {version: '17'}}
- {script: 'misc', java: {version: '8'}}
- {script: 'misc', java: {version: '11'}}
- {script: 'misc', java: {version: '17'}}
# At least one plume-lib project no longer works on Java 8.
- {script: 'plume-lib', java: {version: '8'}}
- {script: 'plume-lib', java: {version: '11'}}
- {script: 'plume-lib', java: {version: '17'}}
# Daikon produces 'this-escape' warnings in JDK 22+. Only JDK 17 (added below).
- {script: 'daikon-part1'}
- {script: 'daikon-part2'}
include:
- {script: 'daikon-part1', java: {version: '17', experimental: false}}
- {script: 'daikon-part2', java: {version: '17', experimental: false}}
continue-on-error: ${{ matrix.java.experimental }}
steps:
- name: Check out sources
uses: actions/checkout@v6
with:
fetch-depth: ${{ matrix.script == 'misc' && 0 || 1 }}
- name: Set up JDK ${{ env.PRIMARY_JDK }} for Gradle to run on
uses: actions/setup-java@v5
with:
# Install the primary JDK first, to make it available to Gradle via gradle.properties below.
java-version: ${{ env.PRIMARY_JDK }}
distribution: 'zulu'
- name: Set up stable JDK ${{ matrix.java.version }}
if: ${{ matrix.java.version != env.JDK_EA_MAJOR }}
uses: actions/setup-java@v5
with:
# Install the requested JDK second, to make it the default on which tests run.
java-version: ${{ matrix.java.version }}
distribution: 'zulu'
- name: Set up early-access JDK ${{ env.JDK_EA_MAJOR }}
if: ${{ matrix.java.version == env.JDK_EA_MAJOR }}
uses: oracle-actions/setup-java@v1
with:
# Pin EA builds by direct archive URI.
# If the URI stops working, check for the updated pattern here:
# https://github.com/oracle-actions/setup-java/blob/main/jdk.java.net-uri.properties
uri: ${{ format('https://download.java.net/java/early_access/jdk{0}/{1}/GPL/openjdk-{0}-ea+{1}_linux-x64_bin.tar.gz', env.JDK_EA_MAJOR, env.JDK_EA_BUILD) }}
install-as-version: ${{ env.JDK_EA_MAJOR }}
- name: Pin Gradle to JDK ${{ env.PRIMARY_JDK }} via gradle.properties
run: |
mkdir -p ~/.gradle
echo "org.gradle.java.home=$JAVA_HOME_${{ env.PRIMARY_JDK }}_X64" >> ~/.gradle/gradle.properties
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6.1.0
- name: Set up misc test dependencies
if: ${{ matrix.script == 'misc' }}
uses: ./.github/actions/setup-misc
- name: Setup Bazel
if: ${{ matrix.script == 'cftests-nonjunit' }}
uses: bazel-contrib/setup-bazel@0.19.0
with:
bazelisk-cache: true
disk-cache: ${{ github.workflow }}
repository-cache: true
- name: Output version information to debug CI
run: which java && ./gradlew --version
- name: Run test script checker/bin-devel/test-${{ matrix.script }}
run: ./checker/bin-devel/test-${{ matrix.script }}.sh
env:
# Tells Gradle which JDK version to compile/run tests against,
# so we can e.g. run JDK 25 while Gradle itself does not support JDK 25 yet.
ORG_GRADLE_PROJECT_useJdkVersion: ${{ matrix.java.version }}
# Sanity tests on Windows and macOS.
otheros:
name: ${{ matrix.script }} on JDK ${{ matrix.java_version }} on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
timeout-minutes: 60
needs: sanity
strategy:
fail-fast: false
matrix:
os: ['windows-latest', 'macos-latest']
script: ['cftests-junit']
java_version: [21]
env:
JAVA_VERSION: ${{ matrix.java_version }}
steps:
- uses: actions/checkout@v6
- name: Set up JDK ${{ matrix.java_version }}
uses: actions/setup-java@v5
with:
java-version: ${{ matrix.java_version }}
distribution: 'zulu'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6.1.0
- name: Install coreutils on macOS
if: ${{ matrix.os == 'macos-latest' }}
run: brew install coreutils
- name: Install wget on Windows
if: ${{ matrix.os == 'windows-latest' }}
run: choco install wget --no-progress
- name: Run test script checker/bin-devel/test-${{ matrix.script }}
shell: bash
run: ./checker/bin-devel/test-${{ matrix.script }}.sh