Bläddra i källkod

[Infra] Refactor release workflow

Nick Cooke 8 månader sedan
förälder
incheckning
c8fd91cef4
2 ändrade filer med 141 tillägg och 359 borttagningar
  1. 74 359
      .github/workflows/release.yml
  2. 67 0
      .github/workflows/reusable-quickstart.yml

+ 74 - 359
.github/workflows/release.yml

@@ -141,365 +141,80 @@ jobs:
       if: ${{ always() }}
       run: pod repo remove "${local_repo}"
 
-  abtesting_quickstart:
+  quickstart_tests:
     # Don't run on private repo unless it is a PR.
     if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
     needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      env:
-        LEGACY: true
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh abtesting nightly_release_testing
-    - 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 swift quickstart
-      env:
-        LEGACY: true
-      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh ABTesting true)
-    - name: Remove data before upload
-      env:
-        LEGACY: true
-      if: ${{ failure() }}
-      run: scripts/remove_data.sh config
-    - uses: actions/upload-artifact@v4
-      if: ${{ failure() }}
-      with:
-        name: quickstart_artifacts_abtesting
-        path: quickstart-ios/
-
-  auth_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-    runs-on: macos-15
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Xcode
-      run: sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh Authentication nightly_release_testing
-    - name: Install Secret GoogleService-Info.plist
-      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-auth.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.sh Authentication false)
-    - name: Remove data before upload
-      if: ${{ failure() }}
-      run: scripts/remove_data.sh authentication
-    - uses: actions/upload-artifact@v4
-      if: ${{ failure() }}
-      with:
-        name: quickstart_artifacts_auth
-        path: quickstart-ios/
-
-  crashlytics_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      env:
-        LEGACY: true
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh Crashlytics nightly_release_testing
-    - 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 swift quickstart
-      env:
-        LEGACY: true
-      run: |
-        mkdir -p quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Pods/FirebaseCrashlytics
-        # Set the deployed pod location of run and upload-symbols with the development pod version.
-        cp Crashlytics/run quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Pods/FirebaseCrashlytics/
-        cp Crashlytics/upload-symbols quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Pods/FirebaseCrashlytics/
-        ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Crashlytics true 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/
-
-  database_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh database nightly_release_testing
-    - 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 objc quickstart
-      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Database false)
-    - name: Test swift quickstart
-      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Database false swift)
-    - 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/
-
-  firestore_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh firestore nightly_release_testing
-    - 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 swift quickstart
-      run: ([ -z $plist_secret ] ||
-            scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Firestore false)
-    - name: Remove data before upload
-      if: ${{ failure() }}
-      run: scripts/remove_data.sh firestore
-    - uses: actions/upload-artifact@v4
-      if: ${{ failure() }}
-      with:
-        name: quickstart_artifacts_firestore
-        path: quickstart-ios/
-
-  # TODO: The functions quickstart uses Material which isn't supported by Xcode 15
-  # functions_quickstart:
-  #   # Don't run on private repo unless it is a PR.
-  #   if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-  #   needs: buildup_SpecsReleasing_repo
-  #   env:
-  #     plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-  #     signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-  #     botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-  #     testing_repo_dir: "/tmp/test/"
-  #     testing_repo: "firebase-ios-sdk"
-  #     LEGACY: true
-  #   runs-on: macos-12
-  #   steps:
-  #   - uses: actions/checkout@v4
-  #   - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-  #   - name: Setup testing repo and quickstart
-  #     run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh functions nightly_release_testing
-  #   - name: install secret googleservice-info.plist
-  #     run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-functions.plist.gpg \
-  #         quickstart-ios/functions/GoogleService-Info.plist "$plist_secret"
-  #   - name: Setup custom URL scheme
-  #     run: sed -i '' 's/REVERSED_CLIENT_ID/com.googleusercontent.apps.1025801074639-6p6ebi8amuklcjrto20gvpe295smm8u6/' quickstart-ios/functions/LegacyFunctionsQuickstart/FunctionsExample/Info.plist
-  #   - name: Test objc quickstart
-  #     run: ([ -z $plist_secret ] ||
-  #           scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Functions true)
-  #   - name: Test swift quickstart
-  #     run: ([ -z $plist_secret ] ||
-  #           scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Functions true swift)
-  #   - name: Remove data before upload
-  #     if: ${{ failure() }}
-  #     run: scripts/remove_data.sh functions
-  #   - uses: actions/upload-artifact@v4
-  #     if: ${{ failure() }}
-  #     with:
-  #       name: quickstart_artifacts_functions
-  #       path: quickstart-ios/
-
-  inappmessaging_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh inappmessaging nightly_release_testing
-    - 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 objc quickstart
-      run: ([ -z $plist_secret ] ||
-            scripts/third_party/travis/retry.sh scripts/test_quickstart.sh InAppMessaging true)
-    - name: Test swift quickstart
-      run: ([ -z $plist_secret ] ||
-            scripts/third_party/travis/retry.sh scripts/test_quickstart.sh InAppMessaging true 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/
-
-  messaging_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh messaging nightly_release_testing
-    - 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 objc quickstart
-      run: ([ -z $plist_secret ] ||
-            scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Messaging false)
-    - name: Test swift quickstart
-      run: ([ -z $plist_secret ] ||
-            scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Messaging false 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/
-
-  remoteconfig_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh config nightly_release_testing
-    - 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.sh Config true)
-    - 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/
-
-  storage_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-      LEGACY: true
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh storage nightly_release_testing
-    - 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 swift quickstart
-      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Storage true swift)
-    - name: Remove data before upload
-      if: ${{ failure() }}
-      run: scripts/remove_data.sh storage
-    - uses: actions/upload-artifact@v4
-      if: ${{ failure() }}
-      with:
-        name: quickstart_artifacts_storage
-        path: quickstart-ios/
-
-  performance_quickstart:
-    # Don't run on private repo unless it is a PR.
-    if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request' || github.event_name == 'workflow_dispatch'
-    needs: buildup_SpecsReleasing_repo
-    env:
-      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
-      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
-      testing_repo_dir: "/tmp/test/"
-      testing_repo: "firebase-ios-sdk"
-    runs-on: macos-14
-    steps:
-    - uses: actions/checkout@v4
-    - uses: ruby/setup-ruby@354a1ad156761f5ee2b7b13fa8e09943a5e8d252 # v1
-    - name: Setup testing repo and quickstart
-      run: BOT_TOKEN="${botaccess}" scripts/setup_quickstart.sh Performance nightly_release_testing
-    - name: Install Secret GoogleService-Info.plist
-      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-performance.plist.gpg \
-          quickstart-ios/performance/GoogleService-Info.plist "$plist_secret"
-    - name: Test swift quickstart
-      run: ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Performance true swift)
-    - name: Remove data before upload
-      if: ${{ failure() }}
-      run: scripts/remove_data.sh performance
-    - uses: actions/upload-artifact@v4
-      if: ${{ failure() }}
-      with:
-        name: quickstart_artifacts_performance
-        path: quickstart-ios/
+    strategy:
+      fail-fast: false
+      matrix:
+        include:
+          - quickstart-name: "abtesting"
+            legacy: true
+            runs-on: "macos-14"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh ABTesting true)"
+            remove-data-command: "scripts/remove_data.sh config"
+          - quickstart-name: "auth"
+            runs-on: "macos-15"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Authentication false)"
+            xcode-version: "16.2"
+            setup-command: "BOT_TOKEN=\"${botaccess}\" scripts/setup_quickstart.sh Authentication nightly_release_testing"
+            remove-data-command: "scripts/remove_data.sh authentication"
+          - quickstart-name: "crashlytics"
+            legacy: true
+            runs-on: "macos-14"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Crashlytics true swift)"
+            extra-setup-command: |
+              mkdir -p quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Pods/FirebaseCrashlytics
+              cp Crashlytics/run quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Pods/FirebaseCrashlytics/
+              cp Crashlytics/upload-symbols quickstart-ios/crashlytics/LegacyCrashlyticsQuickstart/Pods/FirebaseCrashlytics/
+            setup-command: "BOT_TOKEN=\"${botaccess}\" scripts/setup_quickstart.sh Crashlytics nightly_release_testing"
+            remove-data-command: "scripts/remove_data.sh crashlytics"
+          - quickstart-name: "database"
+            runs-on: "macos-14"
+            test-command: |
+              ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Database false)
+              ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Database false swift)
+            remove-data-command: "scripts/remove_data.sh database"
+          - quickstart-name: "firestore"
+            runs-on: "macos-14"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Firestore false)"
+            remove-data-command: "scripts/remove_data.sh firestore"
+          - quickstart-name: "inappmessaging"
+            runs-on: "macos-14"
+            test-command: |
+              ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh InAppMessaging true)
+              ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh InAppMessaging true swift)
+            remove-data-command: "scripts/remove_data.sh inappmessaging"
+          - quickstart-name: "messaging"
+            runs-on: "macos-14"
+            test-command: |
+              ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Messaging false)
+              ([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Messaging false swift)
+            remove-data-command: "scripts/remove_data.sh messaging"
+          - quickstart-name: "remoteconfig"
+            runs-on: "macos-14"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Config true)"
+            setup-command: "BOT_TOKEN=\"${botaccess}\" scripts/setup_quickstart.sh config nightly_release_testing"
+            remove-data-command: "scripts/remove_data.sh config"
+          - quickstart-name: "storage"
+            legacy: true
+            runs-on: "macos-14"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Storage true swift)"
+            remove-data-command: "scripts/remove_data.sh storage"
+          - quickstart-name: "performance"
+            runs-on: "macos-14"
+            test-command: "([ -z $plist_secret ] || scripts/third_party/travis/retry.sh scripts/test_quickstart.sh Performance true swift)"
+            setup-command: "BOT_TOKEN=\"${botaccess}\" scripts/setup_quickstart.sh Performance nightly_release_testing"
+            remove-data-command: "scripts/remove_data.sh performance"
+    uses: ./.github/workflows/reusable-quickstart.yml@main
+    with:
+      quickstart-name: ${{ matrix.quickstart-name }}
+      legacy: ${{ matrix.legacy }}
+      runs-on: ${{ matrix.runs-on }}
+      test-command: ${{ matrix.test-command }}
+      extra-setup-command: ${{ matrix.extra-setup-command }}
+      xcode-version: ${{ matrix.xcode-version }}
+    secrets:
+      GHASecretsGPGPassphrase1: ${{ secrets.GHASecretsGPGPassphrase1 }}
+      RELEASE_TESTING_PAT: ${{ secrets.RELEASE_TESTING_PAT }}

