From 2b62e117ade900589d660ddda995bd6180d6bd6a Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Tue, 26 May 2026 12:28:18 +0900 Subject: [PATCH 1/4] Actions: change cancel-in-progress We want to cancel in progress jobs since we dont really need them; just always run on the latest pushed code immediately, freeing up resources more eagerly --- .github/workflows/pull_request.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 3be4e8fdc..d6479ded2 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -7,6 +7,10 @@ on: pull_request: types: [opened, reopened, synchronize] +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + jobs: soundness: uses: swiftlang/github-workflows/.github/workflows/soundness.yml@main From 0dbdbce7c7044584dee7b8eed820e73d7ad9998a Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Tue, 26 May 2026 12:59:05 +0900 Subject: [PATCH 2/4] Actions: reduce build matrix to save CI resources Drop Swift 6.2 from Linux jobs and reduce macOS jobs to Swift 6.3 only. verify-samples is now 6.3 only on both platforms since the 7-sample fan-out was the largest contributor (was 28 Linux + 14 macOS = 42 jobs; now 7 + 7 = 14). Linux still covers 6.1.3 and nightly via test-swift. Saves ~32 jobs per PR. --- .github/workflows/pull_request.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index d6479ded2..ebc729bf6 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -53,7 +53,7 @@ jobs: strategy: fail-fast: true matrix: - swift_version: ['6.2', '6.3', 'nightly'] + swift_version: ['6.3', 'nightly'] os_version: ['jammy'] jdk_vendor: ['corretto'] container: @@ -79,7 +79,7 @@ jobs: strategy: fail-fast: true matrix: - swift_version: ['6.2', '6.3'] + swift_version: ['6.3'] os_version: ['macos'] jdk_vendor: ['corretto'] env: @@ -147,7 +147,7 @@ jobs: strategy: fail-fast: false matrix: - swift_version: ['6.1.3', '6.2', '6.3', 'nightly'] + swift_version: ['6.1.3', '6.3', 'nightly'] os_version: ['jammy'] jdk_vendor: ['corretto'] container: @@ -171,7 +171,7 @@ jobs: strategy: fail-fast: false matrix: - swift_version: ['6.2.3', '6.3'] + swift_version: ['6.3'] os_version: ['macos'] jdk_vendor: ['corretto'] env: @@ -225,7 +225,7 @@ jobs: strategy: fail-fast: false matrix: - swift_version: ['6.1.3', '6.2', '6.3', 'nightly'] + swift_version: ['6.3'] os_version: ['jammy'] jdk_vendor: ['corretto'] sample_app: [ # TODO: use a reusable-workflow to generate those names @@ -253,7 +253,7 @@ jobs: strategy: fail-fast: false matrix: - swift_version: ['6.2', '6.3'] # no nightly testing on macOS + swift_version: ['6.3'] # no nightly testing on macOS os_version: ['macos'] jdk_vendor: ['corretto'] sample_app: [ # TODO: use a reusable-workflow to generate those names From e658f7f0da2770ac831d2ad1ccdd43edd220f072 Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Tue, 26 May 2026 13:10:38 +0900 Subject: [PATCH 3/4] Actions: cache per-sample .build to skip duplicated swift-java compiles Each Samples//Package.swift declares swift-java as a path: "../../" dependency, so every sample's `swift build` recompiles the entire swift-java tree (including swift-syntax) into its own .build dir. With seven samples this is ~7x duplicated work and dominates CI time. Add an actions/cache step to verify-samples and verify-samples-macos that caches Samples//.build keyed on swift-java sources + sample sources + Swift toolchain version, with restore-keys so partial reuse kicks in even when swift-java sources change. SwiftPM's incremental build then rebuilds only what actually changed. The bigger structural win (re-enabling --experimental-prebuilts to skip swift-syntax entirely) is still blocked on #418 and tracked separately. --- .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 ebc729bf6..8fd2de43e 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -243,6 +243,26 @@ jobs: - uses: actions/checkout@v6 - name: Prepare CI Environment uses: ./.github/actions/prepare_env + - name: Compute sample cache hash + id: sample_hash + shell: bash + run: | + if command -v sha256sum >/dev/null 2>&1; then SUM="sha256sum"; else SUM="shasum -a 256"; fi + hash="$( { + find Sources Plugins -type f -name '*.swift' 2>/dev/null + find "Samples/${{ matrix.sample_app }}" -type f \( -name '*.swift' -o -name '*.config' -o -name 'Package.swift' -o -name 'ci-validate.sh' \) 2>/dev/null + printf '%s\n' Package.swift Package.resolved + } | LC_ALL=C sort -u | xargs $SUM 2>/dev/null | $SUM | cut -d' ' -f1 )" + echo "hash=$hash" >> "$GITHUB_OUTPUT" + - name: Cache sample .build + uses: actions/cache@v4 + continue-on-error: true + with: + path: Samples/${{ matrix.sample_app }}/.build + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}-${{ steps.sample_hash.outputs.hash }} + restore-keys: | + ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}- + ${{ runner.os }}-swift${{ matrix.swift_version }}-sample- - name: "Verify sample: ${{ matrix.sample_app }}" run: .github/scripts/validate_sample.sh Samples/${{ matrix.sample_app }} @@ -273,6 +293,26 @@ jobs: run: ./.github/scripts/install_swiftly.sh env: SWIFT_VERSION: "${{ matrix.swift_version }}" + - name: Compute sample cache hash + id: sample_hash + shell: bash + run: | + if command -v sha256sum >/dev/null 2>&1; then SUM="sha256sum"; else SUM="shasum -a 256"; fi + hash="$( { + find Sources Plugins -type f -name '*.swift' 2>/dev/null + find "Samples/${{ matrix.sample_app }}" -type f \( -name '*.swift' -o -name '*.config' -o -name 'Package.swift' -o -name 'ci-validate.sh' \) 2>/dev/null + printf '%s\n' Package.swift Package.resolved + } | LC_ALL=C sort -u | xargs $SUM 2>/dev/null | $SUM | cut -d' ' -f1 )" + echo "hash=$hash" >> "$GITHUB_OUTPUT" + - name: Cache sample .build + uses: actions/cache@v4 + continue-on-error: true + with: + path: Samples/${{ matrix.sample_app }}/.build + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}-${{ steps.sample_hash.outputs.hash }} + restore-keys: | + ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}- + ${{ runner.os }}-swift${{ matrix.swift_version }}-sample- - name: "Verify sample ${{ matrix.sample_app }}" run: .github/scripts/validate_sample.sh Samples/${{ matrix.sample_app }} From 19d67a5e14cee0d4512feaecaf82ebb5be8b5e4d Mon Sep 17 00:00:00 2001 From: Konrad Malawski Date: Tue, 26 May 2026 15:24:47 +0900 Subject: [PATCH 4/4] Actions: use hashFiles() with literal patterns for sample cache key --- .github/workflows/pull_request.yml | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 8fd2de43e..c5d2d638a 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -243,23 +243,12 @@ jobs: - uses: actions/checkout@v6 - name: Prepare CI Environment uses: ./.github/actions/prepare_env - - name: Compute sample cache hash - id: sample_hash - shell: bash - run: | - if command -v sha256sum >/dev/null 2>&1; then SUM="sha256sum"; else SUM="shasum -a 256"; fi - hash="$( { - find Sources Plugins -type f -name '*.swift' 2>/dev/null - find "Samples/${{ matrix.sample_app }}" -type f \( -name '*.swift' -o -name '*.config' -o -name 'Package.swift' -o -name 'ci-validate.sh' \) 2>/dev/null - printf '%s\n' Package.swift Package.resolved - } | LC_ALL=C sort -u | xargs $SUM 2>/dev/null | $SUM | cut -d' ' -f1 )" - echo "hash=$hash" >> "$GITHUB_OUTPUT" - name: Cache sample .build uses: actions/cache@v4 continue-on-error: true with: path: Samples/${{ matrix.sample_app }}/.build - key: ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}-${{ steps.sample_hash.outputs.hash }} + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}-${{ hashFiles('Sources/**/*.swift', 'Plugins/**/*.swift', 'Package.swift', 'Package.resolved') }} restore-keys: | ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}- ${{ runner.os }}-swift${{ matrix.swift_version }}-sample- @@ -293,23 +282,12 @@ jobs: run: ./.github/scripts/install_swiftly.sh env: SWIFT_VERSION: "${{ matrix.swift_version }}" - - name: Compute sample cache hash - id: sample_hash - shell: bash - run: | - if command -v sha256sum >/dev/null 2>&1; then SUM="sha256sum"; else SUM="shasum -a 256"; fi - hash="$( { - find Sources Plugins -type f -name '*.swift' 2>/dev/null - find "Samples/${{ matrix.sample_app }}" -type f \( -name '*.swift' -o -name '*.config' -o -name 'Package.swift' -o -name 'ci-validate.sh' \) 2>/dev/null - printf '%s\n' Package.swift Package.resolved - } | LC_ALL=C sort -u | xargs $SUM 2>/dev/null | $SUM | cut -d' ' -f1 )" - echo "hash=$hash" >> "$GITHUB_OUTPUT" - name: Cache sample .build uses: actions/cache@v4 continue-on-error: true with: path: Samples/${{ matrix.sample_app }}/.build - key: ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}-${{ steps.sample_hash.outputs.hash }} + key: ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}-${{ hashFiles('Sources/**/*.swift', 'Plugins/**/*.swift', 'Package.swift', 'Package.resolved') }} restore-keys: | ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-${{ matrix.sample_app }}- ${{ runner.os }}-swift${{ matrix.swift_version }}-sample-