Сценарий посткомпиляции AppCenter - попытка собрать Xamarin.UITest перед его выполнением

Я установил CI для своего проекта iOS и droid xamarin через Центр приложений Visual Studio. Все было хорошо, пока я не попытался настроить тестовый запуск пользовательского интерфейса. Я создал скрипт пост-сборки для android и iOS, который в данный момент находится в папке вместе с файлом решения (appcenter-post-build.sh, который необходим для того, чтобы я смог построить все решение [включая проект Xamarin.UITest]).

Я был успешен с iOS, так как центр приложений позволяет мне выбрать решение для сборки, но это не было разрешено на Android (appcenter-post-build.sh, который находится в той же папке, что и droid.csproj). Итак, мой обходной путь - создать еще один пост-сценарий appcenter специально для Android. Я пытаюсь собрать Xamarin.UITest после сборки Android.

Всякий раз, когда я выполняю это в своем скрипте пост-сборки, где я пытаюсь собрать Xamarin.UITest:

/Library/Frameworks/Mono.framework/Versions/5_12_0/bin/msbuild $APPCENTER_SOURCE_DIRECTORY/MyDirectory/UITests/Project.UITests.csproj /p:Configuration=Debug

Эта ошибка возвращается в журналах сборки:

/Library/Frameworks/Mono.framework/External/xbuild/Xamarin/iOS/Xamarin.iOS.Common.targets: error : The specified iOS provisioning profile 'SampleProvisioningProfile' could not be found

Похоже, что он пытается построить проект iOS, что и должно быть. Любые предложения по этому вопросу. Я пытался заставить это работать на прошлой неделе.

0 ответов

Вот сценарий после сборки, который я использую для этого приложения: https://github.com/brminnick/FaceOff

Для App Center Build я рекомендую создавать только конкретные .csproj файл, потому что этот скрипт пост сборки соберет ваш проект UITest.

Скрипт пост-сборки iOS