+ 67 - 0
.github/workflows/reusable-quickstart.yml

@@ -0,0 +1,67 @@
+name: Reusable Quickstart Test
+
+on:
+  workflow_call:
+    inputs:
+      quickstart-name:
+        required: true
+        type: string
+      legacy:
+        required: false
+        type: boolean
+        default: false
+      runs-on:
+        required: true
+        type: string
+      test-command:
+        required: true
+        type: string
+      extra-setup-command:
+        required: false
+        type: string
+      post-test-command:
+        required: false
+        type: string
+      xcode-version:
+        required: false
+        type: string
+    secrets:
+      GHASecretsGPGPassphrase1:
+        required: true
+      RELEASE_TESTING_PAT:
+        required: true
+
+jobs:
+  quickstart:
+    runs-on: ${{ inputs.runs-on }}
+    env:
+      plist_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
+      signin_secret: ${{ secrets.GHASecretsGPGPassphrase1 }}
+      botaccess: ${{ secrets.RELEASE_TESTING_PAT }}
+      LEGACY: ${{ inputs.legacy }}
+    steps:
+    - uses: actions/checkout@v4
+    - uses: ruby/setup-ruby@v1
+    - name: Select Xcode version
+      if: ${{ inputs.xcode-version }}
+      run: sudo xcode-select -s /Applications/Xcode_${{ inputs.xcode-version }}.app/Contents/Developer
+    - name: Setup testing repo and quickstart
+      run: BOT_TOKEN="${{ secrets.RELEASE_TESTING_PAT }}" scripts/setup_quickstart.sh ${{ inputs.quickstart-name }} nightly_release_testing
+    - name: Extra setup
+      if: ${{ inputs.extra-setup-command }}
+      run: ${{ inputs.extra-setup-command }}
+    - name: Install Secret GoogleService-Info.plist
+      run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/qs-${{ inputs.quickstart-name }}.plist.gpg quickstart-ios/${{ inputs.quickstart-name }}/GoogleService-Info.plist "$plist_secret"
+    - name: Test quickstart
+      run: ${{ inputs.test-command }}
+    - name: Post-test
+      if: ${{ inputs.post-test-command }}
+      run: ${{ inputs.post-test-command }}
+    - name: Remove data before upload
+      if: ${{ failure() }}
+      run: scripts/remove_data.sh ${{ inputs.quickstart-name }}
+    - uses: actions/upload-artifact@v4
+      if: ${{ failure() }}
+      with:
+        name: quickstart_artifacts_${{ inputs.quickstart-name }}
+        path: quickstart-ios/