From 24d0e7fc66c8da8a5ea589e37edf649146cbbb0b Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 16 Jul 2026 15:14:07 -0400 Subject: [PATCH 1/6] ci(ai): add Xcode 27 support to FirebaseAI CI Add testing on macOS 26 with Xcode 27 public preview runner images, while retaining Xcode 26 tests across both reusable Swift Package Manager and SDK integration test configurations. --- .github/workflows/_spm.yml | 12 ++++++++++-- .github/workflows/sdk.ai.yml | 7 +++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/.github/workflows/_spm.yml b/.github/workflows/_spm.yml index 179caa899ff..1a1a6d78fe9 100644 --- a/.github/workflows/_spm.yml +++ b/.github/workflows/_spm.yml @@ -126,14 +126,22 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-15, macos-26] - xcode: [Xcode_26.2, Xcode_26.4] + os: [macos-15, macos-26, xcode-27] + xcode: [Xcode_26.2, Xcode_26.4, Xcode_27.0] platform: [iOS, tvOS, macOS, watchOS, catalyst, visionOS] exclude: - os: macos-15 xcode: Xcode_26.4 + - os: macos-15 + xcode: Xcode_27.0 + - os: macos-26 + xcode: Xcode_26.2 - os: macos-26 + xcode: Xcode_27.0 + - os: xcode-27 xcode: Xcode_26.2 + - os: xcode-27 + xcode: Xcode_26.4 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 diff --git a/.github/workflows/sdk.ai.yml b/.github/workflows/sdk.ai.yml index 43d8e875566..a77cff10aa2 100644 --- a/.github/workflows/sdk.ai.yml +++ b/.github/workflows/sdk.ai.yml @@ -63,6 +63,11 @@ jobs: xcode: Xcode_26.2 test_filter_arg: --filter IntegrationTests-SPM/LiveSessionTests log_prefix: xcodebuild-live + - os: xcode-27 + target: iOS + xcode: Xcode_27.0 + test_filter_arg: --exclude IntegrationTests-SPM/LiveSessionTests + log_prefix: xcodebuild runs-on: ${{ matrix.os }} needs: spm env: @@ -109,6 +114,8 @@ jobs: # TODO: Bump to 26.4 when "Unable to find a destination matching the provided destination specifier" is resolved. - os: macos-26 xcode: Xcode_26.2 + - os: xcode-27 + xcode: Xcode_27.0 runs-on: ${{ matrix.os }} env: BRANCH_NAME: ${{ github.head_ref || github.ref_name || 'main' }} From da29ab082235c3174d7107e8f2ab08fa5dd5cc90 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 16 Jul 2026 15:21:39 -0400 Subject: [PATCH 2/6] ci: add Xcode 27 support to CocoaPods workflow Add testing on macOS 26 with Xcode 27 public preview runner images, while retaining Xcode 26 tests in the reusable CocoaPods workflow. --- .github/workflows/_cocoapods.yml | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/.github/workflows/_cocoapods.yml b/.github/workflows/_cocoapods.yml index 53226313112..19e35137c51 100644 --- a/.github/workflows/_cocoapods.yml +++ b/.github/workflows/_cocoapods.yml @@ -123,14 +123,22 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-15, macos-26] - xcode: [Xcode_26.2, Xcode_26.4] + os: [macos-15, macos-26, xcode-27] + xcode: [Xcode_26.2, Xcode_26.4, Xcode_27.0] platform: [iOS, tvOS, macOS, watchOS] exclude: - os: macos-15 xcode: Xcode_26.4 + - os: macos-15 + xcode: Xcode_27.0 + - os: macos-26 + xcode: Xcode_26.2 - os: macos-26 + xcode: Xcode_27.0 + - os: xcode-27 xcode: Xcode_26.2 + - os: xcode-27 + xcode: Xcode_26.4 runs-on: ${{ matrix.os }} steps: - name: Skip, if applicable. From db8ecd33f81fb74fb6e3c0bae6709a8ef06e6e62 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 16 Jul 2026 15:23:41 -0400 Subject: [PATCH 3/6] ci: run Xcode 27 tests only for FirebaseAI Introduce a `test_xcode27` boolean input to the reusable SPM and CocoaPods workflows, defaulting to false. This prevents other SDKs from running on the Xcode 27 preview image, while enabling it explicitly for FirebaseAI. --- .github/workflows/_cocoapods.yml | 13 ++++++++++++- .github/workflows/_spm.yml | 13 ++++++++++++- .github/workflows/sdk.ai.yml | 2 ++ 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/.github/workflows/_cocoapods.yml b/.github/workflows/_cocoapods.yml index 19e35137c51..2277d107bbd 100644 --- a/.github/workflows/_cocoapods.yml +++ b/.github/workflows/_cocoapods.yml @@ -116,10 +116,21 @@ on: required: false default: 20 + # Whether to test Xcode 27. Defaults to false. + test_xcode27: + type: boolean + required: false + default: false + jobs: pod-lib-lint: # Run on the main repo's scheduled jobs or pull requests and manual workflow invocations. - if: (github.repository == 'firebase/firebase-ios-sdk' && github.event_name == 'schedule') || contains(fromJSON('["pull_request", "workflow_dispatch"]'), github.event_name) + if: >- + ((github.repository == 'firebase/firebase-ios-sdk' && + github.event_name == 'schedule') || + contains(fromJSON('["pull_request", "workflow_dispatch"]'), + github.event_name)) && + (matrix.xcode != 'Xcode_27.0' || inputs.test_xcode27) strategy: fail-fast: false matrix: diff --git a/.github/workflows/_spm.yml b/.github/workflows/_spm.yml index 1a1a6d78fe9..f5323391d15 100644 --- a/.github/workflows/_spm.yml +++ b/.github/workflows/_spm.yml @@ -61,6 +61,12 @@ on: required: false default: false + # Whether to test Xcode 27. Defaults to false. + test_xcode27: + type: boolean + required: false + default: false + # Custom environment variables to inject into the jobs. # Expected to be a JSON-formatted string. # Example: '{"FIREBASE_APP_CHECK_BRANCH": "nc/target-split"}' @@ -119,7 +125,12 @@ jobs: spm: # Run on the main repo's scheduled jobs or pull requests and manual workflow invocations. - if: (github.repository == 'firebase/firebase-ios-sdk' && github.event_name == 'schedule') || contains(fromJSON('["pull_request", "workflow_dispatch"]'), github.event_name) + if: >- + ((github.repository == 'firebase/firebase-ios-sdk' && + github.event_name == 'schedule') || + contains(fromJSON('["pull_request", "workflow_dispatch"]'), + github.event_name)) && + (matrix.xcode != 'Xcode_27.0' || inputs.test_xcode27) needs: [spm-package-resolved] env: FIREBASE_IS_NIGHTLY_TESTING: ${{ inputs.is_nightly && '1' || '' }} diff --git a/.github/workflows/sdk.ai.yml b/.github/workflows/sdk.ai.yml index a77cff10aa2..1266cd0712e 100644 --- a/.github/workflows/sdk.ai.yml +++ b/.github/workflows/sdk.ai.yml @@ -33,6 +33,7 @@ jobs: uses: ./.github/workflows/_spm.yml with: target: ${{ matrix.target }} + test_xcode27: true setup_command: scripts/update_vertexai_responses.sh env_vars: '{"FIREBASE_APP_CHECK_BRANCH": "main"}' @@ -101,6 +102,7 @@ jobs: uses: ./.github/workflows/_cocoapods.yml with: product: ${{ matrix.product }} + test_xcode27: true supports_swift6: true setup_command: scripts/update_vertexai_responses.sh From 3efb5449dfd654f895781e60270e444c5933d747 Mon Sep 17 00:00:00 2001 From: Andrew Heard Date: Thu, 16 Jul 2026 16:03:33 -0400 Subject: [PATCH 4/6] Update `matrix` excludes approach --- .github/workflows/_cocoapods.yml | 8 ++------ .github/workflows/_spm.yml | 8 ++------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/.github/workflows/_cocoapods.yml b/.github/workflows/_cocoapods.yml index 2277d107bbd..7becdd31be3 100644 --- a/.github/workflows/_cocoapods.yml +++ b/.github/workflows/_cocoapods.yml @@ -125,12 +125,7 @@ on: jobs: pod-lib-lint: # Run on the main repo's scheduled jobs or pull requests and manual workflow invocations. - if: >- - ((github.repository == 'firebase/firebase-ios-sdk' && - github.event_name == 'schedule') || - contains(fromJSON('["pull_request", "workflow_dispatch"]'), - github.event_name)) && - (matrix.xcode != 'Xcode_27.0' || inputs.test_xcode27) + if: (github.repository == 'firebase/firebase-ios-sdk' && github.event_name == 'schedule') || contains(fromJSON('["pull_request", "workflow_dispatch"]'), github.event_name) strategy: fail-fast: false matrix: @@ -150,6 +145,7 @@ jobs: xcode: Xcode_26.2 - os: xcode-27 xcode: Xcode_26.4 + - xcode: ${{ !inputs.test_xcode27 && 'Xcode_27.0' || 'none' }} runs-on: ${{ matrix.os }} steps: - name: Skip, if applicable. diff --git a/.github/workflows/_spm.yml b/.github/workflows/_spm.yml index f5323391d15..8156402aa98 100644 --- a/.github/workflows/_spm.yml +++ b/.github/workflows/_spm.yml @@ -125,12 +125,7 @@ jobs: spm: # Run on the main repo's scheduled jobs or pull requests and manual workflow invocations. - if: >- - ((github.repository == 'firebase/firebase-ios-sdk' && - github.event_name == 'schedule') || - contains(fromJSON('["pull_request", "workflow_dispatch"]'), - github.event_name)) && - (matrix.xcode != 'Xcode_27.0' || inputs.test_xcode27) + if: (github.repository == 'firebase/firebase-ios-sdk' && github.event_name == 'schedule') || contains(fromJSON('["pull_request", "workflow_dispatch"]'), github.event_name) needs: [spm-package-resolved] env: FIREBASE_IS_NIGHTLY_TESTING: ${{ inputs.is_nightly && '1' || '' }} @@ -153,6 +148,7 @@ jobs: xcode: Xcode_26.2 - os: xcode-27 xcode: Xcode_26.4 + - xcode: ${{ !inputs.test_xcode27 && 'Xcode_27.0' || 'none' }} runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1 From d9efb106ca556eb4c15f0e85b9059d6288ed0bad Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 21 Jul 2026 14:58:57 -0400 Subject: [PATCH 5/6] global gemfile --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 6ed9ddccfb2..5bb44f28673 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,5 @@ # To update, change version below, run bundle install, test, +# touch # commit Gemfile and Gemfile.lock. source 'https://rubygems.org' From 619dc24026d47ab91b0b811c0bcc17d9ccca8f2f Mon Sep 17 00:00:00 2001 From: Nick Cooke Date: Tue, 21 Jul 2026 15:19:57 -0400 Subject: [PATCH 6/6] ci: address PR feedback regarding Xcode 27 SPM testing - Revert Gemfile and _cocoapods.yml changes - Revert AI SDK's _cocoapods.yml changes - Enable Xcode 27 testing for Auth and Firestore SPM - Enable Xcode 27 testing for client-app SPM --- .github/workflows/_cocoapods.yml | 19 ++----------------- .../workflows/infra.samples.client_app.yml | 8 ++++++-- .github/workflows/sdk.ai.yml | 1 - .github/workflows/sdk.auth.yml | 1 + .github/workflows/sdk.firestore.yml | 1 + Gemfile | 1 - 6 files changed, 10 insertions(+), 21 deletions(-) diff --git a/.github/workflows/_cocoapods.yml b/.github/workflows/_cocoapods.yml index 7becdd31be3..53226313112 100644 --- a/.github/workflows/_cocoapods.yml +++ b/.github/workflows/_cocoapods.yml @@ -116,12 +116,6 @@ on: required: false default: 20 - # Whether to test Xcode 27. Defaults to false. - test_xcode27: - type: boolean - required: false - default: false - jobs: pod-lib-lint: # Run on the main repo's scheduled jobs or pull requests and manual workflow invocations. @@ -129,23 +123,14 @@ jobs: strategy: fail-fast: false matrix: - os: [macos-15, macos-26, xcode-27] - xcode: [Xcode_26.2, Xcode_26.4, Xcode_27.0] + os: [macos-15, macos-26] + xcode: [Xcode_26.2, Xcode_26.4] platform: [iOS, tvOS, macOS, watchOS] exclude: - os: macos-15 xcode: Xcode_26.4 - - os: macos-15 - xcode: Xcode_27.0 - - os: macos-26 - xcode: Xcode_26.2 - os: macos-26 - xcode: Xcode_27.0 - - os: xcode-27 xcode: Xcode_26.2 - - os: xcode-27 - xcode: Xcode_26.4 - - xcode: ${{ !inputs.test_xcode27 && 'Xcode_27.0' || 'none' }} runs-on: ${{ matrix.os }} steps: - name: Skip, if applicable. diff --git a/.github/workflows/infra.samples.client_app.yml b/.github/workflows/infra.samples.client_app.yml index d453fd1eada..18656e013dc 100644 --- a/.github/workflows/infra.samples.client_app.yml +++ b/.github/workflows/infra.samples.client_app.yml @@ -33,10 +33,12 @@ jobs: #TODO(ncooke3): Add multi-platform support: tvOS, macOS, catalyst platform: [iOS] scheme: [ClientApp] - os: [macos-15] + os: [macos-15, xcode-27] include: - os: macos-15 xcode: Xcode_26.2 + - os: xcode-27 + xcode: Xcode_27.0 uses: ./.github/workflows/_build.yml with: product: ${{ matrix.scheme }} @@ -51,10 +53,12 @@ jobs: #TODO(ncooke3): Add multi-platform support: tvOS, macOS, catalyst platform: [iOS] scheme: [ClientApp] - os: [macos-15] + os: [macos-15, xcode-27] include: - os: macos-15 xcode: Xcode_26.2 + - os: xcode-27 + xcode: Xcode_27.0 uses: ./.github/workflows/_build.yml with: product: ${{ matrix.scheme }} diff --git a/.github/workflows/sdk.ai.yml b/.github/workflows/sdk.ai.yml index 1266cd0712e..4f682a66f17 100644 --- a/.github/workflows/sdk.ai.yml +++ b/.github/workflows/sdk.ai.yml @@ -102,7 +102,6 @@ jobs: uses: ./.github/workflows/_cocoapods.yml with: product: ${{ matrix.product }} - test_xcode27: true supports_swift6: true setup_command: scripts/update_vertexai_responses.sh diff --git a/.github/workflows/sdk.auth.yml b/.github/workflows/sdk.auth.yml index 129d2ea2205..1e06d281b60 100644 --- a/.github/workflows/sdk.auth.yml +++ b/.github/workflows/sdk.auth.yml @@ -33,6 +33,7 @@ jobs: uses: ./.github/workflows/_spm.yml with: target: AuthUnit + test_xcode27: true buildonly_platforms: macOS catalyst: diff --git a/.github/workflows/sdk.firestore.yml b/.github/workflows/sdk.firestore.yml index 54b9a9addd9..528f1da1ec4 100644 --- a/.github/workflows/sdk.firestore.yml +++ b/.github/workflows/sdk.firestore.yml @@ -637,6 +637,7 @@ jobs: uses: ./.github/workflows/_spm.yml with: target: FirebaseFirestoreTests + test_xcode27: true platforms: iOS spm-source-cron: diff --git a/Gemfile b/Gemfile index 5bb44f28673..6ed9ddccfb2 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,4 @@ # To update, change version below, run bundle install, test, -# touch # commit Gemfile and Gemfile.lock. source 'https://rubygems.org'