Rewrite of GitHub Actions with Claude #3750
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 | |