name: zip

permissions:
  actions: read
  contents: read

on:
  pull_request:
    paths:
    - 'ReleaseTooling/Sources/**'
    - '.github/workflows/zip.yml'
    - 'scripts/build_non_firebase_sdks.sh'
    - 'scripts/build_zip.sh'
    - 'scripts/setup_quickstart_framework.sh'
    - 'Gemfile*'
    # Don't run based on any markdown only changes.
    - '!ReleaseTooling/*.md'
  schedule:
    # Run every day at 9pm (PDT) / 12am (EDT) - cron uses UTC times
    - cron:  '0 4 * * *'

  workflow_dispatch:
    inputs:
      custom_spec_repos:
        description: 'Custom Podspec repos'
        required: true
        default: 'https://github.com/firebase/SpecsStaging.git'
      zip_run_id:
        # For example, in the below URL, `17335533279` is the run ID:
        # - https://github.com/firebase/firebase-ios-sdk/actions/runs/17335533279
        description: 'Run ID of a previous successful zip workflow to use for quickstart testing'
        required: false
        default: ''

concurrency:
    group: ${{ github.workflow }}-${{ github.head_ref || github.ref }}
    cancel-in-progress: true

jobs:
  package-release:
    # Don't run on private repo.
    if: |
      github.repository == 'firebase/firebase-ios-sdk' &&
      contains(fromJSON('["schedule", "pull_request", "workflow_dispatch"]'), github.event_name) &&
      github.event.inputs.zip_run_id == ''
    runs-on: macos-14
    steps:
    - uses: actions/checkout@v4
    - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
      with:
        cache_key: package-release
    - name: Xcode 16.2
      run: sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: ZipBuildingTest
      run: |
         mkdir -p release_zip_dir
         sh -x scripts/build_zip.sh release_zip_dir \
           "${{ github.event.inputs.custom_spec_repos || 'https://github.com/firebase/SpecsStaging.git' }}" \
           build-release \
           static
    - uses: actions/upload-artifact@v4
      with:
        name: Firebase-release-zip-zip
        # Zip the entire output directory since the builder adds subdirectories we don't know the
        # name of.
        path: release_zip_dir

  build:
    # Don't run on private repo unless it is a PR.
    if: |
      github.repository == 'firebase/firebase-ios-sdk' &&
      contains(fromJSON('["schedule", "pull_request", "workflow_dispatch"]'), github.event_name) &&
      github.event.inputs.zip_run_id == ''
    runs-on: macos-14
    steps:
    - uses: actions/checkout@v4
    - name: Xcode 16.2
      run: sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
    - name: Build
      run: |
        cd ReleaseTooling
        swift build -v

  package-head:
    needs: build
    strategy:
      matrix:
        linking_type: [static, dynamic]
    runs-on: macos-14
    steps:
    - uses: actions/checkout@v4
    - uses: mikehardy/buildcache-action@c87cea0ccd718971d6cc39e672c4f26815b6c126
      with:
        cache_key: package-head
    - name: Xcode 16.2
      run: sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: ZipBuildingTest
      run: |
         mkdir -p zip_output_dir
         sh -x scripts/build_zip.sh \
           zip_output_dir "${{ github.event.inputs.custom_spec_repos || 'https://github.com/firebase/SpecsStaging.git,https://github.com/firebase/SpecsDev.git' }}" \
           build-head \
           ${{ matrix.linking_type }}
    - uses: actions/upload-artifact@v4
      if: ${{ always() }}
      with:
        name: ${{ matrix.linking_type == 'static' && 'Firebase-actions-dir' || 'Firebase-actions-dir-dynamic' }}
        # Zip the entire output directory since the builder adds subdirectories we don't know the
        # name of.
        path: zip_output_dir

  quickstart_framework_abtesting:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "ABTesting"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      env:
        LEGACY: true
      run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseRemoteConfig/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/FirebaseCore.xcframework \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/FirebaseCoreInternal.xcframework \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/FBLPromises.xcframework \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/FirebaseInstallations.xcframework \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/GoogleUtilities.xcframework
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-abtesting.plist.gpg \
        quickstart-ios/abtesting/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      env:
        LEGACY: true
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Remove data before upload
      env:
        LEGACY: true
      if: ${{ failure() }}
      run: scripts/remove_data.sh abtesting
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_abtesting
        path: quickstart-ios/

  quickstart_framework_auth:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK:  "Authentication"
    strategy:
      matrix:
        os: [macos-15]
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        include:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - name: Setup Swift Quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}Example" NON_FIREBASE_SDKS="FBSDKLoginKit FBSDKCoreKit FBSDKCoreKit_Basics FBAEMKit" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/NonFirebaseSDKs/* \
                                               "${HOME}"/ios_frameworks/Firebase/GoogleSignIn/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAuth/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-authentication.plist.gpg \
        quickstart-ios/authentication/GoogleService-Info.plist "$plist_secret"
    - name: Test Swift Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Remove data before upload
      if: ${{ failure() }}
      run: scripts/remove_data.sh authentiation
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_auth
        path: quickstart-ios/

  quickstart_framework_config:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "Config"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - name: Setup Swift Quickstart

      run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseRemoteConfig/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-config.plist.gpg \
        quickstart-ios/config/GoogleService-Info.plist "$plist_secret"
    - name: Test Swift Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Remove data before upload
      if: ${{ failure() }}
      run: scripts/remove_data.sh config
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_config
        path: quickstart-ios/

  quickstart_framework_crashlytics:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "Crashlytics"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      env:
        LEGACY: true
      run: |
              SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseCrashlytics/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
              cp quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Firebase/run quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart
              cp quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Firebase/upload-symbols quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart
              chmod +x quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/run
              chmod +x quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/upload-symbols
    # TODO(#8057): Restore Swift Quickstart
    # - name: Setup swift quickstart
    #   env:
    #     LEGACY: true
    #   run: |
    #           SAMPLE="$SDK" TARGET="${SDK}ExampleSwift" NON_FIREBASE_SDKS="ReachabilitySwift" scripts/setup_quickstart_framework.sh \
    #                                            "${HOME}"/ios_frameworks/Firebase/NonFirebaseSDKs/*
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-crashlytics.plist.gpg \
        quickstart-ios/crashlytics/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      env:
        LEGACY: true
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    # TODO(#8057): Restore Swift Quickstart
    # - name: Test Swift Quickstart
    #   env:
    #     LEGACY: true
    #   run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}" swift)
    - name: Remove data before upload
      env:
        LEGACY: true
      if: ${{ failure() }}
      run: scripts/remove_data.sh crashlytics
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_crashlytics
        path: quickstart-ios/

  quickstart_framework_database:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "Database"
    strategy:
      matrix:
        os: [macos-14]
        xcode: [Xcode_16.2]
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}Example" NON_FIREBASE_SDKS="FirebaseDatabaseUI" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseDatabase/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseStorage/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseFirestore/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAuth/* \
                                               "${HOME}"/ios_frameworks/Firebase/NonFirebaseSDKs/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-database.plist.gpg \
        quickstart-ios/database/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Remove data before upload
      if: ${{ failure() }}
      run: scripts/remove_data.sh database
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts database
        path: quickstart-ios/

  quickstart_framework_firebaseai:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "FirebaseAI"
      # This is a workaround to use the FirebaseAIExampleZip scheme that does not have the SPM dependency.
      SWIFT_SUFFIX: "Zip"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}ExampleZip" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAILogic/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/FirebaseAI/TestApp-GoogleService-Info.plist.gpg \
        quickstart-ios/firebaseai/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Remove data before upload
      if: ${{ failure() }}
      run: scripts/remove_data.sh firebaseai
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_firebaseai
        path: quickstart-ios/

  quickstart_framework_firestore:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "Firestore"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}Example" NON_FIREBASE_SDKS="SDWebImage FirebaseAuthUI FirebaseEmailAuthUI" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/NonFirebaseSDKs/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseFirestore/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAuth/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Upload build logs on failure
      if: ${{ failure() }}
      uses: actions/upload-artifact@v4
      with:
        name: build_logs_firestore_${{ matrix.artifact }}_${{ matrix.build-env.os }}
        path: sdk_zip/build_logs/
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-firestore.plist.gpg \
        quickstart-ios/firestore/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Remove data before upload and zip directory to reduce upload size.
      if: ${{ failure() }}
      run: scripts/remove_data.sh firestore; zip -r --symlinks quickstart_artifacts_firestore.zip quickstart-ios/
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_firestore_${{ matrix.artifact }}_${{ matrix.build-env.os }}
        path: quickstart_artifacts_firestore.zip

  check_framework_firestore_symbols:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT: 1
    runs-on: macos-14
    steps:
      - name: Xcode 16.2
        run: sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
      - uses: actions/checkout@v4
      - name: Get framework dir
        uses: actions/download-artifact@v4.1.7
        with:
          name: Firebase-actions-dir
          run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
          github-token: ${{ secrets.GITHUB_TOKEN }}
      - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
      - name: Setup Bundler
        run: ./scripts/setup_bundler.sh
      - name: Install xcpretty
        run: gem install xcpretty
      - name: Move frameworks
        run: |
          mkdir -p "${HOME}"/ios_frameworks/
          find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
      - uses: actions/checkout@v4
      - name: Check linked Firestore.xcframework for unlinked symbols.
        run: |
          scripts/check_firestore_symbols.sh \
            $(pwd) \
            "${HOME}"/ios_frameworks/Firebase/FirebaseFirestore/FirebaseFirestoreInternal.xcframework

  quickstart_framework_inappmessaging:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "InAppMessaging"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseInAppMessaging/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Setup swift quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}ExampleSwift" scripts/setup_quickstart_framework.sh
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-inappmessaging.plist.gpg \
        quickstart-ios/inappmessaging/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Test Swift Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}" swift)
    - name: Remove data before upload
      if: ${{ failure() }}
      run: scripts/remove_data.sh inappmessaging
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_inappmessaging
        path: quickstart-ios/

  quickstart_framework_messaging:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "Messaging"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseMessaging/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Setup swift quickstart
      run: SAMPLE="$SDK" TARGET="${SDK}ExampleSwift" scripts/setup_quickstart_framework.sh
    - name: Add frameworks to Crashlytics watchOS target
      run: |
        cd quickstart-ios/messaging
        "${GITHUB_WORKSPACE}"/quickstart-ios/scripts/add_framework_script.rb --sdk Messaging --target NotificationServiceExtension --framework_path Firebase/
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-messaging.plist.gpg \
        quickstart-ios/messaging/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Test Swift Quickstart
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}" swift)
    - name: Remove data before upload
      if: ${{ failure() }}
      run: scripts/remove_data.sh messaging
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_messaging
        path: quickstart-ios/

  quickstart_framework_storage:
    needs: package-head
    if: ${{ !cancelled() && (success() || github.event.inputs.zip_run_id != '') }}
    env:
      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
      SDK: "Storage"
    strategy:
      matrix:
        artifact: [Firebase-actions-dir, Firebase-actions-dir-dynamic]
        build-env:
          - os: macos-15
            xcode: Xcode_16.4
    runs-on: ${{ matrix.build-env.os }}
    steps:
    - uses: actions/checkout@v4
    - name: Get framework dir
      uses: actions/download-artifact@v4.1.7
      with:
        name: ${{ matrix.artifact }}
        run-id: ${{ github.event.inputs.zip_run_id || github.run_id }}
        github-token: ${{ secrets.GITHUB_TOKEN }}
    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
    - name: Xcode
      run: sudo xcode-select -s /Applications/${{ matrix.build-env.xcode }}.app/Contents/Developer
    - name: Setup Bundler
      run: ./scripts/setup_bundler.sh
    - name: Move frameworks
      run: |
        mkdir -p "${HOME}"/ios_frameworks/
        find "${GITHUB_WORKSPACE}" -name "Firebase*latest.zip" -exec unzip -d "${HOME}"/ios_frameworks/ {} +
    - uses: actions/checkout@v4
    - name: Setup quickstart
      env:
        LEGACY: true
      run: SAMPLE="$SDK" TARGET="${SDK}Example" scripts/setup_quickstart_framework.sh \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseStorage/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAuth/* \
                                               "${HOME}"/ios_frameworks/Firebase/FirebaseAnalytics/*
    - name: Setup swift quickstart
      env:
        LEGACY: true
      run: SAMPLE="$SDK" TARGET="${SDK}ExampleSwift" scripts/setup_quickstart_framework.sh
    - name: Install Secret GoogleService-Info.plist
      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-storage.plist.gpg \
        quickstart-ios/storage/GoogleService-Info.plist "$plist_secret"
    - name: Test Quickstart
      env:
        LEGACY: true
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}")
    - name: Test Swift Quickstart
      env:
        LEGACY: true
      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart_framework.sh "${SDK}" swift)
    - name: Remove data before upload
      env:
        LEGACY: true
      if: ${{ failure() }}
      run: scripts/remove_data.sh storage
    - uses: actions/upload-artifact@v4
      if: ${{ failure() }}
      with:
        name: quickstart_artifacts_storage
        path: quickstart-ios/
