diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 5752b36bc2..425bcb96c9 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -1,5 +1,13 @@ # This is the main maven workflow for SWT. +# You can run this locally to test changes with the act command https://nektosact.com/ +# For example, to run all linux tests on Java 21: +# act -j build-linux --matrix java:21 --artifact-server-path $PWD/.artifacts +# You may need to download runners on first run, act will ask but if you +# want the big runner there is no progress as it downloads, so you can pull it with +# docker directly: +# docker pull catthehacker/ubuntu:full-latest + name: SWT Matrix Build concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -25,19 +33,103 @@ jobs: with: name: Event File path: ${{ github.event_path }} - build: + + changes: + name: Detect changed paths + runs-on: ubuntu-latest + outputs: + # Lint warnings are expected in this block + # https://github.com/dorny/paths-filter/issues/223#issuecomment-2463309889 + win32: ${{ steps.filter.outputs.win32 || 'false' }} + gtk: ${{ steps.filter.outputs.gtk || 'false' }} + cocoa: ${{ steps.filter.outputs.cocoa || 'false' }} + md: ${{ steps.filter.outputs.md || 'false' }} + other: ${{ steps.filter.outputs.other || 'false' }} + steps: + - uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0 + with: + fetch-depth: 0 # so base/ref SHAs are diffable + - name: Paths filter (PR/Push only) + if: github.event.pull_request.base + # dorney/paths-filter is out of date, so use this fork with + # a specific fix for missing predicate-quantifier in action's + # inputs + # https://github.com/dorny/paths-filter/pull/226#issuecomment-2805358761 + uses: petermetz/paths-filter@5ee2f5d4cf5d7bdd998a314a42da307e2ae1639d + id: filter + with: + predicate-quantifier: 'every' + filters: | + win32: + - '**/win32/**' + gtk: + - '**/gtk/**' + cocoa: + - '**/cocoa/**' + md: + - '**/*.md' + jenkins: + - 'Jenkinsfile' + # "other" = anything not matching the above buckets + other: + - '**' + - '!**/win32/**' + - '!**/gtk/**' + - '!**/cocoa/**' + - '!**/*.md' + - '!Jenkinsfile' + + build-linux: + name: Build (Linux) + needs: changes + # push => always; PR => run if gtk changed OR "other" changed (run-everything case) + if: ${{ github.event_name != 'pull_request' || needs.changes.outputs.gtk == 'true' || needs.changes.outputs.other == 'true' }} + strategy: + fail-fast: false + matrix: + java: ['21'] + uses: ./.github/workflows/build.yml + with: + runner: ubuntu-latest + java: ${{ matrix.java }} + native: gtk.linux.x86_64 + performance: ${{ contains(github.event.pull_request.labels.*.name, 'performance') }} + + build-windows: + name: Build (Windows) + needs: changes + # push => always; PR => run if win32 changed OR "other" changed (run-everything case) + if: ${{ github.event_name != 'pull_request' || needs.changes.outputs.win32 == 'true' || needs.changes.outputs.other == 'true' }} + strategy: + fail-fast: false + matrix: + java: ['21'] + uses: ./.github/workflows/build.yml + with: + runner: windows-latest + java: ${{ matrix.java }} + native: win32.win32.x86_64 + performance: ${{ contains(github.event.pull_request.labels.*.name, 'performance') }} + + build-macos: + name: Build (macOS) + needs: changes + # push => always; PR => run if cocoa changed OR "other" changed (run-everything case) + if: ${{ github.event_name != 'pull_request' || needs.changes.outputs.cocoa == 'true' || needs.changes.outputs.other == 'true' }} strategy: fail-fast: false matrix: - java: [ '21' ] - config: - - { name: Linux, os: ubuntu-latest, native: gtk.linux.x86_64 } - - { name: Windows, os: windows-latest, native: win32.win32.x86_64 } - - { name: MacOS x86, os: macos-15-intel, native: cocoa.macosx.x86_64 } - - { name: MacOS ARM, os: macos-latest, native: cocoa.macosx.aarch64 } + java: ['21'] + native: [cocoa.macosx.x86_64, cocoa.macosx.aarch64] + runner: [macos-15-intel, macos-latest] + exclude: + - runner: macos-latest + native: cocoa.macosx.x86_64 + - runner: macos-15-intel + native: cocoa.macosx.aarch64 uses: ./.github/workflows/build.yml with: - runner: ${{ matrix.config.os }} + runner: ${{ matrix.runner }} java: ${{ matrix.java }} - native: ${{ matrix.config.native }} + native: ${{ matrix.native }} performance: ${{ contains(github.event.pull_request.labels.*.name, 'performance') }}