From dff412d54d439a0f6ed52f7f3c19c42259edf341 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Wed, 8 Jul 2026 14:08:19 -0700 Subject: [PATCH 1/9] Add macOS nightly build support via Swiftly Adds a new opt-in macos-swiftly-build job that pairs an Xcode version with a Swiftly-managed Swift toolchain (defaulting to main-snapshot), since xcrun cannot see toolchains that Swiftly selects on PATH. --- .github/workflows/pull_request.yml | 4 ++ .github/workflows/swift_package_test.yml | 52 ++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index 8da9c703..cd6a5c35 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -79,6 +79,10 @@ jobs: macos_build_command: | cd tests/TestPackage xcrun swift build + enable_macos_swiftly_checks: true + macos_swiftly_build_command: | + cd tests/TestPackage + swift build build_tests_ios: name: Build iOS Tests diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d5ee72d1..c73ca91f 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -22,6 +22,10 @@ on: type: string description: "macOS arch list (JSON)" default: "[\"ARM64\"]" + macos_swiftly_toolchains: + type: string + description: "List of macOS Swiftly toolchain builds to test, each pairing an Xcode version with a Swiftly-managed Swift toolchain (JSON list of objects with xcode_version, swift_version, os_version, arch)" + default: "[{\"xcode_version\": \"26.4\", \"swift_version\": \"main-snapshot\", \"os_version\": \"tahoe\", \"arch\": \"ARM64\"}]" ios_host_xcode_versions: type: string description: "Xcode version list (JSON)" @@ -139,6 +143,10 @@ on: type: string description: "macOS command to build and test the package" default: "xcrun swift test" + macos_swiftly_build_command: + type: string + description: "macOS command to build and test the package when using a Swiftly-managed toolchain (run via `swiftly run`, so it should not use `xcrun`)" + default: "swift test" macos_build_timeout: type: number description: "The default step timeout in minutes" @@ -245,6 +253,10 @@ on: type: boolean description: "Boolean to enable macOS testing. Defaults to false" default: false + enable_macos_swiftly_checks: + type: boolean + description: "Boolean to enable macOS testing with Swiftly-managed toolchains (e.g. nightly snapshots). Defaults to false" + default: false enable_ios_checks: type: boolean description: "Boolean to enable iOS testing. Defaults to false" @@ -313,6 +325,46 @@ jobs: run: ${{ inputs.macos_build_command }} ${{ (contains(matrix.swift_version, 'nightly') && inputs.swift_nightly_flags) || inputs.swift_flags }} timeout-minutes: ${{ inputs.macos_build_timeout }} + macos-swiftly-build: + name: macOS via Swiftly (Xcode ${{ matrix.xcode_version }} + ${{ matrix.swift_version }} - ${{ matrix.os_version }} - ${{ matrix.arch }}) + if: ${{ inputs.enable_macos_swiftly_checks }} + runs-on: [self-hosted, macos, "${{ matrix.os_version }}", "${{ matrix.arch }}"] + strategy: + fail-fast: false + matrix: + include: ${{ fromJson(inputs.macos_swiftly_toolchains) }} + steps: + - name: Checkout repository + uses: actions/checkout@v7 + - name: Provide token + if: ${{ inputs.needs_token }} + run: | + echo "GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }}" >> $GITHUB_ENV + - name: Set environment variables + if: ${{ inputs.macos_env_vars }} + env: + ENV_VARS: ${{ inputs.macos_env_vars }} + run: | + for i in "${ENV_VARS}" + do + printf "%s\n" $i >> $GITHUB_ENV + done + - name: Select Xcode + run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV + - name: Install Swift toolchain via Swiftly + run: | + swiftly install ${{ matrix.swift_version }} + swiftly use ${{ matrix.swift_version }} + - name: Swift version + run: swiftly run swift --version + - name: Pre-build + # zizmor: ignore[template-injection] + run: ${{ inputs.macos_pre_build_command }} + - name: Build / Test + # zizmor: ignore[template-injection] + run: swiftly run ${{ inputs.macos_swiftly_build_command }} ${{ (contains(matrix.swift_version, 'snapshot') && inputs.swift_nightly_flags) || inputs.swift_flags }} + timeout-minutes: ${{ inputs.macos_build_timeout }} + ios-build: name: iOS (Build Only, Xcode ${{ matrix.xcode_version }} - ${{ matrix.os_version }} - ${{ matrix.arch }}) if: ${{ inputs.enable_ios_checks }} From 59d3eefce98104769c8a82705f94499330be5861 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Wed, 8 Jul 2026 14:22:47 -0700 Subject: [PATCH 2/9] Install Swiftly on self-hosted macOS runners before installing nightly toolchains --- .github/workflows/swift_package_test.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index c73ca91f..4e77bce3 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -351,6 +351,14 @@ jobs: done - name: Select Xcode run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV + - name: Install Swiftly + run: | + curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg + installer -pkg swiftly.pkg -target CurrentUserHomeDirectory + ~/.swiftly/bin/swiftly init --quiet-shell-followup + . "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" + hash -r + echo "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/bin" >> $GITHUB_PATH - name: Install Swift toolchain via Swiftly run: | swiftly install ${{ matrix.swift_version }} From 3ec076c7ba1eaa9b57529dc7ba7c7b1d617ec097 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Wed, 8 Jul 2026 15:41:07 -0700 Subject: [PATCH 3/9] Add flags to swiftly --- .github/workflows/swift_package_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 4e77bce3..5ce367b2 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -355,7 +355,7 @@ jobs: run: | curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg installer -pkg swiftly.pkg -target CurrentUserHomeDirectory - ~/.swiftly/bin/swiftly init --quiet-shell-followup + ~/.swiftly/bin/swiftly init --quiet-shell-followup --assume-yes --skip-install . "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" hash -r echo "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/bin" >> $GITHUB_PATH From a63197c97ef02df026dd3c80446ff0349f060c71 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 9 Jul 2026 00:38:41 -0700 Subject: [PATCH 4/9] Use pre-installed Swiftly on self-hosted macOS runners instead of installing it --- .github/workflows/swift_package_test.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 5ce367b2..6125e647 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -351,14 +351,8 @@ jobs: done - name: Select Xcode run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV - - name: Install Swiftly - run: | - curl -O https://download.swift.org/swiftly/darwin/swiftly.pkg - installer -pkg swiftly.pkg -target CurrentUserHomeDirectory - ~/.swiftly/bin/swiftly init --quiet-shell-followup --assume-yes --skip-install - . "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/env.sh" - hash -r - echo "${SWIFTLY_HOME_DIR:-$HOME/.swiftly}/bin" >> $GITHUB_PATH + - name: Add Swiftly to PATH + run: echo "$HOME/.swiftly/bin" >> $GITHUB_PATH - name: Install Swift toolchain via Swiftly run: | swiftly install ${{ matrix.swift_version }} From 543d8ced563afb13c8d72287e6605159c000c277 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 9 Jul 2026 00:46:24 -0700 Subject: [PATCH 5/9] Source Swiftly env.sh to set up environment for self-hosted macOS runners --- .github/workflows/swift_package_test.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 6125e647..45ea3531 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -351,8 +351,13 @@ jobs: done - name: Select Xcode run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV - - name: Add Swiftly to PATH - run: echo "$HOME/.swiftly/bin" >> $GITHUB_PATH + - name: Set up Swiftly environment + run: | + . "$HOME/.swiftly/env.sh" + echo "SWIFTLY_HOME_DIR=$SWIFTLY_HOME_DIR" >> $GITHUB_ENV + echo "SWIFTLY_BIN_DIR=$SWIFTLY_BIN_DIR" >> $GITHUB_ENV + echo "SWIFTLY_TOOLCHAINS_DIR=$SWIFTLY_TOOLCHAINS_DIR" >> $GITHUB_ENV + echo "$SWIFTLY_BIN_DIR" >> $GITHUB_PATH - name: Install Swift toolchain via Swiftly run: | swiftly install ${{ matrix.swift_version }} From d903953ed056d11f29a3174b95f6b9570f208cd4 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 9 Jul 2026 01:32:03 -0700 Subject: [PATCH 6/9] Update swift_package_test.yml --- .github/workflows/swift_package_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 45ea3531..0d832916 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -369,7 +369,7 @@ jobs: run: ${{ inputs.macos_pre_build_command }} - name: Build / Test # zizmor: ignore[template-injection] - run: swiftly run ${{ inputs.macos_swiftly_build_command }} ${{ (contains(matrix.swift_version, 'snapshot') && inputs.swift_nightly_flags) || inputs.swift_flags }} + run: ${{ inputs.macos_swiftly_build_command }} ${{ (contains(matrix.swift_version, 'snapshot') && inputs.swift_nightly_flags) || inputs.swift_flags }} timeout-minutes: ${{ inputs.macos_build_timeout }} ios-build: From 35fae1b3dbd5fa9e9d249293c2570c059d4eb39c Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 9 Jul 2026 01:33:48 -0700 Subject: [PATCH 7/9] Update pull_request.yml to use swiftly run --- .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 cd6a5c35..6262e3e0 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -82,7 +82,7 @@ jobs: enable_macos_swiftly_checks: true macos_swiftly_build_command: | cd tests/TestPackage - swift build + swiftly run swift build build_tests_ios: name: Build iOS Tests From 57a76abbbacbf730d353e4ad14e3740b94765794 Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 9 Jul 2026 10:55:26 -0700 Subject: [PATCH 8/9] Include /Contents/Developer when setting DEVELOPER_DIR --- .github/workflows/swift_package_test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index 0d832916..d159242a 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -312,7 +312,7 @@ jobs: printf "%s\n" $i >> $GITHUB_ENV done - name: Select Xcode - run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV + run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app/Contents/Developer" >> $GITHUB_ENV - name: Swift version run: xcrun swift --version - name: Clang version @@ -350,7 +350,7 @@ jobs: printf "%s\n" $i >> $GITHUB_ENV done - name: Select Xcode - run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV + run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app/Contents/Developer" >> $GITHUB_ENV - name: Set up Swiftly environment run: | . "$HOME/.swiftly/env.sh" @@ -401,7 +401,7 @@ jobs: printf "%s\n" $i >> $GITHUB_ENV done - name: Select Xcode - run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app" >> $GITHUB_ENV + run: echo "DEVELOPER_DIR=/Applications/Xcode_${{ matrix.xcode_version }}.app/Contents/Developer" >> $GITHUB_ENV - name: Swift version run: | "$(xcrun -f swift)" --version From 2571fd218271386b43d535e7aade6e6e1968dbdd Mon Sep 17 00:00:00 2001 From: Mishal Shah Date: Thu, 9 Jul 2026 12:21:39 -0700 Subject: [PATCH 9/9] Update swift_package_test.yml to use `swiftly run` --- .github/workflows/swift_package_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/swift_package_test.yml b/.github/workflows/swift_package_test.yml index d159242a..950b6c0c 100644 --- a/.github/workflows/swift_package_test.yml +++ b/.github/workflows/swift_package_test.yml @@ -146,7 +146,7 @@ on: macos_swiftly_build_command: type: string description: "macOS command to build and test the package when using a Swiftly-managed toolchain (run via `swiftly run`, so it should not use `xcrun`)" - default: "swift test" + default: "swiftly run swift test" macos_build_timeout: type: number description: "The default step timeout in minutes"