Запуск эмулятора firebase с действиями на Github — проект iOS CI

# #swift #firebase #google-cloud-firestore #continuous-integration #github-actions

Вопрос:

Я пытаюсь запустить свои тесты на действиях Github с помощью эмулятора firebase. Эмулятор запускается, но тестовые примеры терпят неудачу. Однако, если я запускаю локально, тестовые случаи проходят. При локальном запуске я выполняю firebase emulators:start --only firestore в каталоге проекта iOS перед запуском тестов.

Ниже приведен yml файл, который у меня есть. Проблема, по-видимому, связана с заданием «unit_test» ( firebase emulators:exec --only firestore 'xcodebuild test-without-building -xctestrun $(find . -type f -name $XC_TEST_RUN) -destination "platform=iOS Simulator,name=$DEVICE" -derivedDataPath $DERIVED_DATA_PATH -enableCodeCoverage YES -only-testing:$UNIT_TEST_TARGET' )

 name: Feature Pipeline

on: [push]

jobs:
  build:
    name: Build
    env:
      SCHEME: "Hest"
      DEVICE: "iPhone 11"
      DERIVED_DATA_PATH: "DerivedData"
    runs-on: macOS-latest
    steps:
    - name: Checkout project
      uses: actions/checkout@v1
    - name: Build application
      run: |
        set -o pipefail amp;amp; xcodebuild clean -scheme $SCHEME -destination "platform=iOS Simulator,name=$DEVICE" -derivedDataPath $DERIVED_DATA_PATH build-for-testing | xcpretty --color --simple
    - name: Upload products
      uses: actions/upload-artifact@v1
      with:
        name: Products
        path: DerivedData/Build/Products

  unit_test:
    name: Unit test
    env:
      DEVICE: "iPhone 11"
      DERIVED_DATA_PATH: "DerivedData"
      UNIT_TEST_TARGET: "HestTests"
      XC_TEST_RUN: "*.xctestrun"
    runs-on: macOS-latest
    needs: build
    steps:
    - name: Checkout project
      uses: actions/checkout@v1
    - name: Download products
      uses: actions/download-artifact@v1
      with:
        name: Products
    - name: Setting up NodeJS
      uses: actions/setup-node@v1
    - name: Install Firebase CLI tools
      run: npm install -g firebase-tools
    - name: Run unit/integration tests (Execute w/ Firebase emulators)
      run: firebase emulators:exec --only firestore 'xcodebuild test-without-building -xctestrun $(find . -type f -name $XC_TEST_RUN) -destination "platform=iOS Simulator,name=$DEVICE" -derivedDataPath $DERIVED_DATA_PATH -enableCodeCoverage YES -only-testing:$UNIT_TEST_TARGET'
    - name: Upload test logs
      uses: actions/upload-artifact@v1
      with:
        name: TestLogs
        path: DerivedData/Logs/Test

  ui_test:
    name: UI test
    env:
      DEVICE: "iPhone 11"
      DERIVED_DATA_PATH: "DerivedData"
      UI_TEST_TARGET: "HestUITests"
    runs-on: macOS-latest
    needs: build
    steps:
    - name: Checkout project 
      uses: actions/checkout@v1
    - name: Download products
      uses: actions/download-artifact@v1
      with:
        name: Products
    - name: Run UI tests
      run: |
        set -o pipefail amp;amp; xcodebuild test-without-building -xctestrun $(find . -type f -name "*.xctestrun") -destination "platform=iOS Simulator,name=$DEVICE" -derivedDataPath $DERIVED_DATA_PATH -enableCodeCoverage YES -only-testing:$UI_TEST_TARGET | xcpretty  --color --simple
 

Пример тестового примера, который я запустил, следующий (не удался с CI, но прошел локально)

 let expect = XCTestExpectation(description: "Something")
Firestore.firestore().collection("Something").addDocument(data: ["Test": "That"]) { error in
    XCTAssertNil(error)
    expect.fulfill()
}
wait(for: [expect], timeout: 4)
 

Ответ №1:

Это было трудно решить, но вы должны указать a port , а также a host в firebase.json файле.

 {
  "emulators": {
    "auth": {
      "port": 9099,
      "host": "localhost"
    },
    "functions": {
      "port": 5001,
      "host": "localhost"
    },
    "firestore": {
      "port": 8080,
      "host": "localhost"
    },
    "database": {
      "port": 9000,
      "host": "localhost"
    },
    "hosting": {
      "port": 5000,
      "host": "localhost"
    },
    "pubsub": {
      "port": 8085,
      "host": "localhost"
    },
    "storage": {
      "port": 9199,
      "host": "localhost"
    },
    "ui": {
      "enabled": true
    }
  }
}