From 3bd15aec3b0ee531c73297fb0e8ef0549b1cb4c7 Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 10 Jun 2026 19:38:48 +0900 Subject: [PATCH 1/5] See if we can aggressively cache .build some more for re-runs --- .github/workflows/pull_request.yml | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 3348d06bb..3b75471bb 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -40,6 +40,14 @@ jobs: - uses: actions/checkout@v6 - name: Prepare CI Environment uses: ./.github/actions/prepare_env + - name: Cache .build + uses: actions/cache@v5 + continue-on-error: true + with: + path: .build + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-docs-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/**/*.swift', 'Plugins/**/*.swift') }} + restore-keys: | + ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-docs- - name: Swift Build run: swift build --disable-experimental-prebuilts # FIXME: until prebuilt swift-syntax isn't broken on 6.2 anymore: https://github.com/swiftlang/swift-java/issues/418 - name: Run documentation check @@ -136,6 +144,14 @@ jobs: uses: ./.github/actions/prepare_env - name: Install jemalloc run: apt-get update && apt-get install -y libjemalloc-dev + - name: Cache Benchmarks/.build + uses: actions/cache@v5 + continue-on-error: true + with: + path: Benchmarks/.build + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-benchmarks-${{ hashFiles('Benchmarks/Package.swift', 'Benchmarks/Package.resolved', 'Benchmarks/Benchmarks/**/*.swift', 'Benchmarks/Sources/**/*.swift') }} + restore-keys: | + ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-benchmarks- - name: Swift Benchmarks run: swift package --package-path Benchmarks/ --disable-experimental-prebuilts benchmark # FIXME: until prebuilt swift-syntax isn't broken on 6.2 anymore: https://github.com/swiftlang/swift-java/issues/418 @@ -158,6 +174,14 @@ jobs: - uses: actions/checkout@v6 - name: Prepare CI Environment uses: ./.github/actions/prepare_env + - name: Cache .build + uses: actions/cache@v5 + continue-on-error: true + with: + path: .build + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-test-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/**/*.swift', 'Plugins/**/*.swift', 'Tests/**/*.swift') }} + restore-keys: | + ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-test- - name: Swift Build run: swift build --build-tests --disable-sandbox --disable-experimental-prebuilts # FIXME: until prebuilt swift-syntax isn't broken on 6.2 anymore: https://github.com/swiftlang/swift-java/issues/418 - name: Swift Test (XCTest) @@ -307,6 +331,14 @@ jobs: - uses: actions/checkout@v6 - name: Prepare CI Environment uses: ./.github/actions/prepare_env + - name: Cache Tests/LinkageTest/.build + uses: actions/cache@v5 + continue-on-error: true + with: + path: Tests/LinkageTest/.build + key: ${{ runner.os }}-swift6.3-jammy-build-linkage-${{ hashFiles('Tests/LinkageTest/Package.swift', 'Tests/LinkageTest/Package.resolved', 'Tests/LinkageTest/Sources/**/*.swift') }} + restore-keys: | + ${{ runner.os }}-swift6.3-jammy-build-linkage- - name: Run linkage test run: ./scripts/run-linkage-test.sh env: @@ -327,6 +359,14 @@ jobs: run: git config --global --add safe.directory "$GITHUB_WORKSPACE" - name: Prepare CI Environment uses: ./.github/actions/prepare_env + - name: Cache .build + uses: actions/cache@v5 + continue-on-error: true + with: + path: .build + key: ${{ runner.os }}-swift6.3-jammy-build-wrapjava-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/SwiftJavaTool/**/*.swift', 'Sources/SwiftJavaToolLib/**/*.swift', 'Sources/SwiftJava/**/*.swift') }} + restore-keys: | + ${{ runner.os }}-swift6.3-jammy-build-wrapjava- - name: Regenerate JavaStdlib wrappers env: JAVA_HOME: ${{ env.JAVA_HOME_25 }} From 6bbcd982bf4c356f3b954ca58eb757d8c4a499d7 Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 10 Jun 2026 19:43:30 +0900 Subject: [PATCH 2/5] move job to jammy --- .github/workflows/pull_request.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 3b75471bb..aa3d017f0 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -29,7 +29,7 @@ jobs: name: Documentation check runs-on: ubuntu-latest container: - image: 'swift:6.3-noble' + image: 'swift:6.3-jammy' strategy: fail-fast: true matrix: From 1f340d62bd307d48ea0e2c708e24d0f13e93ee2e Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 10 Jun 2026 19:52:56 +0900 Subject: [PATCH 3/5] move all builds to noble --- .github/actions/prepare_env/action.yml | 2 +- .github/workflows/pull_request.yml | 30 +++++++++++++------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/.github/actions/prepare_env/action.yml b/.github/actions/prepare_env/action.yml index 90854db0b..8858a518d 100644 --- a/.github/actions/prepare_env/action.yml +++ b/.github/actions/prepare_env/action.yml @@ -32,7 +32,7 @@ runs: # shell: bash # run: ./gradlew -q javaToolchains - name: Cache local SwiftPM repository - if: matrix.os_version == 'jammy' + if: matrix.os_version == 'noble' uses: actions/cache@v4 continue-on-error: true with: diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index aa3d017f0..ee8972feb 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -29,12 +29,12 @@ jobs: name: Documentation check runs-on: ubuntu-latest container: - image: 'swift:6.3-jammy' + image: 'swift:6.3-noble' strategy: fail-fast: true matrix: swift_version: ['6.3'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] steps: - uses: actions/checkout@v6 @@ -62,7 +62,7 @@ jobs: fail-fast: true matrix: swift_version: ['6.3', 'nightly'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] container: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} @@ -112,7 +112,7 @@ jobs: fail-fast: true matrix: swift_version: ['6.3'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] container: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} @@ -132,7 +132,7 @@ jobs: fail-fast: true matrix: swift_version: ['6.3'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] container: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} @@ -164,7 +164,7 @@ jobs: fail-fast: false matrix: swift_version: ['6.1.3', '6.3', 'nightly'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] container: image: ${{ (contains(matrix.swift_version, 'nightly') && 'swiftlang/swift') || 'swift' }}:${{ matrix.swift_version }}-${{ matrix.os_version }} @@ -224,7 +224,7 @@ jobs: fail-fast: false matrix: swift_version: ['6.3'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] sdk_triple: ['aarch64-unknown-linux-android28', 'x86_64-unknown-linux-android28', 'armv7-unknown-linux-android28'] ndk_version: ['r27d', 'r28c'] @@ -250,7 +250,7 @@ jobs: fail-fast: false matrix: swift_version: ['6.3'] - os_version: ['jammy'] + os_version: ['noble'] jdk_vendor: ['corretto'] sample_app: [ # TODO: use a reusable-workflow to generate those names 'JavaDependencySampleApp', @@ -319,14 +319,14 @@ jobs: run: .github/scripts/validate_sample.sh Samples/${{ matrix.sample_app }} linkage-test: - name: Linkage test (jammy swift:6.3) + name: Linkage test (noble swift:6.3) runs-on: ubuntu-latest strategy: fail-fast: false matrix: jdk_vendor: ['corretto'] container: - image: swift:6.3-jammy + image: swift:6.3-noble steps: - uses: actions/checkout@v6 - name: Prepare CI Environment @@ -336,9 +336,9 @@ jobs: continue-on-error: true with: path: Tests/LinkageTest/.build - key: ${{ runner.os }}-swift6.3-jammy-build-linkage-${{ hashFiles('Tests/LinkageTest/Package.swift', 'Tests/LinkageTest/Package.resolved', 'Tests/LinkageTest/Sources/**/*.swift') }} + key: ${{ runner.os }}-swift6.3-noble-build-linkage-${{ hashFiles('Tests/LinkageTest/Package.swift', 'Tests/LinkageTest/Package.resolved', 'Tests/LinkageTest/Sources/**/*.swift') }} restore-keys: | - ${{ runner.os }}-swift6.3-jammy-build-linkage- + ${{ runner.os }}-swift6.3-noble-build-linkage- - name: Run linkage test run: ./scripts/run-linkage-test.sh env: @@ -352,7 +352,7 @@ jobs: matrix: jdk_vendor: ['corretto'] container: - image: swift:6.3-jammy + image: swift:6.3-noble steps: - uses: actions/checkout@v6 - name: Mark workspace as safe for git @@ -364,9 +364,9 @@ jobs: continue-on-error: true with: path: .build - key: ${{ runner.os }}-swift6.3-jammy-build-wrapjava-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/SwiftJavaTool/**/*.swift', 'Sources/SwiftJavaToolLib/**/*.swift', 'Sources/SwiftJava/**/*.swift') }} + key: ${{ runner.os }}-swift6.3-noble-build-wrapjava-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/SwiftJavaTool/**/*.swift', 'Sources/SwiftJavaToolLib/**/*.swift', 'Sources/SwiftJava/**/*.swift') }} restore-keys: | - ${{ runner.os }}-swift6.3-jammy-build-wrapjava- + ${{ runner.os }}-swift6.3-noble-build-wrapjava- - name: Regenerate JavaStdlib wrappers env: JAVA_HOME: ${{ env.JAVA_HOME_25 }} From a945ba58e183cbbfb5ce95f24f19173a58dcd9ed Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 10 Jun 2026 19:53:22 +0900 Subject: [PATCH 4/5] try to remove --disable-experimental-prebuilts where possible --- .github/workflows/pull_request.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index ee8972feb..76427cf88 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -49,7 +49,7 @@ jobs: restore-keys: | ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-docs- - name: Swift Build - run: swift build --disable-experimental-prebuilts # FIXME: until prebuilt swift-syntax isn't broken on 6.2 anymore: https://github.com/swiftlang/swift-java/issues/418 + run: swift build - name: Run documentation check run: ./.github/scripts/validate_docs.sh @@ -153,7 +153,7 @@ jobs: restore-keys: | ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-benchmarks- - name: Swift Benchmarks - run: swift package --package-path Benchmarks/ --disable-experimental-prebuilts benchmark # FIXME: until prebuilt swift-syntax isn't broken on 6.2 anymore: https://github.com/swiftlang/swift-java/issues/418 + run: swift package --package-path Benchmarks/ benchmark test-swift: name: Test (Swift) (${{ matrix.os_version }} swift:${{ matrix.swift_version }} jdk:${{matrix.jdk_vendor}}) From fc65802bc635445763f579c7d37d0c1783ec0999 Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Wed, 10 Jun 2026 20:10:38 +0900 Subject: [PATCH 5/5] Extract cache step into reusable composite action Replace 5 inline 'actions/cache@v5' blocks with a per-site call to .github/actions/cache_swiftpm_build, which centralizes the cache key shape (runner.os + swift-version + os-version + tag + hashFiles) and the restore-keys fallback. Each call site now states only what varies: path, tag, swift-version, os-version, and the file globs to hash. Sample-app caches keep their existing two-level fallback shape and continue to use actions/cache directly. --- .../actions/cache_swiftpm_build/action.yml | 35 +++++++++ .github/workflows/pull_request.yml | 71 ++++++++++++------- 2 files changed, 81 insertions(+), 25 deletions(-) create mode 100644 .github/actions/cache_swiftpm_build/action.yml diff --git a/.github/actions/cache_swiftpm_build/action.yml b/.github/actions/cache_swiftpm_build/action.yml new file mode 100644 index 000000000..3488c5129 --- /dev/null +++ b/.github/actions/cache_swiftpm_build/action.yml @@ -0,0 +1,35 @@ +name: 'Cache SwiftPM .build' +description: | + Restore/save a SwiftPM .build directory keyed on Swift version, OS, a + job-specific tag, and a hash of the relevant package + source files. + Falls back to the most recent cache for the same job tag so SwiftPM + performs incremental compilation when sources change. + +inputs: + path: + description: 'Path to the .build directory to cache (e.g. .build, Benchmarks/.build)' + required: true + tag: + description: 'Short job-specific tag, used to keep different jobs from sharing caches' + required: true + hash-files: + description: 'Newline-separated glob patterns hashed into the cache key' + required: true + swift-version: + description: 'Swift version, used as part of the cache key (defaults to matrix.swift_version)' + required: true + os-version: + description: 'OS version, used as part of the cache key (defaults to matrix.os_version)' + required: true + +runs: + using: composite + steps: + - name: Cache ${{ inputs.path }} + uses: actions/cache@v5 + continue-on-error: true + with: + path: ${{ inputs.path }} + key: ${{ runner.os }}-swift${{ inputs.swift-version }}-${{ inputs.os-version }}-build-${{ inputs.tag }}-${{ hashFiles(inputs.hash-files) }} + restore-keys: | + ${{ runner.os }}-swift${{ inputs.swift-version }}-${{ inputs.os-version }}-build-${{ inputs.tag }}- diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 76427cf88..a8f8c228d 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -41,13 +41,17 @@ jobs: - name: Prepare CI Environment uses: ./.github/actions/prepare_env - name: Cache .build - uses: actions/cache@v5 - continue-on-error: true + uses: ./.github/actions/cache_swiftpm_build with: path: .build - key: ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-docs-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/**/*.swift', 'Plugins/**/*.swift') }} - restore-keys: | - ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-docs- + tag: docs + swift-version: ${{ matrix.swift_version }} + os-version: ${{ matrix.os_version }} + hash-files: | + Package.swift + Package.resolved + Sources/**/*.swift + Plugins/**/*.swift - name: Swift Build run: swift build - name: Run documentation check @@ -145,13 +149,17 @@ jobs: - name: Install jemalloc run: apt-get update && apt-get install -y libjemalloc-dev - name: Cache Benchmarks/.build - uses: actions/cache@v5 - continue-on-error: true + uses: ./.github/actions/cache_swiftpm_build with: path: Benchmarks/.build - key: ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-benchmarks-${{ hashFiles('Benchmarks/Package.swift', 'Benchmarks/Package.resolved', 'Benchmarks/Benchmarks/**/*.swift', 'Benchmarks/Sources/**/*.swift') }} - restore-keys: | - ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-benchmarks- + tag: benchmarks + swift-version: ${{ matrix.swift_version }} + os-version: ${{ matrix.os_version }} + hash-files: | + Benchmarks/Package.swift + Benchmarks/Package.resolved + Benchmarks/Benchmarks/**/*.swift + Benchmarks/Sources/**/*.swift - name: Swift Benchmarks run: swift package --package-path Benchmarks/ benchmark @@ -175,13 +183,18 @@ jobs: - name: Prepare CI Environment uses: ./.github/actions/prepare_env - name: Cache .build - uses: actions/cache@v5 - continue-on-error: true + uses: ./.github/actions/cache_swiftpm_build with: path: .build - key: ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-test-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/**/*.swift', 'Plugins/**/*.swift', 'Tests/**/*.swift') }} - restore-keys: | - ${{ runner.os }}-swift${{ matrix.swift_version }}-${{ matrix.os_version }}-build-test- + tag: test + swift-version: ${{ matrix.swift_version }} + os-version: ${{ matrix.os_version }} + hash-files: | + Package.swift + Package.resolved + Sources/**/*.swift + Plugins/**/*.swift + Tests/**/*.swift - name: Swift Build run: swift build --build-tests --disable-sandbox --disable-experimental-prebuilts # FIXME: until prebuilt swift-syntax isn't broken on 6.2 anymore: https://github.com/swiftlang/swift-java/issues/418 - name: Swift Test (XCTest) @@ -332,13 +345,16 @@ jobs: - name: Prepare CI Environment uses: ./.github/actions/prepare_env - name: Cache Tests/LinkageTest/.build - uses: actions/cache@v5 - continue-on-error: true + uses: ./.github/actions/cache_swiftpm_build with: path: Tests/LinkageTest/.build - key: ${{ runner.os }}-swift6.3-noble-build-linkage-${{ hashFiles('Tests/LinkageTest/Package.swift', 'Tests/LinkageTest/Package.resolved', 'Tests/LinkageTest/Sources/**/*.swift') }} - restore-keys: | - ${{ runner.os }}-swift6.3-noble-build-linkage- + tag: linkage + swift-version: '6.3' + os-version: noble + hash-files: | + Tests/LinkageTest/Package.swift + Tests/LinkageTest/Package.resolved + Tests/LinkageTest/Sources/**/*.swift - name: Run linkage test run: ./scripts/run-linkage-test.sh env: @@ -360,13 +376,18 @@ jobs: - name: Prepare CI Environment uses: ./.github/actions/prepare_env - name: Cache .build - uses: actions/cache@v5 - continue-on-error: true + uses: ./.github/actions/cache_swiftpm_build with: path: .build - key: ${{ runner.os }}-swift6.3-noble-build-wrapjava-${{ hashFiles('Package.swift', 'Package.resolved', 'Sources/SwiftJavaTool/**/*.swift', 'Sources/SwiftJavaToolLib/**/*.swift', 'Sources/SwiftJava/**/*.swift') }} - restore-keys: | - ${{ runner.os }}-swift6.3-noble-build-wrapjava- + tag: wrapjava + swift-version: '6.3' + os-version: noble + hash-files: | + Package.swift + Package.resolved + Sources/SwiftJavaTool/**/*.swift + Sources/SwiftJavaToolLib/**/*.swift + Sources/SwiftJava/**/*.swift - name: Regenerate JavaStdlib wrappers env: JAVA_HOME: ${{ env.JAVA_HOME_25 }}