name: spm on: workflow_dispatch: pull_request: paths: - '.github/workflows/spm.yml' - 'Package.swift' - '.swiftpm/*' - 'scripts/build.sh' - 'SwiftPMTests/*' - 'SwiftPM-PlatformExclude' - 'Gemfile*' schedule: # Run every day at 1am (PDT) / 4am (EDT) - cron uses UTC times - cron: '0 8 * * *' # This workflow builds and tests the Swift Package Manager. Only iOS runs on PRs # because each platform takes 15-20 minutes after adding Firestore. concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.ref }} cancel-in-progress: true env: FIREBASE_CI: true jobs: spm-package-resolved: env: FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT: 1 runs-on: macos-14 outputs: cache_key: ${{ steps.generate_cache_key.outputs.cache_key }} steps: - uses: actions/checkout@v4 - name: Xcode run: sudo xcode-select -s /Applications/Xcode_16.2.app/Contents/Developer - name: Generate Swift Package.resolved id: swift_package_resolve run: | swift package resolve - name: Generate cache key id: generate_cache_key run: | cache_key="${{ runner.os }}-spm-${{ hashFiles('**/Package.resolved') }}" echo "cache_key=${cache_key}" >> "$GITHUB_OUTPUT" - uses: actions/cache/save@v4 id: cache with: path: .build key: ${{ steps.generate_cache_key.outputs.cache_key }} swift-build-run: # 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' needs: [spm-package-resolved] strategy: matrix: include: - os: macos-15 xcode: Xcode_16.4 test: spm - os: macos-14 xcode: Xcode_16.2 test: spm runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/cache/restore@v4 with: path: .build key: ${{needs.spm-package-resolved.outputs.cache_key}} - name: Clone mock responses for Firebase AI Logic unit tests run: scripts/update_vertexai_responses.sh - name: Xcode run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer - name: Initialize xcodebuild run: scripts/setup_spm_tests.sh - name: Functions Integration Test Server run: FirebaseFunctions/Backend/start.sh synchronous - uses: nick-fields/retry@ce71cc2ab81d554ebbe88c79ab5975992d79ba08 # v3 with: timeout_minutes: 15 max_attempts: 3 retry_wait_seconds: 120 command: scripts/build.sh Firebase-Package iOS ${{ matrix.test }} - uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: spm-build-run-${{ matrix.os }}-${{ matrix.xcode }}-logs path: xcodebuild-*.log if-no-files-found: error # Test iOS Device build since some Firestore dependencies build different files. iOS-Device: # 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' needs: [spm-package-resolved] strategy: matrix: include: - os: macos-14 xcode: Xcode_16.2 - os: macos-15 xcode: Xcode_16.4 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/cache/restore@v4 with: path: .build key: ${{needs.spm-package-resolved.outputs.cache_key}} - name: Clone mock responses for Firebase AI Logic unit tests run: scripts/update_vertexai_responses.sh - name: Xcode run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer - name: Initialize xcodebuild run: scripts/setup_spm_tests.sh - name: iOS Device and Test Build run: scripts/third_party/travis/retry.sh ./scripts/build.sh Firebase-Package iOS-device spmbuildonly - uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: spm-ios-device-${{ matrix.os }}-${{ matrix.xcode }}-logs path: xcodebuild-*.log if-no-files-found: error platforms: # 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' needs: [spm-package-resolved] strategy: matrix: # Full set of Firebase-Package tests only run on iOS. Run subset on other platforms. # visionOS isn't buildable from here (even with Firestore source) because the test # targets need Analytics. target: [tvOS, macOS, catalyst] include: - os: macos-15 xcode: Xcode_16.4 - os: macos-14 xcode: Xcode_16.2 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: actions/cache/restore@v4 with: path: .build key: ${{needs.spm-package-resolved.outputs.cache_key}} - name: Xcode run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer - name: Initialize xcodebuild run: scripts/setup_spm_tests.sh - name: Objc Import Tests run: scripts/third_party/travis/retry.sh ./scripts/build.sh objc-import-test ${{ matrix.target }} spm - name: Swift Tests run: scripts/third_party/travis/retry.sh ./scripts/build.sh swift-test ${{ matrix.target }} spm - name: Version Tests run: scripts/third_party/travis/retry.sh ./scripts/build.sh version-test ${{ matrix.target }} spm - name: Analytics Build Tests run: scripts/third_party/travis/retry.sh ./scripts/build.sh analytics-import-test ${{ matrix.target }} spm - uses: actions/upload-artifact@v4 if: ${{ failure() }} with: name: spm-platforms-${{ matrix.target }}-${{ matrix.os }}-${{ matrix.xcode }}-logs path: xcodebuild-*.log if-no-files-found: error