name: Build Apple Apps
on:
  push:
    branches:
    - main
  pull_request:
    branches:
    - "*"
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true
jobs:
  build:
    name: Build App (${{ matrix.platform }})
    runs-on: macos-14
    strategy:
      fail-fast: false
      matrix:
        include:
        - scheme: App
          destination: generic/platform=iOS
          platform: iOS
          sdk-name: iphoneos
          rust-targets:
          - aarch64-apple-ios
        - scheme: App
          destination: platform=iOS Simulator,OS=18.0,name=iPhone 15 Pro
          platform: iOS Simulator
          sdk-name: iphonesimulator
          rust-targets:
          - aarch64-apple-ios-sim
          - x86_64-apple-ios
        - scheme: App
          destination: platform=macOS
          platform: macOS
          sdk-name: macos
          rust-targets:
          - x86_64-apple-darwin
          - aarch64-apple-darwin
    env:
      DEVELOPER_DIR: /Applications/Xcode_16.0.app/Contents/Developer
      PROTOC_PATH: /opt/homebrew/bin/protoc
    steps:
    - name: Checkout
      uses: actions/checkout@v3
      with:
        ssh-key: ${{ secrets.DEPLOY_KEY }}
        submodules: recursive
    - name: Import Certificate
      uses: ./.github/actions/import-cert
      with:
        certificate: ${{ secrets.DEVELOPER_CERT }}
        password: ${{ secrets.DEVELOPER_CERT_PASSWORD }}
    - name: Install Rust
      uses: dtolnay/rust-toolchain@stable
      with:
        targets: ${{ join(matrix.rust-targets, ', ') }}
    - name: Install Protobuf
      shell: bash
      run: brew install protobuf
    - name: Build
      id: build
      uses: ./.github/actions/build-for-testing
      with:
        scheme: ${{ matrix.scheme }}
        destination: ${{ matrix.destination }}
        app-store-key: ${{ secrets.APPSTORE_KEY }}
        app-store-key-id: ${{ secrets.APPSTORE_KEY_ID }}
        app-store-key-issuer-id: ${{ secrets.APPSTORE_KEY_ISSUER_ID }}
    - name: Run Unit Tests
      if: ${{ matrix.xcode-unit-test != '' }}
      continue-on-error: true
      uses: ./.github/actions/test-without-building
      with:
        scheme: ${{ matrix.scheme }}
        destination: ${{ matrix.destination }}
        test-plan: ${{ matrix.xcode-unit-test }}
        artifact-prefix: unit-tests-${{ matrix.sdk-name }}
        check-name: Xcode Unit Tests (${{ matrix.platform }})
    - name: Run UI Tests
      if: ${{ matrix.xcode-ui-test != '' }}
      continue-on-error: true
      uses: ./.github/actions/test-without-building
      with:
        scheme: ${{ matrix.scheme }}
        destination: ${{ matrix.destination }}
        test-plan: ${{ matrix.xcode-ui-test }}
        artifact-prefix: ui-tests-${{ matrix.sdk-name }}
        check-name: Xcode UI Tests (${{ matrix.platform }})