#!/usr/bin/env bash
if [ "$APPCENTER_XAMARIN_CONFIGURATION" == "Debug" ];then

    echo "Post Build Script Started"

    SolutionFile=`find "$APPCENTER_SOURCE_DIRECTORY" -name [Your Solution File].sln`
    SolutionFileFolder=`dirname $SolutionFile`

    UITestProject=`find "$APPCENTER_SOURCE_DIRECTORY" -name [Your UITest CSProj file].csproj`

    echo SolutionFile: $SolutionFile
    echo SolutionFileFolder: $SolutionFileFolder
    echo UITestProject: $UITestProject

    chmod -R 777 $SolutionFileFolder

    msbuild "$UITestProject" /property:Configuration=$APPCENTER_XAMARIN_CONFIGURATION

    UITestDLL=`find "$APPCENTER_SOURCE_DIRECTORY" -name "[Your UITest Output File Name].dll" | grep bin`
    echo UITestDLL: $UITestDLL

    UITestBuildDir=`dirname $UITestDLL`
    echo UITestBuildDir: $UITestBuildDir

    UITestVersionNumber=`grep '[0-9]' $UITestProject | grep Xamarin.UITest|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,10\}\-'dev`
    echo UITestPrereleaseVersionNumber: $UITestVersionNumber

    UITestVersionNumberSize=${#UITestVersionNumber} 
    echo UITestVersionNumberSize: $UITestVersionNumberSize

    if [ $UITestVersionNumberSize == 0 ]
    then
        UITestVersionNumber=`grep '[0-9]' $UITestProject | grep Xamarin.UITest|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`
        echo UITestVersionNumber: $UITestVersionNumber
    fi

    TestCloudExe=`find ~/.nuget | grep test-cloud.exe | grep $UITestVersionNumber | head -1`
    echo TestCloudExe: $TestCloudExe

    TestCloudExeDirectory=`dirname $TestCloudExe`
    echo TestCloudExeDirectory: $TestCloudExeDirectory

    DSYMFile=`find "$APPCENTER_SOURCE_DIRECTORY" -name *.dsym | head -1`
    DSYMDirectory=`dirname $DSYMFile`

    npm install -g appcenter-cli

    appcenter login --token token

    appcenter test run uitest --app "[Your App Center App Name]" --devices "[Your App Center iOS Deivce List]" --app-path $IPAFile --test-series "master" --locale "en_US" --build-dir $UITestBuildDir --dsym-dir $DSYMDirectory --uitest-tools-dir $TestCloudExeDirectory --async
fi

Скрипт пост-сборки Android

#!/usr/bin/env bash
if [ "$APPCENTER_XAMARIN_CONFIGURATION" == "Debug" ];then

    echo "Post Build Script Started"

    SolutionFile=`find "$APPCENTER_SOURCE_DIRECTORY" -name [Your Solution File].sln`
    SolutionFileFolder=`dirname $SolutionFile`

    UITestProject=`find "$APPCENTER_SOURCE_DIRECTORY" -name [Your UITest CSProj File].csproj`

    echo SolutionFile: $SolutionFile
    echo SolutionFileFolder: $SolutionFileFolder
    echo UITestProject: $UITestProject

    chmod -R 777 $SolutionFileFolder

    msbuild "$UITestProject" /property:Configuration=$APPCENTER_XAMARIN_CONFIGURATION

    UITestDLL=`find "$APPCENTER_SOURCE_DIRECTORY" -name "[Your UITest Output DLL].dll" | grep bin`
    echo UITestDLL: $UITestDLL

    UITestBuildDir=`dirname $UITestDLL`
    echo UITestBuildDir: $UITestBuildDir

    UITestVersionNumber=`grep '[0-9]' $UITestProject | grep Xamarin.UITest|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,10\}\-'dev`
    echo UITestPrereleaseVersionNumber: $UITestVersionNumber

    UITestVersionNumberSize=${#UITestVersionNumber} 
    echo UITestVersionNumberSize: $UITestVersionNumberSize

    if [ $UITestVersionNumberSize == 0 ]
    then
        UITestVersionNumber=`grep '[0-9]' $UITestProject | grep Xamarin.UITest|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`
        echo UITestVersionNumber: $UITestVersionNumber
    fi

    TestCloudExe=`find ~/.nuget | grep test-cloud.exe | grep $UITestVersionNumber | head -1`
    echo TestCloudExe: $TestCloudExe

    TestCloudExeDirectory=`dirname $TestCloudExe`
    echo TestCloudExeDirectory: $TestCloudExeDirectory

    APKFile=`find "$APPCENTER_SOURCE_DIRECTORY" -name *.apk | head -1`

    npm install -g appcenter-cli

    appcenter login --token token

    appcenter test run uitest --app "[Your App Center App Name]" --devices "[Your Appcenter Android Device List]" --app-path $APKFile --test-series "master" --locale "en_US" --build-dir $UITestBuildDir --uitest-tools-dir $TestCloudExeDirectory --async
fi

Я понимаю, что это происходит примерно с 18-месячным опозданием, но я только что столкнулся с той же проблемой, и я нашел способ заставить вещи хорошо работать в Центре приложений, даже если у вас есть ссылки на проекты для конкретных платформ в проекте тестирования пользовательского интерфейса.

  • Это проблема только в проекте Android, где мы должны специально создать проект теста пользовательского интерфейса, чтобы запускать тесты пользовательского интерфейса в Test Cloud.

Исходное сообщение @mindOfAI, отмеченное с использованием appcenter-post-build.shscript (дополнительная информация о сценариях сборки App Center) для создания проекта теста пользовательского интерфейса после сборки проекта Android для подготовки к запуску тестов пользовательского интерфейса для Android. Проблема в том, что если вы хотите установить свои "Тестовые приложения" в Visual Studio для Mac для проекта тестирования пользовательского интерфейса, ссылки будут добавлены в проект теста пользовательского интерфейса для конкретных проектов платформы.

Если проект теста пользовательского интерфейса ссылается на проект iOS, он попытается построить проект iOS как зависимость от проекта теста пользовательского интерфейса. Для сборки проекта iOS требуется действующий сертификат iOS и профиль подготовки, поэтому сборка завершится ошибкой.

По сути, нам нужны ссылки там, чтобы нам было легче запускать тесты пользовательского интерфейса на нашем локальном компьютере, но мы хотим, чтобы они были в Центре приложений, чтобы не тратить время на создание ненужных проектов и, что наиболее важно, чтобы нам не понадобилось сертификат iOS и профиль подготовки при создании проекта тестирования пользовательского интерфейса для Android.

Чтобы решить эту проблему, я использовал appcenter-pre-build.sh сценарий и dotnet remove reference команда для удаления ссылок в Центре приложений перед созданием проекта тестирования пользовательского интерфейса для Android:

Псевдокод

dotnet remove "Path/To/UITest/Project.csproj" reference "path/to/iOS_project.csproj" "path/to/Android_project.csproj"

Пример appcenter-pre-build.sh для Android

#!/usr/bin/env bash

echo "**************************************************************************************************"
echo "**** Custom Pre Build Script -- Android Edition"
echo "**************************************************************************************************"

set -e # Exit immediately if a command exits with a non-zero status (failure)

# In order to run UI tests on local dev machines without manually installing the latest version of the app on each platform device
# you are using, the UI test project must contain references to the Android and iOS projects.
# However, in MS App Center, if the iOS reference is there for the Android build, the build will fail since there is no certificate
# nor provisioning profile to satisfy its build requirements. This next step removes the references before building for App Center
# so that we can have the best of both worlds:
echo "Removing project references to Android and iOS projects"
dotnet remove "$APPCENTER_SOURCE_DIRECTORY/MyCoolApp.UITests/MyCoolApp.UITests.csproj" reference "$APPCENTER_SOURCE_DIRECTORY/MyCoolApp.iOS/MyCoolApp.iOS.csproj" "$APPCENTER_SOURCE_DIRECTORY/MyCoolApp.Android/MyCoolApp.Android.csproj"
  • НОТА: $APPCENTER_SOURCE_DIRECTORY - это встроенная переменная среды, предоставляемая центром приложений.

Надеюсь, это поможет кому-то найти решение намного быстрее, чем я =)

Другие вопросы по тегам