From ee1221bbdf7459b734c4e36df4b7b54bb35f4868 Mon Sep 17 00:00:00 2001 From: Simon Rozsival Date: Thu, 3 Sep 2026 18:42:10 +0200 Subject: [PATCH] [ci] Run MAUI R2R tests with XHarness Use Arcade's XHarness Android work items so transient device installation failures get the standard reboot and retry behavior while retaining the existing app launch smoke checks and diagnostics. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- build-tools/automation/MauiR2RHelix.proj | 54 ++++++++++++-- .../run-maui-r2r-helix-matrix.yaml | 71 ++----------------- eng/Versions.props | 1 + 3 files changed, 57 insertions(+), 69 deletions(-) diff --git a/build-tools/automation/MauiR2RHelix.proj b/build-tools/automation/MauiR2RHelix.proj index 6abba14c266..0d8f7b74df5 100644 --- a/build-tools/automation/MauiR2RHelix.proj +++ b/build-tools/automation/MauiR2RHelix.proj @@ -4,6 +4,7 @@ true false true + true tests/android/maui-r2r/ WorkItem $(HelixWorkItemName) @@ -18,10 +19,53 @@ - - $(WorkItemDirectory) - $(WorkItemCommand) - $(WorkItemTimeout) - + + $(WorkItemApk) + $(AndroidPackageName) + $(WorkItemTimeout) + + diff --git a/build-tools/automation/yaml-templates/run-maui-r2r-helix-matrix.yaml b/build-tools/automation/yaml-templates/run-maui-r2r-helix-matrix.yaml index 919402ea3f2..39eaa52c6ed 100644 --- a/build-tools/automation/yaml-templates/run-maui-r2r-helix-matrix.yaml +++ b/build-tools/automation/yaml-templates/run-maui-r2r-helix-matrix.yaml @@ -159,6 +159,9 @@ steps: $packageName = '${{ testCase.packageName }}' $apkName = "MauiR2R-${{ testCase.name }}-Signed.apk" + if (Test-Path $payloadDirectory) { + Remove-Item -LiteralPath $payloadDirectory -Recurse -Force + } New-Item -ItemType Directory -Force -Path $payloadDirectory | Out-Null $apk = Get-ChildItem $projectDirectory -Recurse -Filter '*-Signed.apk' | Where-Object { $_.FullName -like "*\bin\Release\*$runtimeIdentifier*" } | @@ -169,67 +172,6 @@ steps: } Copy-Item -LiteralPath $apk.FullName -Destination (Join-Path $payloadDirectory $apkName) -Force - - $sdkCandidates = @( - $env:ANDROID_HOME, - $env:ANDROID_SDK_ROOT, - $env:AndroidSdkDirectory, - $(if ($env:USERPROFILE) { Join-Path $env:USERPROFILE 'android-toolchain\sdk' }), - $(if ($env:HOME) { Join-Path $env:HOME 'android-toolchain\sdk' }) - ) | Where-Object { $_ -and (Test-Path (Join-Path $_ 'platform-tools\adb.exe')) } - $androidSdk = $sdkCandidates | Select-Object -First 1 - if (-not $androidSdk) { - throw "Could not find Android SDK platform-tools. Tried ANDROID_HOME, ANDROID_SDK_ROOT, AndroidSdkDirectory, and user android-toolchain paths." - } - - $platformTools = Join-Path $androidSdk 'platform-tools' - $payloadPlatformTools = Join-Path $payloadDirectory 'platform-tools' - New-Item -ItemType Directory -Force -Path $payloadPlatformTools | Out-Null - Copy-Item -Path (Join-Path $platformTools '*') -Destination $payloadPlatformTools -Recurse -Force - - $script = @" - @echo on - setlocal - set "UPLOAD_DIR=%HELIX_WORKITEM_UPLOAD_ROOT%" - if "%UPLOAD_DIR%"=="" set "UPLOAD_DIR=%~dp0" - if not exist "%UPLOAD_DIR%" mkdir "%UPLOAD_DIR%" - echo Scenario: ${{ testCase.displayName }} > "%UPLOAD_DIR%\scenario-${{ testCase.name }}.txt" - echo RuntimeIdentifier: $runtimeIdentifier >> "%UPLOAD_DIR%\scenario-${{ testCase.name }}.txt" - echo PackageName: $packageName >> "%UPLOAD_DIR%\scenario-${{ testCase.name }}.txt" - echo APK: $apkName >> "%UPLOAD_DIR%\scenario-${{ testCase.name }}.txt" - set "ADB=%~dp0platform-tools\adb.exe" - if not exist "%ADB%" ( - echo Could not find payload adb.exe at "%ADB%" - dir "%~dp0" /s - exit /b 1 - ) - "%ADB%" version || exit /b 1 - "%ADB%" devices -l > "%UPLOAD_DIR%\adb-devices-${{ testCase.name }}.log" - type "%UPLOAD_DIR%\adb-devices-${{ testCase.name }}.log" - "%ADB%" wait-for-device || exit /b 1 - "%ADB%" shell getprop > "%UPLOAD_DIR%\getprop-${{ testCase.name }}.log" - "%ADB%" shell getprop ro.product.cpu.abi - "%ADB%" shell getprop ro.product.cpu.abilist - "%ADB%" shell getprop ro.build.fingerprint - "%ADB%" uninstall $packageName - "%ADB%" install -r "%~dp0$apkName" || exit /b 1 - "%ADB%" shell pm path $packageName > "%UPLOAD_DIR%\pm-path-${{ testCase.name }}.log" - "%ADB%" shell dumpsys package $packageName > "%UPLOAD_DIR%\dumpsys-package-${{ testCase.name }}.log" - "%ADB%" shell logcat -c - "%ADB%" shell monkey -p $packageName -c android.intent.category.LAUNCHER 1 || exit /b 1 - ping -n 11 127.0.0.1 > nul - "%ADB%" shell pidof $packageName - if errorlevel 1 ( - "%ADB%" logcat -d -b all > "%UPLOAD_DIR%\logcat-${{ testCase.name }}.log" - "%ADB%" uninstall $packageName - exit /b 1 - ) - "%ADB%" logcat -d -b all > "%UPLOAD_DIR%\logcat-${{ testCase.name }}.log" - "%ADB%" uninstall $packageName - exit /b 0 - "@ - - Set-Content -LiteralPath (Join-Path $payloadDirectory 'run-maui-r2r.cmd') -Value $script -Encoding ASCII displayName: Prepare MAUI R2R Helix payload - ${{ testCase.displayName }} - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml @@ -284,6 +226,7 @@ steps: $binlogPath = Join-Path $logsDirectory "SendMauiR2R-$($case.name)ToHelix.binlog" $helixResultsDestinationDir = Join-Path (Join-Path $logsDirectory 'helix-results') $case.name $workItemDirectory = Join-Path $payloadRootDirectory $case.name + $workItemApk = Join-Path $workItemDirectory "MauiR2R-$($case.name)-Signed.apk" Remove-Item -LiteralPath $scriptPath, $outputPath, $errorPath -Force -ErrorAction Ignore @@ -301,9 +244,9 @@ steps: "`$env:HelixWorkItemName = '$($case.workItemName)'" "`$env:HelixResultsDestinationDir = '$helixResultsDestinationDir'" "`$env:HelixAccessToken = ''" - "`$env:WorkItemDirectory = '$workItemDirectory'" - "`$env:WorkItemCommand = 'run-maui-r2r.cmd'" - "`$env:WorkItemTimeout = '00:10:00'" + "`$env:WorkItemApk = '$workItemApk'" + "`$env:AndroidPackageName = '$($case.packageName)'" + "`$env:WorkItemTimeout = '00:20:00'" "`$env:WaitForWorkItemCompletion = 'true'" "`$env:Creator = 'dotnet-android'" "& '$dotnetPath' msbuild '$helixProject' /p:TreatWarningsAsErrors=false /t:Test /bl:'$binlogPath'" diff --git a/eng/Versions.props b/eng/Versions.props index f9e38932913..e6a67e3bc6c 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -9,6 +9,7 @@ 11.0.0-beta.26060.102 11.0.0-beta.26429.111 + 11.0.0-prerelease.26428.1 11.0.100-preview.4.26215.121 11.0.100-preview.4.26215.121 $(MicrosoftNETWorkloadMonoToolChainCurrentManifest110100preview4PackageVersion)