GitHub Actions Эмулятор Android не загружается на macOS Runner для UI-тестов

Вопрос или проблема

Я запускаю UI-тест на GitHub Actions с использованием macOS runner и действия ReactiveCircus/android-emulator-runner@v2. Эмулятор запускается, но, кажется, не удается подключиться через adb. Я установил emulator-port: 5556 и увеличил emulator-boot-timeout до 1200, но тест не может обнаружить устройство. Есть идеи, как гарантировать правильный запуск эмулятора? Вот текущая настройка:

name: Android UI Tests

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  ui_tests:
    # Используйте macOS runner для поддержки аппаратного ускорения с HAXM
    runs-on: macos-latest

    steps:
    # 1. Клонировать репозиторий
    - name: Проверить репозиторий
      uses: actions/checkout@v2

    # 2. Настроить JDK 17 (необходимо для нового SDK Manager)
    - name: Настроить JDK 17
      uses: actions/setup-java@v2
      with:
        distribution: 'zulu'
        java-version: '17'

    # 3. Настроить Android SDK
    - name: Настроить Android SDK
      uses: android-actions/setup-android@v2
      with:
        api-level: 30
        build-tools: 30.0.3
        cache: gradle

    # 4. Запустить Android эмулятор для UI-тестов
    - name: Запустить Android эмулятор
      uses: ReactiveCircus/android-emulator-runner@v2
      with:
        api-level: 30
        target: default
        arch: x86_64
        profile: Nexus 6
        emulator-options: "-no-window -no-audio"
        disable-animations: true
        emulator-port: 5556            # Использовать конкретный порт
        emulator-boot-timeout: 1200    # 20 минут
        force-avd-creation: true
        script: echo "Запуск эмулятора"

    # 5. Проверить соединение ADB
    - name: Проверить состояние эмулятора
      run: adb devices

    # 6. Подождать, пока Android эмулятор загрузится (с таймаутом)
    - name: Подождать, пока Android эмулятор загрузится
      run: |
        boot_timeout=300 # Установить таймаут на 5 минут
        boot_time=0
        until adb shell getprop sys.boot_completed | grep -m 1 '1'; do
          if [ $boot_time -ge $boot_timeout ]; then
            echo "Таймаут загрузки эмулятора истек после $boot_timeout секунд."
            adb -s emulator-5556 emu kill # Завершить работу эмулятора
            exit 1
          fi
          echo "Ожидание загрузки эмулятора..."
          sleep 10
          boot_time=$((boot_time + 10))
        done
        echo "Эмулятор успешно загружен."

    # 7. Проверить журнал эмулятора (по желанию, для устранения неполадок)
    - name: Напечатать журнал эмулятора
      run: adb logcat -d

    # 8. Запустить UI-тесты
    - name: Запустить UI-тесты
      run: ./gradlew connectedAndroidTest

    # 9. Загрузить результаты UI-тестов (по желанию)
    - name: Загрузить результаты UI-тестов
      if: failure()
      uses: actions/upload-artifact@v3
      with:
        name: ui-test-results
        path: app/build/reports/androidTests/connected

здесь:

adb: не найдено устройств/эмуляторов
Ожидание загрузки эмулятора...
adb: не найдено устройств/эмуляторов
Ожидание загрузки эмулятора...
adb: не найдено устройств/эмуляторов
Таймаут загрузки эмулятора истек после 300 секунд.
ошибка: не удалось подключиться к TCP порту 5554: Соединение отклонено
Ошибка: Процесс завершился с кодом выхода 1.

Ответ или решение

Проблема запуска эмулятора Android на macOS Runner в GitHub Actions

Запуск UI-тестов на Android с использованием эмулятора в GitHub Actions может представлять определенные трудности, особенно в среде macOS. Вы описали проблему с тем, что эмулятор запускается, но не удается подключиться к adb, и тест не может обнаружить устройство. Рассмотрим возможные шаги для устранения этой проблемы.

1. Проверка конфигурации GitHub Actions

Ваш YAML файл содержит все необходимые шаги для установки JDK, SDK и запуска эмулятора. Однако, несколько аспектов стоит дополнительно проверить:

  • Версия эмулятора: Убедитесь, что используемая версия ReactiveCircus/android-emulator-runner@v2 совместима с API уровнем 30 и архитектурой x86_64.

  • Параметры эмулятора: Опция -no-window может вызывать определенные проблемы, так как эмулятор может работать с графическим интерфейсом. Попробуйте запустить эмулятор без этой опции, чтобы убедиться, что визуализация не влияет на его работу.

2. Увеличение таймаута

Вы уже увеличили параметр emulator-boot-timeout до 1200 секунд; однако, если эмулятор не запускается, возможно, стоит проверить логи, чтобы убедиться, что запускается именно правильный образ. Увеличение таймаута для команды adb shell getprop sys.boot_completed до 600 секунд также может дать дополнительные шансы на успешный запуск эмулятора.

3. Проверка подключения через ADB

Убедитесь, что команда adb devices действительно выполняется после запуска эмулятора, и попробуйте добавлять некоторые задержки перед этой командой, чтобы убедиться, что эмулятор успел загрузиться. Например, вы можете добавить небольшую паузу перед проверкой состояния ADB:

# 5. Verify ADB Connection
- name: Check Emulator Status
  run: |
    sleep 30 # Добавление задержки на 30 секунд перед проверкой
    adb devices

4. Использование переменной ADB_SERVER_PORT

Вы можете столкнуться с проблемами, связанными с портами. Попробуйте явно указать порт ADB перед выполнением adb команд:

- name: Set ADB Server Port
  run: |
    adb nodaemon server &
    adb -P 5037 devices

5. Просмотр логов эмулятора

Для получения дополнительных подсказок о том, что идет не так, стоит изучить журналы эмулятора. Вы уже добавили шаг для вывода логов, но при этом рекомендую выполнять его сразу после неудавшейся попытки запуска:

# 7. Check Emulator Log (optional, for troubleshooting)
- name: Print Emulator Log
  run: |
    adb logcat -d || true  # Обеспечить, чтобы ошибка не остановила выполнение

6. Убедитесь в наличии необходимых системных ресурсов

Эмуляторы могут требовать значительных ресурсов. Убедитесь, что на macOS Runner достаточно памяти и процессорных мощностей для запуска эмулятора. Спецификация runner’а может повлиять на производительность.

Заключение

В случае если все вышеперечисленные шаги не решают проблему, возможно, стоит рассмотреть использование альтернативных подходов, таких как использование тестирования на реальных устройствах или использование облачных сервисов для проведения UI-тестов. Убедитесь также, что вы следите за актуальными обновлениями эмулятора и используемой инфраструктуры GitHub Actions.

Если у вас есть дополнительные вопросы или неясности, не стесняйтесь задавать их, и мы поможем вам найти решение.

Оцените материал
Добавить комментарий

Капча загружается...