Nano Hash - криптовалюты, майнинг, программирование

Как настроить Jenkins для запуска модульных тестов Android?

Недавно я установил Jenkins на свой компьютер для разработки, чтобы понять, как работает непрерывная интеграция/доставка.

У меня есть базовая настройка задачи Android, которая создаст мое приложение, а затем сообщит о результатах тестов lint, PMD, Checkstyle, Findbugs и JUnit (бизнес-логика).

Я также хотел бы, чтобы он запускал модульные тесты Android (те, для которых требуется эмулятор), как это настроить? После того, как я добавил «connectedAndroidTest» в список команд gradle для запуска во время сборки, я получаю следующий вывод:

17:03:21 :app:connectedDebugAndroidTest FAILED
17:03:21 
17:03:21 FAILURE: Build failed with an exception.
17:03:21 
17:03:21 * What went wrong:
17:03:21 Execution failed for task ':app:connectedDebugAndroidTest'.
17:03:21 > com.android.builder.testing.api.DeviceException: No connected devices!
17:03:21 
17:03:21 * Try:
17:03:21 Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
17:03:21 
17:03:21 BUILD FAILED

Это ожидаемо, поэтому я попытался запустить эмулятор из Android Studio и снова запустить сборку Jenkins, что привело к этой ошибке:

17:08:54 :app:connectedDebugAndroidTest
17:08:54 05:08:54 E/SplitApkInstaller: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.zao.testapp.test signatures do not match the previously installed version; ignoring!
17:08:54 Unable to install C:\Program Files (x86)\Jenkins\workspace\testapp\app\build\outputs\apk\app-debug-androidTest.apk
17:08:54 com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.zao.testapp.test signatures do not match the previously installed version; ignoring!
17:08:54    at com.android.ddmlib.SplitApkInstaller.install(SplitApkInstaller.java:92)
17:08:54    at com.android.ddmlib.Device.installPackages(Device.java:904)
17:08:54    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:136)
17:08:54    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:134)
17:08:54    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:49)
17:08:54    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
17:08:54    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
17:08:54    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
17:08:54    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
17:08:54    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
17:08:54    at java.lang.Thread.run(Thread.java:748)
17:08:54 
17:08:54 com.android.builder.testing.ConnectedDevice > runTests[emulator-5554 - 8.0.0] [31mFAILED [0m
17:08:54    com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.zao.testapp.test signatures do not match the previously installed version; ignoring!
17:08:54        at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:144)

17:08:54 [no message defined]
17:08:54 com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.zao.testapp.test signatures do not match the previously installed version; ignoring!
17:08:54    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:144)
17:08:54    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:134)
17:08:54    at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:49)
17:08:54    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
17:08:54    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
17:08:54    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
17:08:54    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
17:08:54    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
17:08:54    at java.lang.Thread.run(Thread.java:748)
17:08:54 Caused by: com.android.ddmlib.InstallException: Failed to finalize session : INSTALL_FAILED_UPDATE_INCOMPATIBLE: Package com.zao.testapp.test signatures do not match the previously installed version; ignoring!
17:08:54    at com.android.ddmlib.SplitApkInstaller.install(SplitApkInstaller.java:92)
17:08:54    at com.android.ddmlib.Device.installPackages(Device.java:904)
17:08:54    at com.android.builder.testing.ConnectedDevice.installPackages(ConnectedDevice.java:136)
17:08:54    ... 8 more
17:08:54 :app:connectedDebugAndroidTest FAILED
17:08:54 
17:08:54 FAILURE: Build failed with an exception.
17:08:54 
17:08:54 * What went wrong:
17:08:54 Execution failed for task ':app:connectedDebugAndroidTest'.
17:08:54 > There were failing tests. See the report at: file:///C:/Program%20Files%20(x86)/Jenkins/workspace/testapp/app/build/reports/androidTests/connected/index.html
17:08:54 
17:08:54 * Try:
17:08:54 Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
17:08:54 
17:08:54 BUILD FAILED

Я также попытался настроить эмулятор через настройку задачи. Есть вариант «Запустить эмулятор Android во время сборки», который я проверил.

Вариант запуска существующего эмулятора у меня не работает — я даю ему имя AVD из эмулятора, созданного в Android Studio, в моем случае «Nexus_5X_API_26», и при сборке получаю следующую ошибку:

17:26:07 FATAL: C:\Windows\system32\config\systemprofile\.android\avd\Nexus_5X_API_26.ini (The system cannot find the path specified)
17:26:07 java.io.FileNotFoundException: C:\Windows\system32\config\systemprofile\.android\avd\Nexus_5X_API_26.ini (The system cannot find the path specified)

Что имеет смысл, так как мой эмулятор находится в C:\Users\Zach.android\avd\ .

Я также попытался запустить эмулятор со свойствами, которые я указываю в конфиге, используя следующие значения:

Android OS version: android-26
Screen density: 420
Screen resolution: 1080x1920
Device locale: en_US
SD card size: <empty>
Target ABI: x86
Emulator name suffix: <empty>

И я получаю следующий вывод:

17:31:51 $ D:\Android\sdk/tools/android.bat list target
17:31:52 [android] The configured Android platform needs to be installed: android-26
17:31:52 $ D:\Android\sdk/tools/android.bat list target
17:31:53 $ D:\Android\sdk/tools/android.bat list target
17:31:54 [android] Installing the 'sys-img-x86-android-26' SDK component(s)...
17:31:54 $ D:\Android\sdk/tools/android.bat update sdk -u -a -t sys-img-x86-android-26
17:31:54 **************************************************************************
17:31:54 The "android" command is deprecated.
17:31:54 For manual SDK, AVD, and project management, please use Android Studio.
17:31:54 For command-line tools, use tools\bin\sdkmanager.bat
17:31:54 and tools\bin\avdmanager.bat
17:31:54 **************************************************************************
17:31:54 
17:31:54 "android" SDK commands can be translated to sdkmanager commands on a best-effort basis.
17:31:54 (This prompt can be suppressed with the --use-sdk-wrapper commend-line argument
17:31:54 or by setting the USE_SDK_WRAPPER environment variable)

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

Итак, что мне здесь не хватает? Почему это так сложно для меня! Кто-нибудь знает, как запустить модульные тесты Android -> запустить симулятор для сборки на Jenkins?

EDIT: я обновил Jenkins, чтобы он работал от имени «я», а не от локальной системной учетной записи, и это позволило мне (попытаться) использовать существующий эмулятор, а не жаловаться на невозможность его найти. Однако теперь я получаю эту ошибку при попытке запустить эмулятор:

00:28:11 $ D:\Android\sdk/tools/android.bat list target
00:28:12 [android] Using Android SDK: D:\Android\sdk
00:28:12 $ D:\Android\sdk/platform-tools/adb.exe start-server
00:28:16 * daemon not running. starting it now at tcp:5847 *
00:28:16 * daemon started successfully *
00:28:16 $ D:\Android\sdk/platform-tools/adb.exe start-server
00:28:16 [android] Starting Android emulator
00:28:16 $ D:\Android\sdk/tools/emulator.exe -engine classic -ports 5688,5689 -report-console tcp:5831,max=60 -avd Nexus_5X_API_26 -no-snapshot-load -no-snapshot-save -no-window
00:28:16 PANIC: Missing emulator engine program for 'x86' CPU.
00:29:21 [android] Emulator did not appear to start; giving up
00:29:21 [android] Stopping Android emulator
00:29:22 $ D:\Android\sdk/platform-tools/adb.exe kill-server

Итак, я думаю, что это вопрос номер один на данный момент, есть какие-нибудь мысли?


  • Рассматривали ли вы возможность отправки Jenkins вашего apk в тестовую лабораторию Firebase вместо запуска тестов в локальном эмуляторе? Если вы сделаете это, больше не будет особых проблем с эмулятором :) Вот некоторая информация: pamartinezandres.com/ 04.09.2017
  • @davehenry Я думал об этом, да! Но я хотел бы иметь абсолютный контроль над тестовой установкой, которая у меня есть. Использование Firebase — это здорово, но отчасти это нужно мне, чтобы больше узнать о CI/CD, а отчасти — чтобы «владеть» всем, чтобы быть абсолютно уверенным в том, как все работает или не работает. В использовании Firebase нет ничего плохого, но я бы хотел пока этого не делать. 05.09.2017
  • Хммм, я думаю, вы как бы заново изобретаете велосипед. Я понимаю, откуда вы пришли, желая понять, как все это работает. Извините, я не могу помочь с вашей реальной проблемой: p 05.09.2017
  • Вы указали эту команду D:\Android\sdk/tools/android.bat list target в своем jenkinsjob? Потому что в журнале ошибок в конце вашего вывода говорится, что команда android.bat устарела, и вы не указали ни одну из команд, чтобы игнорировать это. Не могли бы вы перейти на одну из предложенных команд tools\bin\sdkmanager.bat или tools\bin\avdmanager.bat вместо android.bat? 18.09.2017
  • @ansib Я не запускаю эту команду напрямую, у меня отмечена опция запуска эмулятора Android во время сборки, то есть i.imgur.com/OvKf3q9.jpg 18.09.2017
  • @Zach Я думаю, что ваша версия Android Studio в вашей системе Windows слишком нова для плагина эмулятора Android от jenkins. Я думаю, у вас есть два варианта: во-первых, вы понизите версию своей студии, или во-вторых, вы скопируете свои файлы avd в место, которое вы видите в журнале.. я знаю, что это всего лишь обходной путь, но, возможно, вы можете начать сборку. Уже есть билет на обновление плагина (с очередной ошибкой) (см. здесь) 18.09.2017

Ответы:


Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..