diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 4f2e2aceabe..da1377cd73d 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -86,1863 +86,5 @@ variables: - name: MacBuildPoolImage value: '' -# Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check. stages: -- stage: mac_build - displayName: Mac - dependsOn: [] - jobs: - # Check - "Xamarin.Android (macOS > Build)" - - job: mac_build_create_installers - displayName: macOS > Build - pool: - name: $(MacBuildPoolName) - vmImage: $(MacBuildPoolImage) - ${{ if eq(variables['MacBuildPoolName'], 'VSEng-Xamarin-RedmondMac-Android-Untrusted') }}: - demands: macOS.Name -equals Monterey - timeoutInMinutes: 240 - cancelTimeoutInMinutes: 5 - workspace: - clean: all - steps: - - checkout: self - submodules: recursive - path: s/xamarin-android - - - template: yaml-templates/install-microbuild-tooling.yaml - parameters: - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - - - template: yaml-templates/commercial-build.yaml - parameters: - provisionatorChannel: ${{ parameters.provisionatorChannel }} - signClassicPkgContent: ${{ parameters.signClassicPkgContent }} - - - template: yaml-templates/remove-microbuild-tooling.yaml - parameters: - condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real')) - - - script: > - mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && - cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && - zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: zip Windows toolchain pdb files - - - task: PublishPipelineArtifact@1 - displayName: upload Windows toolchain pdb files - inputs: - artifactName: $(WindowsToolchainPdbArtifactName) - targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb - - - template: yaml-templates/upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - artifactName: Build Results - macOS - includeBuildResults: true - - - template: yaml-templates/run-xaprepare.yaml - parameters: - arguments: --s=DetermineApplicableTests - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: determine which test stages to run - name: TestConditions - condition: and(succeeded(), eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR')) - -# This stage ensures Windows specific build steps continue to work, and runs unit tests. -- stage: win_build_test - displayName: Windows - dependsOn: [] - jobs: - # Check - "Xamarin.Android (Windows > Build & Smoke Test)" - - job: win_build_test - displayName: Windows > Build & Smoke Test - pool: $(1ESWindowsPool) - timeoutInMinutes: 360 - cancelTimeoutInMinutes: 5 - steps: - - checkout: self - submodules: recursive - - - template: yaml-templates\kill-processes.yaml - - - template: yaml-templates\clean.yaml - - - script: | - echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_11_X64% - displayName: set JI_JAVA_HOME - - - template: yaml-templates\use-dot-net.yaml - parameters: - remove_dotnet: true - - # xabuild still depends on .NET Core 3 or earlier - - template: yaml-templates\use-dot-net.yaml - parameters: - version: 3.1 - quality: GA - - # Downgrade the XA .vsix installed into the instance of VS that we are building with so that we don't restore/build against a test version. - # The VS installer will attempt to resume any failed or partial installation before trying to downgrade Xamarin.Android. - # VSIXInstaller.exe will exit non-zero when the downgrade attempt is a no-op, so we will allow this step to fail silently. - - powershell: | - $vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" - & "$vsWhere" -all -prerelease -latest | Out-Default - $isLatestVSLaunchable = & "$vsWhere" -all -prerelease -latest -property isLaunchable - if ($isLatestVSLaunchable -eq 0) { - $vsPath = & "$vsWhere" -all -prerelease -latest -property installationPath - Write-Host "Attempting to repair VS instance:" $vsPath - $vsInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe" - & "$vsInstaller" resume --installPath $vsPath --quiet --norestart | Out-Default - Write-Host "vs_installer.exe resume attempt complete" - } - $vsixInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\VSIXInstaller.exe" - $ts = Get-Date -Format FileDateTimeUniversal - $log = "xavsixdowngrade-$ts.log" - $process = Start-Process -NoNewWindow -FilePath $vsixInstaller -ArgumentList "/downgrade:Xamarin.Android.Sdk /admin /quiet /logFile:$log" -Wait -PassThru -RedirectStandardError "err.txt" - Get-Content "err.txt" | Write-Host - Get-Content "${env:TEMP}\$log" | Write-Host - Write-Host "VSInstaller.exe exited with code:" $process.ExitCode - Remove-Item "${env:TEMP}\$log" - displayName: downgrade XA to stable - ignoreLASTEXITCODE: true - - - task: DotNetCoreCLI@2 - displayName: Prepare Solution - inputs: - projects: Xamarin.Android.sln - arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog' - - # Build, pack .nupkgs, and extract workload packs to dotnet preview test directory - - template: yaml-templates\run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: >- - -t:BuildDotNet,PackDotNet -c $(XA.Build.Configuration) -v:n - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog - displayName: Build Solution - continueOnError: false - - - task: MSBuild@1 - displayName: msbuild create-vsix - inputs: - solution: build-tools\create-vsix\create-vsix.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-create-vsix.binlog - - - task: MSBuild@1 - displayName: msbuild xabuild - inputs: - solution: tools\xabuild\xabuild.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-xabuild.binlog - - - task: CmdLine@1 - displayName: xabuild Xamarin.Android-Tests - inputs: - filename: bin\$(XA.Build.Configuration)\bin\xabuild.exe - arguments: Xamarin.Android-Tests.sln /restore /p:Configuration=$(XA.Build.Configuration) /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\dotnet-build-tests.binlog - - - template: yaml-templates\install-apkdiff.yaml - - - template: yaml-templates\run-nunit-tests.yaml - parameters: - testRunTitle: Smoke MSBuild Tests - Windows Build Tree - testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\net472\Xamarin.Android.Build.Tests.dll - testResultsFile: TestResult-SmokeMSBuildTests-WinBuildTree-$(XA.Build.Configuration).xml - nunitConsoleExtraArgs: --where "cat == SmokeTests" - - - template: yaml-templates\run-nunit-tests.yaml - parameters: - useDotNet: true - testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build - testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll - testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml - dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" - - - template: yaml-templates\upload-results.yaml - parameters: - artifactName: Build Results - Windows - includeBuildResults: true - - - template: yaml-templates\fail-on-issue.yaml - -# Check - "Xamarin.Android (Linux > Build)" -- stage: linux_build - displayName: Linux - dependsOn: [] - jobs: - - job: linux_build_create_sdk_pack - displayName: Linux > Build - pool: android-devdiv-ubuntu-vmss - timeoutInMinutes: 180 - cancelTimeoutInMinutes: 2 - workspace: - clean: all - variables: - CXX: g++-10 - CC: gcc-10 - steps: - - checkout: self - clean: true - submodules: recursive - path: s/xamarin-android - - - checkout: monodroid - clean: true - submodules: recursive - path: s/xamarin-android/external/monodroid - persistCredentials: true - - - script: rm -rf external/monodroid/external/xamarin-android - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: delete external xamarin-android submodule - - - template: yaml-templates/setup-ubuntu.yaml - - - task: NuGetAuthenticate@0 - displayName: authenticate with azure artifacts - inputs: - forceReinstallCredentialProvider: true - - - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: make prepare-external-git-dependencies - - - script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: make jenkins - - - script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: make create-nupkgs - - - script: > - df -h && - mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/Microsoft.Android.Sdk.Linux*.nupkg - $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/SignList.xml - $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: copy linux sdk - - - task: PublishPipelineArtifact@1 - displayName: upload linux sdk - inputs: - artifactName: $(LinuxNuGetArtifactName) - targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - - - template: yaml-templates/upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - artifactName: Build Results - Linux - includeBuildResults: true - - - template: yaml-templates/fail-on-issue.yaml - -- stage: smoke_tests - displayName: Smoke Tests - dependsOn: mac_build - jobs: - # Check - "Xamarin.Android (macOS > Tests > APKs Classic)" - - job: mac_apk_tests_legacy - displayName: macOS > Tests > APKs Classic - # Disabled on .NET release branches - condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) - pool: - vmImage: $(HostedMacImage) - timeoutInMinutes: 180 - workspace: - clean: all - variables: - ApkTestConfiguration: Release - steps: - - template: yaml-templates/setup-test-environment.yaml - parameters: - configuration: $(ApkTestConfiguration) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-xaprepare.yaml - parameters: - displayName: install emulator - arguments: --s=EmulatorTestDependencies - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) -m:1 -v:n - displayName: prepare java.interop $(XA.Build.Configuration) - continueOnError: false - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Mono.Android_Tests - project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk - artifactFolder: Default - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Mono.Android_Tests-Aot - project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration)-Aot.xml - extraBuildArgs: /p:AotAssemblies=True /p:EnableLLVM=True - artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk - artifactFolder: AotLlvm - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Mono.Android_Tests-Profiled-Aot - project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration)-Profiled-Aot.xml - extraBuildArgs: /p:AotAssemblies=True /p:AndroidEnableProfiledAot=true - artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk - artifactFolder: Profiled-Aot - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Mono.Android_Tests-Bundle - project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration)-Bundle.xml - extraBuildArgs: /p:BundleAssemblies=true - artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk - artifactFolder: Bundle - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Mono.Android_TestsAppBundle - project: tests/Mono.Android-Tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj - testResultsFiles: TestResult-Mono.Android_TestsAppBundle-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_TestsAppBundle-Signed.aab - artifactFolder: Aab - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Mono.Android_TestsMultiDex - project: tests/Mono.Android-Tests/Runtime-MultiDex/Mono.Android-TestsMultiDex.csproj - testResultsFiles: TestResult-Mono.Android_TestsMultiDex-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_TestsMultiDex-Signed.apk - artifactFolder: MultiDex - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Android.JcwGen_Tests - project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.JcwGen_Tests-Signed.apk - artifactFolder: Default - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Android.JcwGen_Tests_FastDev - project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.JcwGen_Tests-Signed.apk - artifactFolder: FastDev_Assemblies_Dexes - extraBuildArgs: /p:AndroidFastDeploymentType=Assemblies:Dexes - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Android.Locale_Tests - project: tests/locales/Xamarin.Android.Locale-Tests/Xamarin.Android.Locale-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.Locale_Tests-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.Locale_Tests-Signed.apk - artifactFolder: Default - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Android.Locale_Tests-Aot - project: tests/locales/Xamarin.Android.Locale-Tests/Xamarin.Android.Locale-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.Locale_Tests-$(ApkTestConfiguration)-Aot.xml - extraBuildArgs: /p:AotAssemblies=True - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.Locale_Tests-Signed.apk - artifactFolder: Aot - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Android.Locale_Tests-Profiled-Aot - project: tests/locales/Xamarin.Android.Locale-Tests/Xamarin.Android.Locale-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.Locale_Tests-$(ApkTestConfiguration)-Profiled-Aot.xml - extraBuildArgs: /p:AotAssemblies=True /p:AndroidEnableProfiledAot=true - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.Locale_Tests-Signed.apk - artifactFolder: Profiled-Aot - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Android.EmbeddedDSO_Test - project: tests/EmbeddedDSOs/EmbeddedDSO/EmbeddedDSO.csproj - testResultsFiles: TestResult-Xamarin.Android.EmbeddedDSO_Test.nunit-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.EmbeddedDSO_Test-Signed.apk - artifactFolder: Default - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Forms-Performance-Integration - project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj - testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk - artifactFolder: Default - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Forms-Performance-Integration-Aot - project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj - testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration)-Aot.xml - extraBuildArgs: /p:AotAssemblies=true - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk - artifactFolder: Aot - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Forms-Performance-Integration-Profiled-Aot - project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj - testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration)-Profiled-Aot.xml - extraBuildArgs: /p:AotAssemblies=True /p:AndroidEnableProfiledAot=true - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk - artifactFolder: Profiled-Aot - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: Xamarin.Forms-Performance-Integration-Bundle - project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj - testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration)-Bundle.xml - extraBuildArgs: /p:BundleAssemblies=true - artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk - artifactFolder: Bundle - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(ApkTestConfiguration) - testName: VSAndroidApp - project: samples/VSAndroidAppProxy.csproj - testResultsFiles: TestResult-apkdiff-com.companyname.vsandroidapp-Signed-$(ApkTestConfiguration).xml - artifactSource: bin/Test$(ApkTestConfiguration)/com.companyname.vsandroidapp-Signed.apk - artifactFolder: Default - - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(ApkTestConfiguration) - msbuildArguments: >- - /t:AcquireAndroidTarget,ReleaseAndroidTarget - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(ApkTestConfiguration)/shutdown-emulator.binlog - condition: always() - - - template: yaml-templates/upload-results.yaml - parameters: - configuration: $(ApkTestConfiguration) - artifactName: Test Results - APKs Legacy - macOS - - # Plots: Utilize command-line utility built here to send plot information contained in CSV files to AppInsights - - task: MSBuild@1 - displayName: build plots-to-appinsights - inputs: - solution: build-tools/plots-to-appinsights/ProcessPlotCSVFile.csproj - configuration: $(ApkTestConfiguration) - msbuildArguments: >- - /restore - /t:Build - /v:normal - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(ApkTestConfiguration)/plots-to-appinsights.binlog - continueOnError: true - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - - # Process Plot CSV files and send results to AppInsights - # XamarinAndroidMetrics: https://ms.portal.azure.com/#@microsoft.onmicrosoft.com/resource/subscriptions/64e11c84-c922-4ffd-bea9-67ab39354edd/resourceGroups/XamarinMetrics/providers/microsoft.insights/components/XamarinAndroidMetrics/overview - # UNDONE: Need plot definitions for the following files: - # TestResult-Xamarin.Android.EmbeddedDSO_Test-times.csv - - - template: yaml-templates/plots-to-appinsights.yaml - parameters: - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - configuration: $(ApkTestConfiguration) - plotGroup: Test times - plotTitle: Runtime merged - plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Mono.Android_Tests-times.csv - - - template: yaml-templates/plots-to-appinsights.yaml - parameters: - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - configuration: $(ApkTestConfiguration) - plotGroup: Test times - plotTitle: Jcw - plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Xamarin.Android.JcwGen_Tests-times.csv - - - template: yaml-templates/plots-to-appinsights.yaml - parameters: - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - configuration: $(ApkTestConfiguration) - plotGroup: Test times - plotTitle: Locale - plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Xamarin.Android.Locale_Tests-times.csv - - - template: yaml-templates/plots-to-appinsights.yaml - parameters: - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - configuration: $(ApkTestConfiguration) - plotGroup: Test times - plotTitle: Xamarin.Forms app startup - plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Xamarin.Forms_Test-times.csv - - - template: yaml-templates/fail-on-issue.yaml - - # Check - "Xamarin.Android (macOS > Tests > APKs .NET)" - - job: mac_apk_tests_net - displayName: macOS > Tests > APKs .NET - pool: - vmImage: $(HostedMacImage) - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - template: yaml-templates/setup-test-environment.yaml - parameters: - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-xaprepare.yaml - parameters: - displayName: install emulator - arguments: --s=EmulatorTestDependencies - - # Set up dependencies to run tests in both debug and release configurations - - task: DotNetCoreCLI@2 - displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj - inputs: - projects: $(System.DefaultWorkingDirectory)/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj - arguments: -c Debug -bl:$(System.DefaultWorkingDirectory)/bin/TestDebug/BootstrapTasks.binlog - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: >- - -t:PrepareJavaInterop -c Debug -m:1 -v:n - -p:DotNetPreviewTool=$(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration)/dotnet/dotnet - displayName: prepare java.interop Debug - continueOnError: false - - - template: yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) -m:1 -v:n - displayName: prepare java.interop $(XA.Build.Configuration) - continueOnError: false - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-$(XA.Build.Configuration) - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration).xml - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-$(XA.Build.Configuration) - useDotNet: true - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - buildConfiguration: $(XA.Build.Configuration) - configuration: Debug - testName: Mono.Android.NET_Tests-Debug - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-Debug.xml - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk - artifactFolder: $(DotNetTargetFramework)-Debug - useDotNet: true - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-NoAab - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAab.xml - extraBuildArgs: -p:TestsFlavor=NoAab -p:AndroidPackageFormat=apk - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk - artifactFolder: $(DotNetTargetFramework)-NoAab - useDotNet: true - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-Interpreter - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)Interpreter.xml - extraBuildArgs: -p:TestsFlavor=Interpreter -p:UseInterpreter=True - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-Interpreter - useDotNet: true - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-NoAot - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAot.xml - extraBuildArgs: -p:TestsFlavor=NoAot -p:RunAOTCompilation=false - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-NoAot - useDotNet: true - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Mono.Android.NET_Tests-AotLlvm - project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj - testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml - extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false - artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab - artifactFolder: $(DotNetTargetFramework)-AotLlvm - useDotNet: true - - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:AcquireAndroidTarget,ReleaseAndroidTarget - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog - condition: always() - - - template: yaml-templates/upload-results.yaml - parameters: - artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS - - - template: yaml-templates/upload-results.yaml - parameters: - artifactName: Test Results - APKs .NET Debug - macOS - configuration: Debug - - - task: MSBuild@1 - displayName: build plots-to-appinsights - inputs: - solution: build-tools/plots-to-appinsights/ProcessPlotCSVFile.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /restore - /t:Build - /v:normal - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/plots-to-appinsights.binlog - continueOnError: true - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - - - template: yaml-templates/plots-to-appinsights.yaml - parameters: - condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) - configuration: $(XA.Build.Configuration) - plotGroup: Test times - plotTitle: Runtime merged $(DotNetTargetFramework) - plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Mono.Android.NET_Tests-times.csv - - - template: yaml-templates/fail-on-issue.yaml - - # Xamarin.Android (Smoke Tests MSBuild - Mac-0) - - template: yaml-templates/run-msbuild-mac-tests.yaml - parameters: - job_name: mac_dotnet_tests_0 - job_suffix: One .NET - nunit_categories: '| (TestCategory = SmokeTests $(DotNetNUnitCategories))' - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - # Xamarin.Android (Smoke Tests MSBuild - Win-0) - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - job_name: win_dotnet_tests_0 - job_suffix: One .NET - nunit_categories: '| (TestCategory = SmokeTests $(DotNetNUnitCategories))' - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - # Check - "Xamarin.Android (macOS > Tests > MSBuild+Emulator)" - - job: mac_msbuilddevice_tests - displayName: macOS > Tests > MSBuild+Emulator One .NET - pool: - vmImage: $(HostedMacImage) - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - template: yaml-templates/setup-test-environment.yaml - parameters: - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-xaprepare.yaml - parameters: - displayName: install emulator - arguments: --s=EmulatorTestDependencies - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(TestAssembliesArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - - task: MSBuild@1 - displayName: start emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:AcquireAndroidTarget /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/start-emulator.binlog - - - template: yaml-templates/run-nunit-tests.yaml - parameters: - useDotNet: true - testRunTitle: MSBuildDeviceIntegration Smoke - macOS - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll - dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" - testResultsFile: TestResult-MSBuildDeviceIntegrationSmoke-$(XA.Build.Configuration).xml - - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:AcquireAndroidTarget,ReleaseAndroidTarget - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog - condition: always() - - - template: yaml-templates/upload-results.yaml - parameters: - artifactName: Test Results - MSBuild Smoke With Emulator - macOS - One .NET - - - template: yaml-templates/fail-on-issue.yaml - -- stage: linux_tests - displayName: Linux Tests - dependsOn: - - mac_build - - linux_build - jobs: - # Check - "Xamarin.Android (Linux > Tests > MSBuild)" - - job: linux_tests_smoke - displayName: Linux > Tests > MSBuild - pool: android-devdiv-ubuntu-vmss - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - template: yaml-templates/setup-ubuntu.yaml - - - template: yaml-templates/setup-test-environment.yaml - parameters: - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(TestAssembliesArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - - template: yaml-templates/run-nunit-tests.yaml - parameters: - useDotNet: true - testRunTitle: Xamarin.Android.Build.Tests - Linux .NET 6 Smoke Tests - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" - testResultsFile: TestResult-NETSmokeMSBuildTests-Linux-$(XA.Build.Configuration).xml - - - template: yaml-templates/upload-results.yaml - parameters: - configuration: $(XA.Build.Configuration) - artifactName: Test Results - MSBuild Smoke - Linux - - - template: yaml-templates/fail-on-issue.yaml - -- stage: msbuild_legacy - displayName: Legacy Tests - dependsOn: mac_build - # Disabled on .NET release branches - condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)')), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuild'))) - jobs: - # Xamarin.Android (Test MSBuild Legacy - macOS) - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 1 - job_name: mac_msbuild_tests_1 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 2 - job_name: mac_msbuild_tests_2 - job_suffix: Legacy - run_extra_tests: true - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 3 - job_name: mac_msbuild_tests_3 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 4 - job_name: mac_msbuild_tests_4 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 5 - job_name: mac_msbuild_tests_5 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 6 - job_name: mac_msbuild_tests_6 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - # Xamarin.Android (Test MSBuild Legacy - Windows) - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - node_id: 1 - additional_node_id: 4 - job_name: win_msbuild_tests_1 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - node_id: 2 - additional_node_id: 5 - job_name: win_msbuild_tests_2 - job_suffix: Legacy - run_extra_tests: true - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - node_id: 3 - additional_node_id: 6 - job_name: win_msbuild_tests_3 - job_suffix: Legacy - provisionatorChannel: ${{ parameters.provisionatorChannel }} - -- stage: msbuild_dotnet - displayName: One .NET Tests - dependsOn: mac_build - condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuild'))) - jobs: - # Xamarin.Android (Test MSBuild One .NET - macOS) - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 1 - job_name: mac_dotnet_tests_1 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 2 - job_name: mac_dotnet_tests_2 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 3 - job_name: mac_dotnet_tests_3 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 4 - job_name: mac_dotnet_tests_4 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 5 - job_name: mac_dotnet_tests_5 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-mac-tests.yaml - parameters: - node_id: 6 - job_name: mac_dotnet_tests_6 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - # Xamarin.Android (Test MSBuild One .NET - Windows) - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - node_id: 1 - additional_node_id: 4 - job_name: win_dotnet_tests_1 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - node_id: 2 - additional_node_id: 5 - job_name: win_dotnet_tests_2 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\run-msbuild-win-tests.yaml - parameters: - node_id: 3 - additional_node_id: 6 - job_name: win_dotnet_tests_3 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - -- stage: msbuilddevice_tests - displayName: MSBuild Emulator Tests - dependsOn: mac_build - condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuildDevice'))) - jobs: - # Check - "Xamarin.Android (macOS > Tests > MSBuild+Emulator Legacy #N)" - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 1 - job_name: mac_msbuilddevice_tests_1 - job_suffix: Legacy - nunit_categories: '&& cat != Debugger' - provisionatorChannel: ${{ parameters.provisionatorChannel }} - jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) - - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 2 - job_name: mac_msbuilddevice_tests_2 - job_suffix: Legacy - nunit_categories: '&& cat != Debugger' - provisionatorChannel: ${{ parameters.provisionatorChannel }} - jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) - - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 3 - job_name: mac_msbuilddevice_tests_3 - job_suffix: Legacy - nunit_categories: '&& cat != Debugger' - provisionatorChannel: ${{ parameters.provisionatorChannel }} - jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) - - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 4 - job_name: mac_msbuilddevice_tests_with_debugger - job_suffix: Legacy - jdkTestFolder: $(XA.Jdk11.Folder) - nunit_categories: '&& cat == Debugger' - provisionatorChannel: ${{ parameters.provisionatorChannel }} - jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) - - # Check - "Xamarin.Android (macOS > Tests > MSBuild+Emulator One .NET #N)" - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 1 - job_name: mac_dotnetdevice_tests_1 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 2 - job_name: mac_dotnetdevice_tests_2 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 3 - job_name: mac_dotnetdevice_tests_3 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-msbuild-device-tests.yaml - parameters: - node_id: 4 - job_name: mac_dotnetdevice_tests_4 - job_suffix: One .NET - nunit_categories: $(DotNetNUnitCategories) - target_framework: $(DotNetStableTargetFramework) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - -- stage: wear_tests - displayName: WearOS Tests - dependsOn: mac_build - condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuildDevice'))) - jobs: - - job: wear_tests - displayName: macOS > Tests > WearOS - timeoutInMinutes: 180 - cancelTimeoutInMinutes: 2 - strategy: - matrix: - Android30-x86: - avdApiLevel: 30 - avdAbi: x86 - avdType: android-wear - deviceName: wear_square - pool: - vmImage: $(HostedMacImage) - workspace: - clean: all - steps: - - template: yaml-templates/setup-test-environment.yaml - parameters: - configuration: $(XA.Build.Configuration) - - - template: yaml-templates/run-xaprepare.yaml - parameters: - displayName: install required brew tools and prepare java.interop - arguments: --s=Required --auto-provision=yes --auto-provision-uses-sudo=yes - - - template: yaml-templates/run-xaprepare.yaml - parameters: - displayName: install emulator - arguments: --s=EmulatorTestDependencies - - - script: echo "##vso[task.setvariable variable=Java8SdkDirectory]$JAVA_HOME_8_X64" - displayName: set Java8SdkDirectory - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(TestAssembliesArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) - - - task: MSBuild@1 - displayName: install and launch emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:InstallAvdImage;AcquireAndroidTarget /p:TestDeviceName=$(deviceName) /p:TestAvdApiLevel=$(avdApiLevel) /p:TestAvdAbi=$(avdAbi) /p:TestAvdType=$(avdType) /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/install-emulator-$(avdApiLevel).binlog - - - template: yaml-templates/run-nunit-tests.yaml - parameters: - useDotNet: true - testRunTitle: WearOS On Device - macOS - testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll - dotNetTestExtraArgs: --filter "TestCategory = WearOS" - testResultsFile: TestResult-WearOS--$(XA.Build.Configuration).xml - - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:AcquireAndroidTarget,ReleaseAndroidTarget /p:TestDeviceName=$(deviceName) /p:TestAvdApiLevel=$(avdApiLevel) /p:TestAvdAbi=$(avdAbi) /p:TestAvdType=$(avdType) /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog - condition: always() - - - template: yaml-templates/upload-results.yaml - parameters: - configuration: $(XA.Build.Configuration) - artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS - - - template: yaml-templates/fail-on-issue.yaml - - - -- stage: designer_tests - displayName: Designer Tests - dependsOn: mac_build - condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'Designer'))) - jobs: - # Check - "Xamarin.Android (macOS > Tests > Designer Integration)" - - job: designer_integration_mac - condition: false #TODO: Enable once test issues are fixed. - displayName: macOS > Tests > Designer Integration - pool: - vmImage: $(HostedMacImage) - timeoutInMinutes: 120 - cancelTimeoutInMinutes: 5 - workspace: - clean: all - variables: - EnableRegressionTest: true - steps: - - checkout: uitools - clean: true - submodules: recursive - path: s/UITools - persistCredentials: true - - - powershell: | - # Use the branch name of the source being built or the PR target branch name. Fall back to 'main' if the branch is unknown. - $branchPrefix = "/refs/heads/" - $branchName = "$(Build.SourceBranch)" -replace $branchPrefix, "" - if ("$(Build.Reason)" -eq "PullRequest") { - $branchName = "$(System.PullRequest.TargetBranch)" -replace $branchPrefix, "" - } - if (("$branchName" -ne "main") -and ("$branchName" -notlike "d1*")) { - $branchName = "main" - } - Set-Location -Path $(System.DefaultWorkingDirectory)/UITools - git checkout $branchName - git submodule update -q --init --recursive - displayName: Clone and update UITools - - - task: NuGetAuthenticate@0 - displayName: authenticate with azure artifacts - inputs: - forceReinstallCredentialProvider: true - - - task: provisionator@2 - displayName: provision designer dependencies - inputs: - github_token: $(GitHub.Token) - provisioning_script: $(System.DefaultWorkingDirectory)/UITools/Designer/bot-provisioning/dependencies.csx - provisioning_extra_args: -remove Xamarin.Android -vv DEVDIV_PKGS_NUGET_TOKEN=$(DevDiv.NuGet.Token) SECTOOLS_PKGS_NUGET_TOKEN=$(SecTools.NuGet.Token) - env: - PROVISIONATOR_CHANNEL: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/setup-test-environment.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - jdkTestFolder: $(JAVA_HOME_8_X64) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: designer/android-designer-build-mac.yaml@yaml-templates - parameters: - designerSourcePath: $(System.DefaultWorkingDirectory)/UITools/Designer - - - template: designer/android-designer-tests.yaml@yaml-templates - parameters: - designerSourcePath: $(System.DefaultWorkingDirectory)/UITools/Designer - runAddinTests: false - - - task: CopyFiles@2 - displayName: 'Copy binlogs' - inputs: - sourceFolder: $(System.DefaultWorkingDirectory)/UITools/Designer/Xamarin.Designer.Android - contents: '**/*.binlog' - targetFolder: $(Build.ArtifactStagingDirectory)/designer-binlogs - overWrite: true - flattenFolders: true - condition: ne(variables['Agent.JobStatus'], 'Succeeded') - - - template: yaml-templates/publish-artifact.yaml - parameters: - displayName: upload designer binlogs - artifactName: Test Results - Designer - macOS - targetPath: $(Build.ArtifactStagingDirectory)/designer-binlogs - condition: ne(variables['Agent.JobStatus'], 'Succeeded') - - # Check - "Xamarin.Android (Windows > Tests > Designer Integration)" - - job: designer_integration_win - displayName: Windows > Tests > Designer Integration - pool: - vmImage: $(HostedWinImage) - timeoutInMinutes: 120 - cancelTimeoutInMinutes: 5 - workspace: - clean: all - variables: - EnableRegressionTest: true - RegressionTestSuiteOutputDir: C:\Git\ADesRegTestSuite - VisualStudioInstallationPath: C:\Program Files\Microsoft Visual Studio\2022\Enterprise - steps: - - checkout: uitools - clean: true - submodules: recursive - path: s\UITools - persistCredentials: true - - - powershell: | - # Use the branch name of the source being built or the PR target branch name. Fall back to 'main' if the branch is unknown. - $branchPrefix = "/refs/heads/" - $branchName = "$(Build.SourceBranch)" -replace $branchPrefix, "" - if ("$(Build.Reason)" -eq "PullRequest") { - $branchName = "$(System.PullRequest.TargetBranch)" -replace $branchPrefix, "" - } - if (("$branchName" -ne "main") -and ("$branchName" -notlike "d1*")) { - $branchName = "main" - } - Set-Location -Path $(System.DefaultWorkingDirectory)\UITools - git checkout $branchName - git submodule update -q --init --recursive - displayName: Clone and update UITools - - - task: NuGetAuthenticate@0 - displayName: authenticate with azure artifacts - inputs: - forceReinstallCredentialProvider: true - - - task: provisionator@2 - displayName: provision designer dependencies - inputs: - github_token: $(GitHub.Token) - provisioning_script: $(System.DefaultWorkingDirectory)\UITools\Designer\bot-provisioning\dependencies.csx - provisioning_extra_args: -vv DEVDIV_PKGS_NUGET_TOKEN=$(DevDiv.NuGet.Token) SECTOOLS_PKGS_NUGET_TOKEN=$(SecTools.NuGet.Token) - env: - PROVISIONATOR_CHANNEL: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates\setup-test-environment.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)\xamarin-android - jdkTestFolder: $(JAVA_HOME_8_X64) - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - task: VSBuild@1 - displayName: Restore Xamarin.AndroidDesigner - inputs: - solution: $(System.DefaultWorkingDirectory)\UITools\Designer\Xamarin.Designer.Android\Xamarin.AndroidDesigner.sln - vsVersion: 17.0 - msbuildArgs: >- - /t:Restore /p:RestoreDisableParallel=true - /p:RestoreConfigFile="$(System.DefaultWorkingDirectory)\UITools\NuGet.Config" - /p:JavaSdkDirectory="$(JAVA_HOME_8_X64)" - platform: Any CPU - configuration: DebugWin32 - - - task: VSBuild@1 - displayName: Build Xamarin.AndroidDesigner - inputs: - solution: $(System.DefaultWorkingDirectory)\UITools\Designer\Xamarin.Designer.Android\Xamarin.AndroidDesigner.sln - vsVersion: 17.0 - msbuildArgs: /t:Build - platform: Any CPU - configuration: DebugWin32 - - - template: yaml-templates/run-designer-tests.yml - parameters: - designerSourcePath: $(System.DefaultWorkingDirectory)\UITools\Designer - -- stage: bcl_tests - displayName: BCL Emulator Tests - dependsOn: mac_build - # Disabled on .NET release branches - condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)')), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'BCL'))) - jobs: - # Check - "Xamarin.Android (macOS > Tests > BCL (Emulator))" - - job: mac_bcl_tests - displayName: macOS > Tests > BCL (Emulator) - pool: - vmImage: $(HostedMacImage) - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - template: yaml-templates/setup-test-environment.yaml - parameters: - provisionatorChannel: ${{ parameters.provisionatorChannel }} - - - template: yaml-templates/run-xaprepare.yaml - parameters: - displayName: install emulator - arguments: --s=EmulatorTestDependencies - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(TestAssembliesArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration) - - - task: MSBuild@1 - displayName: build remap-assembly-ref.csproj - inputs: - solution: build-tools/remap-assembly-ref/remap-assembly-ref.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/remap-assembly-ref.binlog - - - template: yaml-templates/apk-instrumentation.yaml - parameters: - configuration: $(XA.Build.Configuration) - testName: Xamarin.Android.Bcl-Tests - project: tests/BCL-Tests/Xamarin.Android.Bcl-Tests/Xamarin.Android.Bcl-Tests.csproj - testResultsFiles: TestResult-Xamarin.Android.Bcl_Tests.nunit-$(XA.Build.Configuration).xml - artifactSource: bin/Test$(XA.Build.Configuration)/Xamarin.Android.Bcl_Tests-Signed.apk - artifactFolder: Default - - - task: PublishTestResults@2 - displayName: publish Xamarin.Android.Bcl-Tests-XUnit results - inputs: - testResultsFormat: NUnit - testResultsFiles: TestResult-Xamarin.Android.Bcl_Tests.xunit-$(XA.Build.Configuration).xml - testRunTitle: Xamarin.Android.Bcl-Tests-NUnit - - - task: MSBuild@1 - displayName: shut down emulator - inputs: - solution: tests/BCL-Tests/Xamarin.Android.Bcl-Tests/Xamarin.Android.Bcl-Tests.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:AcquireAndroidTarget,ReleaseAndroidTarget - /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog - condition: always() - - - template: yaml-templates/upload-results.yaml - parameters: - artifactName: Test Results - BCL With Emulator - macOS - - - template: yaml-templates/fail-on-issue.yaml - -- stage: dotnet_prepare_release - displayName: Prepare .NET Release - dependsOn: - - mac_build - - linux_build - condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) - jobs: - # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)" - - template: sign-artifacts/jobs/v2.yml@yaml-templates - parameters: - name: sign_net_mac_win - poolName: $(VSEngMicroBuildPool) - artifactName: $(NuGetArtifactName) - signType: $(MicroBuildSignType) - signedArtifactName: nuget-signed - usePipelineArtifactTasks: true - - # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)" - - template: sign-artifacts/jobs/v2.yml@yaml-templates - parameters: - name: sign_net_linux - displayName: Sign Linux Archive - poolName: $(VSEngMicroBuildPool) - artifactName: $(LinuxNuGetArtifactName) - signType: $(MicroBuildSignType) - signedArtifactName: nuget-linux-signed - usePipelineArtifactTasks: true - - # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)" - - template: nuget-msi-convert/job/v3.yml@yaml-templates - parameters: - yamlResourceName: yaml-templates - dependsOn: sign_net_mac_win - artifactName: nuget-signed - artifactPatterns: | - !*Darwin* - propsArtifactName: $(NuGetArtifactName) - signType: $(MicroBuildSignType) - postConvertSteps: - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(NuGetArtifactName) - downloadPath: $(Build.StagingDirectory)\sign-verify - patterns: | - **/SignVerifyIgnore.txt - - - task: MicroBuildCodesignVerify@3 - displayName: verify signed msi content - inputs: - TargetFolders: $(Build.StagingDirectory)\bin\manifests - ExcludeSNVerify: true - ApprovalListPathForCerts: $(Build.StagingDirectory)\sign-verify\SignVerifyIgnore.txt - - # Check - "Xamarin.Android (Prepare .NET Release Push Internal)" - - job: push_signed_nugets - displayName: Push Internal - dependsOn: - - nuget_convert - - sign_net_linux - condition: and(eq(dependencies.nuget_convert.result, 'Succeeded'), eq(dependencies.sign_net_linux.result, 'Succeeded')) - timeoutInMinutes: 60 - pool: $(VSEngMicroBuildPool) - workspace: - clean: all - variables: - - ${{ if eq(variables['MicroBuildSignType'], 'Real') }}: - - group: Publish-Build-Assets - steps: - - checkout: self - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-signed - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-linux-signed - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vs-msi-nugets - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(WindowsToolchainPdbArtifactName) - downloadPath: $(Build.StagingDirectory)\nuget-signed - - - task: NuGetCommand@2 - displayName: push nupkgs - inputs: - command: push - packagesToPush: $(Build.StagingDirectory)\nuget-signed\*.nupkg - nuGetFeedType: external - publishFeedCredentials: $(DotNetFeedCredential) - condition: and(succeeded(), eq(variables['PushXAPackages'], 'true')) - - - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions - parameters: - githubToken: $(GitHub.Token) - githubContext: $(NupkgCommitStatusName) - blobName: $(NupkgCommitStatusName) - packagePrefix: xamarin-android - artifactsPath: $(Build.StagingDirectory)\nuget-signed - yamlResourceName: yaml-templates - - - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions - parameters: - githubToken: $(GitHub.Token) - githubContext: $(VSDropCommitStatusName) - blobName: $(VSDropCommitStatusName) - packagePrefix: xamarin-android - artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) - yamlResourceName: yaml-templates - downloadSteps: - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vsdrop-signed - downloadPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) - - - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions - parameters: - githubToken: $(GitHub.Token) - githubContext: $(MultiTargetVSDropCommitStatusName) - blobName: $(MultiTargetVSDropCommitStatusName) - packagePrefix: xamarin-android - artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) - yamlResourceName: yaml-templates - downloadSteps: - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vsdrop-multitarget-signed - downloadPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) - - - powershell: >- - & dotnet build -v:n -c $(XA.Build.Configuration) - -t:PushManifestToBuildAssetRegistry - -p:BuildAssetRegistryToken=$(MaestroAccessToken) - -p:OutputPath=$(Build.StagingDirectory)\nuget-signed\ - $(System.DefaultWorkingDirectory)\build-tools\create-packs\Microsoft.Android.Sdk.proj - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\push-bar-manifest.binlog - displayName: generate and publish BAR manifest - condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true')) - - - powershell: | - $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16' - $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content - $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' - & dotnet tool update microsoft.dotnet.darc --version "$darcVersion" --add-source "$arcadeServicesSource" --tool-path $(Agent.ToolsDirectory)\darc -v n - & $(Agent.ToolsDirectory)\darc\darc add-build-to-channel --default-channels --id $(BARBuildId) --publishing-infra-version 3 --skip-assets-publishing --password $(MaestroAccessToken) --azdev-pat $(publishing-dnceng-devdiv-code-r-build-re) - displayName: add build to default darc channel - condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true')) - - - template: yaml-templates\upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory) - artifactName: Prepare Release - Push Internal - includeBuildResults: true - -# .NET 6 VS Insertion Stage -# Check - "Xamarin.Android (VS Insertion - Wait For Approval)" -# Check - "Xamarin.Android (VS Insertion - Create VS Drop and Open PR)" -- template: vs-insertion/stage/v1.yml@yaml-templates - parameters: - dependsOn: dotnet_prepare_release - symbolArtifactName: nuget-signed - symbolArtifactPatterns: | - !*Darwin* - pushToShippingFeed: true - nupkgArtifactName: nuget-signed - msiNupkgArtifactName: vs-msi-nugets - condition: eq(variables['MicroBuildSignType'], 'Real') - -- stage: push_nugets_to_nuget_org - displayName: Push to NuGet.org - dependsOn: dotnet_prepare_release - condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded')) - jobs: - - job: wait_for_nuget_org_approval - displayName: Wait For NuGet.org Approval - timeoutInMinutes: 60 # The job timeout should be longer than the task timeout. - pool: server - steps: - - task: ManualValidation@0 - timeoutInMinutes: 30 # The stage can be re-ran if needed. - inputs: - instructions: 'Press "Resume" to push .NET 6 packages to NuGet.org.' - onTimeout: reject - continueOnError: true - - - job: push_to_nuget_org - displayName: Push to NuGet.org - pool: $(VSEngMicroBuildPool) - dependsOn: wait_for_nuget_org_approval - condition: eq(dependencies.wait_for_nuget_org_approval.result, 'Succeeded') - steps: - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-signed - downloadPath: $(System.DefaultWorkingDirectory)\nuget-signed - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: nuget-linux-signed - downloadPath: $(System.DefaultWorkingDirectory)\nuget-signed - - - task: NuGetCommand@2 - displayName: push nupkgs - inputs: - command: push - packagesToPush: $(System.DefaultWorkingDirectory)\nuget-signed\*.nupkg - nuGetFeedType: external - publishFeedCredentials: Xamarin nuget.org - xamarinc - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vs-msi-nugets - downloadPath: $(System.DefaultWorkingDirectory)\vs-msi-nugets - - - task: NuGetCommand@2 - displayName: push msi nupkgs - inputs: - command: push - packagesToPush: $(System.DefaultWorkingDirectory)\vs-msi-nugets\*.nupkg - nuGetFeedType: external - publishFeedCredentials: Xamarin nuget.org - xamarinc - -- stage: finalize_installers - displayName: Prepare Classic Release - dependsOn: mac_build - condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) - jobs: - # Check - "Xamarin.Android (Prepare Classic Release Sign VSIX)" - - job: sign_vsix - displayName: Sign VSIX - pool: $(VSEngMicroBuildPool) - timeoutInMinutes: 180 - workspace: - clean: all - steps: - - checkout: self - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(InstallerArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)\vsix-artifact - patterns: | - Xamarin.Android*.vsix - - - powershell: | - $vsix = Get-ChildItem -Path "$(System.DefaultWorkingDirectory)\vsix-artifact\*" -Include *.vsix -File - if (![System.IO.File]::Exists($vsix)) { - throw [System.IO.FileNotFoundException] "Did not find .vsix file in $(System.DefaultWorkingDirectory)\vsix-artifact" - } - Write-Host "##vso[task.setvariable variable=XA.Unsigned.Vsix]$vsix" - displayName: set variables to unsigned installers - - - powershell: | - $signList = "$(System.DefaultWorkingDirectory)\build-tools\create-packs\SignList.xml" - (Get-Content $signList).Replace("*", "%2A") | Set-Content -Path $signList - displayName: Escape SignList.xml - - - template: yaml-templates\install-microbuild-tooling.yaml - - - task: MSBuild@1 - displayName: msbuild /t:Restore sign-content.proj - inputs: - solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:Restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\restore-sign-content.binlog - - - task: MSBuild@1 - displayName: unzip and sign .vsix content - inputs: - solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:AddVsixContent;Build - /p:SignType=$(MicroBuildSignType) - /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)\MicroBuild\Plugins - /p:VsixPath=$(XA.Unsigned.Vsix) - /p:OutDir=$(Build.StagingDirectory)\ - /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\sign-vsix-content.binlog - - - task: MSBuild@1 - displayName: rezip .vsix - inputs: - solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:ZipVsixContent - /p:VsixPath=$(XA.Unsigned.Vsix) - /p:OutDir=$(Build.StagingDirectory)\ - /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\zip-vsix-content.binlog - - - task: MSBuild@1 - displayName: sign .vsix - inputs: - solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:SignVsix;Build - /p:SignType=$(MicroBuildSignType) - /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)\MicroBuild\Plugins - /p:OutDir=$(System.DefaultWorkingDirectory)\vsix-artifact - /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\sign-vsix.binlog - - - task: MicroBuildCodesignVerify@3 - displayName: verify signed .vsix - inputs: - TargetFolders: $(System.DefaultWorkingDirectory)\vsix-artifact - ExcludeSNVerify: true - ApprovalListPathForCerts: $(System.DefaultWorkingDirectory)\build-tools\create-packs\SignVerifyIgnore.txt - - - task: PublishPipelineArtifact@1 - displayName: upload signed vsix - inputs: - artifactName: vsix-signed - targetPath: $(XA.Unsigned.Vsix) - - - template: yaml-templates\remove-microbuild-tooling.yaml - - - template: yaml-templates\upload-results.yaml - parameters: - artifactName: Clasic Signing Results - vsix - includeBuildResults: true - - # Check - "Xamarin.Android (Prepare Classic Release Notarize and Upload)" - - job: sign_upload_storage - dependsOn: sign_vsix - displayName: Notarize and Upload - pool: - name: $(MacBuildPoolName) - vmImage: $(MacBuildPoolImage) - timeoutInMinutes: 180 - workspace: - clean: all - variables: - - group: Xamarin Notarization - steps: - - checkout: self - submodules: recursive - path: s/xamarin-android - - - checkout: release_scripts - clean: true - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(InstallerArtifactName) - downloadPath: $(System.DefaultWorkingDirectory)/storage-artifacts - patterns: | - xamarin.android*.pkg - updateinfo - - - task: DownloadPipelineArtifact@2 - inputs: - artifactName: vsix-signed - downloadPath: $(System.DefaultWorkingDirectory)/storage-artifacts - - - powershell: | - $pkg = Get-ChildItem -Path "$(System.DefaultWorkingDirectory)/storage-artifacts/*" -Include *.pkg -File - if (![System.IO.File]::Exists($pkg)) { - throw [System.IO.FileNotFoundException] "Did not find .pkg file in $(System.DefaultWorkingDirectory)/storage-artifacts" - } - Write-Host "##vso[task.setvariable variable=XA.Unsigned.Pkg]$pkg" - displayName: set variables to unsigned installers - - - template: yaml-templates/install-microbuild-tooling.yaml - - - task: MSBuild@1 - displayName: msbuild /t:Restore sign-content.proj - inputs: - solution: $(System.DefaultWorkingDirectory)/xamarin-android/build-tools/installers/sign-content.proj - configuration: $(XA.Build.Configuration) - msbuildArguments: /t:Restore /bl:$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/restore-sign-content.binlog - - - task: MSBuild@1 - displayName: sign .pkg - inputs: - solution: $(System.DefaultWorkingDirectory)/xamarin-android/build-tools/installers/sign-content.proj - configuration: $(XA.Build.Configuration) - msbuildArguments: >- - /t:SignPkg;Build - /p:SignType=$(MicroBuildSignType) - /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)/MicroBuild/Plugins - /p:OutDir=$(System.DefaultWorkingDirectory)/storage-artifacts - /bl:$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/sign-pkg.binlog - - - script: > - cd $(System.DefaultWorkingDirectory)/release-scripts && - pwsh notarize.ps1 -FolderForApps $(System.DefaultWorkingDirectory)/storage-artifacts - failOnStderr: true - displayName: Notarize PKG - - - script: xcrun stapler validate $(XA.Unsigned.Pkg) - displayName: validate notarized pkg - - - template: upload-to-storage.yml@yaml-templates - parameters: - BuildPackages: $(System.DefaultWorkingDirectory)/storage-artifacts - AzureContainerName: $(Azure.Container.Name) - AzureUploadLocation: $(Build.DefinitionName)/public/$(Build.BuildId)/$(Build.SourceBranchName)/$(Build.SourceVersion) - SourceDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - - - template: yaml-templates/remove-microbuild-tooling.yaml - - - template: yaml-templates/upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - artifactName: Classic Signing Results - pkg - includeBuildResults: true - -- stage: post_build - displayName: Post Build - dependsOn: - - dotnet_prepare_release - - finalize_installers - condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded'), eq(dependencies.finalize_installers.result, 'Succeeded')) - jobs: - - template: compliance/sbom/job.v1.yml@yaml-templates - parameters: - artifactNames: [ nuget-signed, nuget-linux-signed, vs-msi-nugets, vsdrop-signed ] - statusContexts: [ 'vsts-devdiv artifacts' ] - packageName: xamarin-android - packageFilter: '*.nupkg;*.msi;*.pkg;*.vsix' - GitHub.Token: $(GitHub.Token) - -- stage: tenets - dependsOn: [] - displayName: Tenets - jobs: - # Check - "Xamarin.Android (Tenets Code Analysis)" - - job: run_static_analysis - displayName: Code Analysis - pool: - vmImage: $(HostedWinImage) - timeoutInMinutes: 60 - cancelTimeoutInMinutes: 5 - steps: - - checkout: self - submodules: recursive - - - template: security\credscan\v2.yml@yaml-templates - parameters: - suppressionsFile: $(System.DefaultWorkingDirectory)\build-tools\automation\CredScanSuppressions.json - - - template: security\policheck\v1.yml@yaml-templates - parameters: - exclusionFile: $(System.DefaultWorkingDirectory)\build-tools\automation\PoliCheckExclusions.xml - pE: 1|2|3|4 - rulesDBPath: $(System.DefaultWorkingDirectory)\build-tools\automation\policheck-rules-db.mdb - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@3 - displayName: Run AntiMalware (Defender) Scan - inputs: - FileDirPath: $(System.DefaultWorkingDirectory) - EnableServices: true - condition: succeededOrFailed() - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@1 - displayName: Create Security Analysis Report - inputs: - CredScan: true - PoliCheck: true - condition: succeededOrFailed() - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@2 - displayName: Publish Security Analysis Logs - inputs: - ArtifactName: CodeAnalysisLogs - condition: succeededOrFailed() - - - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@1 - displayName: Fail Job if Security Issues are Detected - inputs: - CredScan: true - PoliCheck: true - condition: succeededOrFailed() - - # Check - "Xamarin.Android (Tenets OneLocBuild)" - - job: OneLocBuild - displayName: OneLocBuild - condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) - pool: VSEngSS-MicroBuild2022-1ES - timeoutInMinutes: 30 - variables: - - group: Xamarin-Secrets - workspace: - clean: all - steps: - - checkout: self - clean: true - - - task: PowerShell@2 - displayName: Update LocProject.json - inputs: - targetType: filePath - filePath: $(Build.SourcesDirectory)\Localize\update-locproject.ps1 - arguments: -SourcesDirectory "$(Build.SourcesDirectory)" -LocProjectPath "$(Build.SourcesDirectory)\Localize\LocProject.json" - - - task: OneLocBuild@2 - displayName: OneLocBuild - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - inputs: - locProj: Localize/LocProject.json - outDir: $(Build.StagingDirectory) - packageSourceAuth: patAuth - patVariable: $(OneLocBuild--PAT) - isCreatePrSelected: true - repoType: gitHub - gitHubPatVariable: $(github--pat--vs-mobiletools-engineering-service2) - prSourceBranchPrefix: locpr - isShouldReusePrSelected: true - isAutoCompletePrSelected: false - isUseLfLineEndingsSelected: true - - - task: PublishBuildArtifacts@1 - displayName: Publish Localization Files - inputs: - PathtoPublish: $(Build.StagingDirectory)/loc - ArtifactName: Loc - condition: succeededOrFailed() +- template: yaml-templates/main-stage.yaml diff --git a/build-tools/automation/yaml-templates/main-stage.yaml b/build-tools/automation/yaml-templates/main-stage.yaml new file mode 100644 index 00000000000..679d021bcb6 --- /dev/null +++ b/build-tools/automation/yaml-templates/main-stage.yaml @@ -0,0 +1,1872 @@ +# This templates contains all the stages needed to build the project, it has been moved to a template so that the stages can +# be rused in a combined pipeline for all SDKs. + +parameters: +- name: repositoryAlias + type: string + default: self + +- name: commit + type: string + default: HEAD + +# Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check. +stages: +- stage: mac_build + displayName: Mac + dependsOn: [] + jobs: + # Check - "Xamarin.Android (macOS > Build)" + - job: mac_build_create_installers + displayName: macOS > Build + pool: + name: $(MacBuildPoolName) + vmImage: $(MacBuildPoolImage) + ${{ if eq(variables['MacBuildPoolName'], 'VSEng-Xamarin-RedmondMac-Android-Untrusted') }}: + demands: macOS.Name -equals Monterey + timeoutInMinutes: 240 + cancelTimeoutInMinutes: 5 + workspace: + clean: all + steps: + - checkout: self + submodules: recursive + path: s/xamarin-android + + - template: ./install-microbuild-tooling.yaml + parameters: + condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) + + - template: ./commercial-build.yaml + parameters: + provisionatorChannel: ${{ parameters.provisionatorChannel }} + signClassicPkgContent: ${{ parameters.signClassicPkgContent }} + + - template: ./remove-microbuild-tooling.yaml + parameters: + condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real')) + + - script: > + mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && + cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && + zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: zip Windows toolchain pdb files + + - task: PublishPipelineArtifact@1 + displayName: upload Windows toolchain pdb files + inputs: + artifactName: $(WindowsToolchainPdbArtifactName) + targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb + + - template: ./upload-results.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + artifactName: Build Results - macOS + includeBuildResults: true + + - template: ./run-xaprepare.yaml + parameters: + arguments: --s=DetermineApplicableTests + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: determine which test stages to run + name: TestConditions + condition: and(succeeded(), eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR')) + +# This stage ensures Windows specific build steps continue to work, and runs unit tests. +- stage: win_build_test + displayName: Windows + dependsOn: [] + jobs: + # Check - "Xamarin.Android (Windows > Build & Smoke Test)" + - job: win_build_test + displayName: Windows > Build & Smoke Test + pool: $(1ESWindowsPool) + timeoutInMinutes: 360 + cancelTimeoutInMinutes: 5 + steps: + - checkout: self + submodules: recursive + + - template: .\kill-processes.yaml + + - template: .\clean.yaml + + - script: | + echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_11_X64% + displayName: set JI_JAVA_HOME + + - template: .\use-dot-net.yaml + parameters: + remove_dotnet: true + + # xabuild still depends on .NET Core 3 or earlier + - template: .\use-dot-net.yaml + parameters: + version: 3.1 + quality: GA + + # Downgrade the XA .vsix installed into the instance of VS that we are building with so that we don't restore/build against a test version. + # The VS installer will attempt to resume any failed or partial installation before trying to downgrade Xamarin.Android. + # VSIXInstaller.exe will exit non-zero when the downgrade attempt is a no-op, so we will allow this step to fail silently. + - powershell: | + $vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + & "$vsWhere" -all -prerelease -latest | Out-Default + $isLatestVSLaunchable = & "$vsWhere" -all -prerelease -latest -property isLaunchable + if ($isLatestVSLaunchable -eq 0) { + $vsPath = & "$vsWhere" -all -prerelease -latest -property installationPath + Write-Host "Attempting to repair VS instance:" $vsPath + $vsInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe" + & "$vsInstaller" resume --installPath $vsPath --quiet --norestart | Out-Default + Write-Host "vs_installer.exe resume attempt complete" + } + $vsixInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\VSIXInstaller.exe" + $ts = Get-Date -Format FileDateTimeUniversal + $log = "xavsixdowngrade-$ts.log" + $process = Start-Process -NoNewWindow -FilePath $vsixInstaller -ArgumentList "/downgrade:Xamarin.Android.Sdk /admin /quiet /logFile:$log" -Wait -PassThru -RedirectStandardError "err.txt" + Get-Content "err.txt" | Write-Host + Get-Content "${env:TEMP}\$log" | Write-Host + Write-Host "VSInstaller.exe exited with code:" $process.ExitCode + Remove-Item "${env:TEMP}\$log" + displayName: downgrade XA to stable + ignoreLASTEXITCODE: true + + - task: DotNetCoreCLI@2 + displayName: Prepare Solution + inputs: + projects: Xamarin.Android.sln + arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog' + + # Build, pack .nupkgs, and extract workload packs to dotnet preview test directory + - template: .\run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: >- + -t:BuildDotNet,PackDotNet -c $(XA.Build.Configuration) -v:n + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog + displayName: Build Solution + continueOnError: false + + - task: MSBuild@1 + displayName: msbuild create-vsix + inputs: + solution: build-tools\create-vsix\create-vsix.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-create-vsix.binlog + + - task: MSBuild@1 + displayName: msbuild xabuild + inputs: + solution: tools\xabuild\xabuild.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-xabuild.binlog + + - task: CmdLine@1 + displayName: xabuild Xamarin.Android-Tests + inputs: + filename: bin\$(XA.Build.Configuration)\bin\xabuild.exe + arguments: Xamarin.Android-Tests.sln /restore /p:Configuration=$(XA.Build.Configuration) /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\dotnet-build-tests.binlog + + - template: .\install-apkdiff.yaml + + - template: .\run-nunit-tests.yaml + parameters: + testRunTitle: Smoke MSBuild Tests - Windows Build Tree + testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\net472\Xamarin.Android.Build.Tests.dll + testResultsFile: TestResult-SmokeMSBuildTests-WinBuildTree-$(XA.Build.Configuration).xml + nunitConsoleExtraArgs: --where "cat == SmokeTests" + + - template: .\run-nunit-tests.yaml + parameters: + useDotNet: true + testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build + testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll + testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml + dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" + + - template: .\upload-results.yaml + parameters: + artifactName: Build Results - Windows + includeBuildResults: true + + - template: .\fail-on-issue.yaml + +# Check - "Xamarin.Android (Linux > Build)" +- stage: linux_build + displayName: Linux + dependsOn: [] + jobs: + - job: linux_build_create_sdk_pack + displayName: Linux > Build + pool: android-devdiv-ubuntu-vmss + timeoutInMinutes: 180 + cancelTimeoutInMinutes: 2 + workspace: + clean: all + variables: + CXX: g++-10 + CC: gcc-10 + steps: + - checkout: self + clean: true + submodules: recursive + path: s/xamarin-android + + - checkout: monodroid + clean: true + submodules: recursive + path: s/xamarin-android/external/monodroid + persistCredentials: true + + - script: rm -rf external/monodroid/external/xamarin-android + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: delete external xamarin-android submodule + + - template: ./setup-ubuntu.yaml + + - task: NuGetAuthenticate@0 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true + + - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make prepare-external-git-dependencies + + - script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make jenkins + + - script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make create-nupkgs + + - script: > + df -h && + mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && + ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/Microsoft.Android.Sdk.Linux*.nupkg + $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && + ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/SignList.xml + $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: copy linux sdk + + - task: PublishPipelineArtifact@1 + displayName: upload linux sdk + inputs: + artifactName: $(LinuxNuGetArtifactName) + targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux + + - template: ./upload-results.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + artifactName: Build Results - Linux + includeBuildResults: true + + - template: ./fail-on-issue.yaml + +- stage: smoke_tests + displayName: Smoke Tests + dependsOn: mac_build + jobs: + # Check - "Xamarin.Android (macOS > Tests > APKs Classic)" + - job: mac_apk_tests_legacy + displayName: macOS > Tests > APKs Classic + # Disabled on .NET release branches + condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) + pool: + vmImage: $(HostedMacImage) + timeoutInMinutes: 180 + workspace: + clean: all + variables: + ApkTestConfiguration: Release + steps: + - template: ./setup-test-environment.yaml + parameters: + configuration: $(ApkTestConfiguration) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-xaprepare.yaml + parameters: + displayName: install emulator + arguments: --s=EmulatorTestDependencies + + - template: ./run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) -m:1 -v:n + displayName: prepare java.interop $(XA.Build.Configuration) + continueOnError: false + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Mono.Android_Tests + project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk + artifactFolder: Default + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Mono.Android_Tests-Aot + project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration)-Aot.xml + extraBuildArgs: /p:AotAssemblies=True /p:EnableLLVM=True + artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk + artifactFolder: AotLlvm + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Mono.Android_Tests-Profiled-Aot + project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration)-Profiled-Aot.xml + extraBuildArgs: /p:AotAssemblies=True /p:AndroidEnableProfiledAot=true + artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk + artifactFolder: Profiled-Aot + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Mono.Android_Tests-Bundle + project: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + testResultsFiles: TestResult-Mono.Android_Tests-$(ApkTestConfiguration)-Bundle.xml + extraBuildArgs: /p:BundleAssemblies=true + artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_Tests-Signed.apk + artifactFolder: Bundle + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Mono.Android_TestsAppBundle + project: tests/Mono.Android-Tests/Runtime-AppBundle/Mono.Android-TestsAppBundle.csproj + testResultsFiles: TestResult-Mono.Android_TestsAppBundle-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_TestsAppBundle-Signed.aab + artifactFolder: Aab + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Mono.Android_TestsMultiDex + project: tests/Mono.Android-Tests/Runtime-MultiDex/Mono.Android-TestsMultiDex.csproj + testResultsFiles: TestResult-Mono.Android_TestsMultiDex-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Mono.Android_TestsMultiDex-Signed.apk + artifactFolder: MultiDex + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Android.JcwGen_Tests + project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.JcwGen_Tests-Signed.apk + artifactFolder: Default + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Android.JcwGen_Tests_FastDev + project: tests/CodeGen-Binding/Xamarin.Android.JcwGen-Tests/Xamarin.Android.JcwGen-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.JcwGen_Tests-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.JcwGen_Tests-Signed.apk + artifactFolder: FastDev_Assemblies_Dexes + extraBuildArgs: /p:AndroidFastDeploymentType=Assemblies:Dexes + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Android.Locale_Tests + project: tests/locales/Xamarin.Android.Locale-Tests/Xamarin.Android.Locale-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.Locale_Tests-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.Locale_Tests-Signed.apk + artifactFolder: Default + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Android.Locale_Tests-Aot + project: tests/locales/Xamarin.Android.Locale-Tests/Xamarin.Android.Locale-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.Locale_Tests-$(ApkTestConfiguration)-Aot.xml + extraBuildArgs: /p:AotAssemblies=True + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.Locale_Tests-Signed.apk + artifactFolder: Aot + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Android.Locale_Tests-Profiled-Aot + project: tests/locales/Xamarin.Android.Locale-Tests/Xamarin.Android.Locale-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.Locale_Tests-$(ApkTestConfiguration)-Profiled-Aot.xml + extraBuildArgs: /p:AotAssemblies=True /p:AndroidEnableProfiledAot=true + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.Locale_Tests-Signed.apk + artifactFolder: Profiled-Aot + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Android.EmbeddedDSO_Test + project: tests/EmbeddedDSOs/EmbeddedDSO/EmbeddedDSO.csproj + testResultsFiles: TestResult-Xamarin.Android.EmbeddedDSO_Test.nunit-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Android.EmbeddedDSO_Test-Signed.apk + artifactFolder: Default + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Forms-Performance-Integration + project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj + testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk + artifactFolder: Default + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Forms-Performance-Integration-Aot + project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj + testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration)-Aot.xml + extraBuildArgs: /p:AotAssemblies=true + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk + artifactFolder: Aot + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Forms-Performance-Integration-Profiled-Aot + project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj + testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration)-Profiled-Aot.xml + extraBuildArgs: /p:AotAssemblies=True /p:AndroidEnableProfiledAot=true + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk + artifactFolder: Profiled-Aot + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: Xamarin.Forms-Performance-Integration-Bundle + project: tests/Xamarin.Forms-Performance-Integration/Droid/Xamarin.Forms.Performance.Integration.Droid.csproj + testResultsFiles: TestResult-apkdiff-Xamarin.Forms_Performance_Integration-Signed-$(ApkTestConfiguration)-Bundle.xml + extraBuildArgs: /p:BundleAssemblies=true + artifactSource: bin/Test$(ApkTestConfiguration)/Xamarin.Forms_Performance_Integration-Signed.apk + artifactFolder: Bundle + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(ApkTestConfiguration) + testName: VSAndroidApp + project: samples/VSAndroidAppProxy.csproj + testResultsFiles: TestResult-apkdiff-com.companyname.vsandroidapp-Signed-$(ApkTestConfiguration).xml + artifactSource: bin/Test$(ApkTestConfiguration)/com.companyname.vsandroidapp-Signed.apk + artifactFolder: Default + + - task: MSBuild@1 + displayName: shut down emulator + inputs: + solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + configuration: $(ApkTestConfiguration) + msbuildArguments: >- + /t:AcquireAndroidTarget,ReleaseAndroidTarget + /bl:$(System.DefaultWorkingDirectory)/bin/Test$(ApkTestConfiguration)/shutdown-emulator.binlog + condition: always() + + - template: ./upload-results.yaml + parameters: + configuration: $(ApkTestConfiguration) + artifactName: Test Results - APKs Legacy - macOS + + # Plots: Utilize command-line utility built here to send plot information contained in CSV files to AppInsights + - task: MSBuild@1 + displayName: build plots-to-appinsights + inputs: + solution: build-tools/plots-to-appinsights/ProcessPlotCSVFile.csproj + configuration: $(ApkTestConfiguration) + msbuildArguments: >- + /restore + /t:Build + /v:normal + /bl:$(System.DefaultWorkingDirectory)/bin/Test$(ApkTestConfiguration)/plots-to-appinsights.binlog + continueOnError: true + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + + # Process Plot CSV files and send results to AppInsights + # XamarinAndroidMetrics: https://ms.portal.azure.com/#@microsoft.onmicrosoft.com/resource/subscriptions/64e11c84-c922-4ffd-bea9-67ab39354edd/resourceGroups/XamarinMetrics/providers/microsoft.insights/components/XamarinAndroidMetrics/overview + # UNDONE: Need plot definitions for the following files: + # TestResult-Xamarin.Android.EmbeddedDSO_Test-times.csv + + - template: ./plots-to-appinsights.yaml + parameters: + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + configuration: $(ApkTestConfiguration) + plotGroup: Test times + plotTitle: Runtime merged + plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Mono.Android_Tests-times.csv + + - template: ./plots-to-appinsights.yaml + parameters: + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + configuration: $(ApkTestConfiguration) + plotGroup: Test times + plotTitle: Jcw + plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Xamarin.Android.JcwGen_Tests-times.csv + + - template: ./plots-to-appinsights.yaml + parameters: + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + configuration: $(ApkTestConfiguration) + plotGroup: Test times + plotTitle: Locale + plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Xamarin.Android.Locale_Tests-times.csv + + - template: ./plots-to-appinsights.yaml + parameters: + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + configuration: $(ApkTestConfiguration) + plotGroup: Test times + plotTitle: Xamarin.Forms app startup + plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Xamarin.Forms_Test-times.csv + + - template: ./fail-on-issue.yaml + + # Check - "Xamarin.Android (macOS > Tests > APKs .NET)" + - job: mac_apk_tests_net + displayName: macOS > Tests > APKs .NET + pool: + vmImage: $(HostedMacImage) + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: ./setup-test-environment.yaml + parameters: + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-xaprepare.yaml + parameters: + displayName: install emulator + arguments: --s=EmulatorTestDependencies + + # Set up dependencies to run tests in both debug and release configurations + - task: DotNetCoreCLI@2 + displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj + inputs: + projects: $(System.DefaultWorkingDirectory)/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj + arguments: -c Debug -bl:$(System.DefaultWorkingDirectory)/bin/TestDebug/BootstrapTasks.binlog + + - template: ./run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: >- + -t:PrepareJavaInterop -c Debug -m:1 -v:n + -p:DotNetPreviewTool=$(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration)/dotnet/dotnet + displayName: prepare java.interop Debug + continueOnError: false + + - template: ./run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: -t:PrepareJavaInterop -c $(XA.Build.Configuration) -m:1 -v:n + displayName: prepare java.interop $(XA.Build.Configuration) + continueOnError: false + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-$(XA.Build.Configuration) + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration).xml + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-$(XA.Build.Configuration) + useDotNet: true + + - template: ./apk-instrumentation.yaml + parameters: + buildConfiguration: $(XA.Build.Configuration) + configuration: Debug + testName: Mono.Android.NET_Tests-Debug + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-Debug.xml + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk + artifactFolder: $(DotNetTargetFramework)-Debug + useDotNet: true + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-NoAab + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAab.xml + extraBuildArgs: -p:TestsFlavor=NoAab -p:AndroidPackageFormat=apk + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.apk + artifactFolder: $(DotNetTargetFramework)-NoAab + useDotNet: true + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-Interpreter + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)Interpreter.xml + extraBuildArgs: -p:TestsFlavor=Interpreter -p:UseInterpreter=True + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-Interpreter + useDotNet: true + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-NoAot + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)NoAot.xml + extraBuildArgs: -p:TestsFlavor=NoAot -p:RunAOTCompilation=false + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-NoAot + useDotNet: true + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(XA.Build.Configuration) + testName: Mono.Android.NET_Tests-AotLlvm + project: tests/Mono.Android-Tests/Runtime-Microsoft.Android.Sdk/Mono.Android.NET-Tests.csproj + testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)AotLlvm.xml + extraBuildArgs: -p:TestsFlavor=AotLlvm -p:EnableLLVM=true -p:AndroidEnableProfiledAot=false + artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab + artifactFolder: $(DotNetTargetFramework)-AotLlvm + useDotNet: true + + - task: MSBuild@1 + displayName: shut down emulator + inputs: + solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:AcquireAndroidTarget,ReleaseAndroidTarget + /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog + condition: always() + + - template: ./upload-results.yaml + parameters: + artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS + + - template: ./upload-results.yaml + parameters: + artifactName: Test Results - APKs .NET Debug - macOS + configuration: Debug + + - task: MSBuild@1 + displayName: build plots-to-appinsights + inputs: + solution: build-tools/plots-to-appinsights/ProcessPlotCSVFile.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /restore + /t:Build + /v:normal + /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/plots-to-appinsights.binlog + continueOnError: true + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + + - template: ./plots-to-appinsights.yaml + parameters: + condition: and(succeeded(), or(eq(variables['Build.Reason'], 'IndividualCI'), eq(variables['Build.Reason'], 'Manual'))) + configuration: $(XA.Build.Configuration) + plotGroup: Test times + plotTitle: Runtime merged $(DotNetTargetFramework) + plotPathAndFilename: $(System.DefaultWorkingDirectory)/TestResult-Mono.Android.NET_Tests-times.csv + + - template: ./fail-on-issue.yaml + + # Xamarin.Android (Smoke Tests MSBuild - Mac-0) + - template: ./run-msbuild-mac-tests.yaml + parameters: + job_name: mac_dotnet_tests_0 + job_suffix: One .NET + nunit_categories: '| (TestCategory = SmokeTests $(DotNetNUnitCategories))' + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + # Xamarin.Android (Smoke Tests MSBuild - Win-0) + - template: .\run-msbuild-win-tests.yaml + parameters: + job_name: win_dotnet_tests_0 + job_suffix: One .NET + nunit_categories: '| (TestCategory = SmokeTests $(DotNetNUnitCategories))' + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + # Check - "Xamarin.Android (macOS > Tests > MSBuild+Emulator)" + - job: mac_msbuilddevice_tests + displayName: macOS > Tests > MSBuild+Emulator One .NET + pool: + vmImage: $(HostedMacImage) + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: ./setup-test-environment.yaml + parameters: + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-xaprepare.yaml + parameters: + displayName: install emulator + arguments: --s=EmulatorTestDependencies + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - task: MSBuild@1 + displayName: start emulator + inputs: + solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /t:AcquireAndroidTarget /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/start-emulator.binlog + + - template: ./run-nunit-tests.yaml + parameters: + useDotNet: true + testRunTitle: MSBuildDeviceIntegration Smoke - macOS + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll + dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" + testResultsFile: TestResult-MSBuildDeviceIntegrationSmoke-$(XA.Build.Configuration).xml + + - task: MSBuild@1 + displayName: shut down emulator + inputs: + solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:AcquireAndroidTarget,ReleaseAndroidTarget + /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog + condition: always() + + - template: ./upload-results.yaml + parameters: + artifactName: Test Results - MSBuild Smoke With Emulator - macOS - One .NET + + - template: ./fail-on-issue.yaml + +- stage: linux_tests + displayName: Linux Tests + dependsOn: + - mac_build + - linux_build + jobs: + # Check - "Xamarin.Android (Linux > Tests > MSBuild)" + - job: linux_tests_smoke + displayName: Linux > Tests > MSBuild + pool: android-devdiv-ubuntu-vmss + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: ./setup-ubuntu.yaml + + - template: ./setup-test-environment.yaml + parameters: + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - template: ./run-nunit-tests.yaml + parameters: + useDotNet: true + testRunTitle: Xamarin.Android.Build.Tests - Linux .NET 6 Smoke Tests + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" + testResultsFile: TestResult-NETSmokeMSBuildTests-Linux-$(XA.Build.Configuration).xml + + - template: ./upload-results.yaml + parameters: + configuration: $(XA.Build.Configuration) + artifactName: Test Results - MSBuild Smoke - Linux + + - template: ./fail-on-issue.yaml + +- stage: msbuild_legacy + displayName: Legacy Tests + dependsOn: mac_build + # Disabled on .NET release branches + condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)')), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuild'))) + jobs: + # Xamarin.Android (Test MSBuild Legacy - macOS) + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 1 + job_name: mac_msbuild_tests_1 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 2 + job_name: mac_msbuild_tests_2 + job_suffix: Legacy + run_extra_tests: true + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 3 + job_name: mac_msbuild_tests_3 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 4 + job_name: mac_msbuild_tests_4 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 5 + job_name: mac_msbuild_tests_5 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 6 + job_name: mac_msbuild_tests_6 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + # Xamarin.Android (Test MSBuild Legacy - Windows) + - template: .\run-msbuild-win-tests.yaml + parameters: + node_id: 1 + additional_node_id: 4 + job_name: win_msbuild_tests_1 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-win-tests.yaml + parameters: + node_id: 2 + additional_node_id: 5 + job_name: win_msbuild_tests_2 + job_suffix: Legacy + run_extra_tests: true + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-win-tests.yaml + parameters: + node_id: 3 + additional_node_id: 6 + job_name: win_msbuild_tests_3 + job_suffix: Legacy + provisionatorChannel: ${{ parameters.provisionatorChannel }} + +- stage: msbuild_dotnet + displayName: One .NET Tests + dependsOn: mac_build + condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuild'))) + jobs: + # Xamarin.Android (Test MSBuild One .NET - macOS) + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 1 + job_name: mac_dotnet_tests_1 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 2 + job_name: mac_dotnet_tests_2 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 3 + job_name: mac_dotnet_tests_3 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 4 + job_name: mac_dotnet_tests_4 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 5 + job_name: mac_dotnet_tests_5 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-mac-tests.yaml + parameters: + node_id: 6 + job_name: mac_dotnet_tests_6 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + # Xamarin.Android (Test MSBuild One .NET - Windows) + - template: .\run-msbuild-win-tests.yaml + parameters: + node_id: 1 + additional_node_id: 4 + job_name: win_dotnet_tests_1 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-win-tests.yaml + parameters: + node_id: 2 + additional_node_id: 5 + job_name: win_dotnet_tests_2 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: .\run-msbuild-win-tests.yaml + parameters: + node_id: 3 + additional_node_id: 6 + job_name: win_dotnet_tests_3 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) & TestCategory != SmokeTests + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + +- stage: msbuilddevice_tests + displayName: MSBuild Emulator Tests + dependsOn: mac_build + condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuildDevice'))) + jobs: + # Check - "Xamarin.Android (macOS > Tests > MSBuild+Emulator Legacy #N)" + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 1 + job_name: mac_msbuilddevice_tests_1 + job_suffix: Legacy + nunit_categories: '&& cat != Debugger' + provisionatorChannel: ${{ parameters.provisionatorChannel }} + jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) + + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 2 + job_name: mac_msbuilddevice_tests_2 + job_suffix: Legacy + nunit_categories: '&& cat != Debugger' + provisionatorChannel: ${{ parameters.provisionatorChannel }} + jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) + + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 3 + job_name: mac_msbuilddevice_tests_3 + job_suffix: Legacy + nunit_categories: '&& cat != Debugger' + provisionatorChannel: ${{ parameters.provisionatorChannel }} + jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) + + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 4 + job_name: mac_msbuilddevice_tests_with_debugger + job_suffix: Legacy + jdkTestFolder: $(XA.Jdk11.Folder) + nunit_categories: '&& cat == Debugger' + provisionatorChannel: ${{ parameters.provisionatorChannel }} + jobCondition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)'))) + + # Check - "Xamarin.Android (macOS > Tests > MSBuild+Emulator One .NET #N)" + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 1 + job_name: mac_dotnetdevice_tests_1 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 2 + job_name: mac_dotnetdevice_tests_2 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 3 + job_name: mac_dotnetdevice_tests_3 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-msbuild-device-tests.yaml + parameters: + node_id: 4 + job_name: mac_dotnetdevice_tests_4 + job_suffix: One .NET + nunit_categories: $(DotNetNUnitCategories) + target_framework: $(DotNetStableTargetFramework) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + +- stage: wear_tests + displayName: WearOS Tests + dependsOn: mac_build + condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'MSBuildDevice'))) + jobs: + - job: wear_tests + displayName: macOS > Tests > WearOS + timeoutInMinutes: 180 + cancelTimeoutInMinutes: 2 + strategy: + matrix: + Android30-x86: + avdApiLevel: 30 + avdAbi: x86 + avdType: android-wear + deviceName: wear_square + pool: + vmImage: $(HostedMacImage) + workspace: + clean: all + steps: + - template: ./setup-test-environment.yaml + parameters: + configuration: $(XA.Build.Configuration) + + - template: ./run-xaprepare.yaml + parameters: + displayName: install required brew tools and prepare java.interop + arguments: --s=Required --auto-provision=yes --auto-provision-uses-sudo=yes + + - template: ./run-xaprepare.yaml + parameters: + displayName: install emulator + arguments: --s=EmulatorTestDependencies + + - script: echo "##vso[task.setvariable variable=Java8SdkDirectory]$JAVA_HOME_8_X64" + displayName: set Java8SdkDirectory + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - task: MSBuild@1 + displayName: install and launch emulator + inputs: + solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /t:InstallAvdImage;AcquireAndroidTarget /p:TestDeviceName=$(deviceName) /p:TestAvdApiLevel=$(avdApiLevel) /p:TestAvdAbi=$(avdAbi) /p:TestAvdType=$(avdType) /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/install-emulator-$(avdApiLevel).binlog + + - template: ./run-nunit-tests.yaml + parameters: + useDotNet: true + testRunTitle: WearOS On Device - macOS + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/MSBuildDeviceIntegration/$(DotNetStableTargetFramework)/MSBuildDeviceIntegration.dll + dotNetTestExtraArgs: --filter "TestCategory = WearOS" + testResultsFile: TestResult-WearOS--$(XA.Build.Configuration).xml + + - task: MSBuild@1 + displayName: shut down emulator + inputs: + solution: tests/Mono.Android-Tests/Mono.Android-Tests.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /t:AcquireAndroidTarget,ReleaseAndroidTarget /p:TestDeviceName=$(deviceName) /p:TestAvdApiLevel=$(avdApiLevel) /p:TestAvdAbi=$(avdAbi) /p:TestAvdType=$(avdType) /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog + condition: always() + + - template: ./upload-results.yaml + parameters: + configuration: $(XA.Build.Configuration) + artifactName: Test Results - Emulator $(avdApiLevel)-$(avdAbi)-$(avdType) - macOS + + - template: ./fail-on-issue.yaml + + + +- stage: designer_tests + displayName: Designer Tests + dependsOn: mac_build + condition: and(succeeded(), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'Designer'))) + jobs: + # Check - "Xamarin.Android (macOS > Tests > Designer Integration)" + - job: designer_integration_mac + condition: false #TODO: Enable once test issues are fixed. + displayName: macOS > Tests > Designer Integration + pool: + vmImage: $(HostedMacImage) + timeoutInMinutes: 120 + cancelTimeoutInMinutes: 5 + workspace: + clean: all + variables: + EnableRegressionTest: true + steps: + - checkout: uitools + clean: true + submodules: recursive + path: s/UITools + persistCredentials: true + + - powershell: | + # Use the branch name of the source being built or the PR target branch name. Fall back to 'main' if the branch is unknown. + $branchPrefix = "/refs/heads/" + $branchName = "$(Build.SourceBranch)" -replace $branchPrefix, "" + if ("$(Build.Reason)" -eq "PullRequest") { + $branchName = "$(System.PullRequest.TargetBranch)" -replace $branchPrefix, "" + } + if (("$branchName" -ne "main") -and ("$branchName" -notlike "d1*")) { + $branchName = "main" + } + Set-Location -Path $(System.DefaultWorkingDirectory)/UITools + git checkout $branchName + git submodule update -q --init --recursive + displayName: Clone and update UITools + + - task: NuGetAuthenticate@0 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true + + - task: provisionator@2 + displayName: provision designer dependencies + inputs: + github_token: $(GitHub.Token) + provisioning_script: $(System.DefaultWorkingDirectory)/UITools/Designer/bot-provisioning/dependencies.csx + provisioning_extra_args: -remove Xamarin.Android -vv DEVDIV_PKGS_NUGET_TOKEN=$(DevDiv.NuGet.Token) SECTOOLS_PKGS_NUGET_TOKEN=$(SecTools.NuGet.Token) + env: + PROVISIONATOR_CHANNEL: ${{ parameters.provisionatorChannel }} + + - template: ./setup-test-environment.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + jdkTestFolder: $(JAVA_HOME_8_X64) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: designer/android-designer-build-mac.yaml@yaml-templates + parameters: + designerSourcePath: $(System.DefaultWorkingDirectory)/UITools/Designer + + - template: designer/android-designer-tests.yaml@yaml-templates + parameters: + designerSourcePath: $(System.DefaultWorkingDirectory)/UITools/Designer + runAddinTests: false + + - task: CopyFiles@2 + displayName: 'Copy binlogs' + inputs: + sourceFolder: $(System.DefaultWorkingDirectory)/UITools/Designer/Xamarin.Designer.Android + contents: '**/*.binlog' + targetFolder: $(Build.ArtifactStagingDirectory)/designer-binlogs + overWrite: true + flattenFolders: true + condition: ne(variables['Agent.JobStatus'], 'Succeeded') + + - template: ./publish-artifact.yaml + parameters: + displayName: upload designer binlogs + artifactName: Test Results - Designer - macOS + targetPath: $(Build.ArtifactStagingDirectory)/designer-binlogs + condition: ne(variables['Agent.JobStatus'], 'Succeeded') + + # Check - "Xamarin.Android (Windows > Tests > Designer Integration)" + - job: designer_integration_win + displayName: Windows > Tests > Designer Integration + pool: + vmImage: $(HostedWinImage) + timeoutInMinutes: 120 + cancelTimeoutInMinutes: 5 + workspace: + clean: all + variables: + EnableRegressionTest: true + RegressionTestSuiteOutputDir: C:\Git\ADesRegTestSuite + VisualStudioInstallationPath: C:\Program Files\Microsoft Visual Studio\2022\Enterprise + steps: + - checkout: uitools + clean: true + submodules: recursive + path: s\UITools + persistCredentials: true + + - powershell: | + # Use the branch name of the source being built or the PR target branch name. Fall back to 'main' if the branch is unknown. + $branchPrefix = "/refs/heads/" + $branchName = "$(Build.SourceBranch)" -replace $branchPrefix, "" + if ("$(Build.Reason)" -eq "PullRequest") { + $branchName = "$(System.PullRequest.TargetBranch)" -replace $branchPrefix, "" + } + if (("$branchName" -ne "main") -and ("$branchName" -notlike "d1*")) { + $branchName = "main" + } + Set-Location -Path $(System.DefaultWorkingDirectory)\UITools + git checkout $branchName + git submodule update -q --init --recursive + displayName: Clone and update UITools + + - task: NuGetAuthenticate@0 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true + + - task: provisionator@2 + displayName: provision designer dependencies + inputs: + github_token: $(GitHub.Token) + provisioning_script: $(System.DefaultWorkingDirectory)\UITools\Designer\bot-provisioning\dependencies.csx + provisioning_extra_args: -vv DEVDIV_PKGS_NUGET_TOKEN=$(DevDiv.NuGet.Token) SECTOOLS_PKGS_NUGET_TOKEN=$(SecTools.NuGet.Token) + env: + PROVISIONATOR_CHANNEL: ${{ parameters.provisionatorChannel }} + + - template: .\setup-test-environment.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)\xamarin-android + jdkTestFolder: $(JAVA_HOME_8_X64) + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - task: VSBuild@1 + displayName: Restore Xamarin.AndroidDesigner + inputs: + solution: $(System.DefaultWorkingDirectory)\UITools\Designer\Xamarin.Designer.Android\Xamarin.AndroidDesigner.sln + vsVersion: 17.0 + msbuildArgs: >- + /t:Restore /p:RestoreDisableParallel=true + /p:RestoreConfigFile="$(System.DefaultWorkingDirectory)\UITools\NuGet.Config" + /p:JavaSdkDirectory="$(JAVA_HOME_8_X64)" + platform: Any CPU + configuration: DebugWin32 + + - task: VSBuild@1 + displayName: Build Xamarin.AndroidDesigner + inputs: + solution: $(System.DefaultWorkingDirectory)\UITools\Designer\Xamarin.Designer.Android\Xamarin.AndroidDesigner.sln + vsVersion: 17.0 + msbuildArgs: /t:Build + platform: Any CPU + configuration: DebugWin32 + + - template: ./run-designer-tests.yml + parameters: + designerSourcePath: $(System.DefaultWorkingDirectory)\UITools\Designer + +- stage: bcl_tests + displayName: BCL Emulator Tests + dependsOn: mac_build + # Disabled on .NET release branches + condition: and(succeeded(), not(startsWith(variables['Build.SourceBranch'], '$(DotNetReleaseBranchPrefix)')), or(eq(variables['RunAllTests'], true), contains(dependencies.mac_build.outputs['mac_build_create_installers.TestConditions.TestAreas'], 'BCL'))) + jobs: + # Check - "Xamarin.Android (macOS > Tests > BCL (Emulator))" + - job: mac_bcl_tests + displayName: macOS > Tests > BCL (Emulator) + pool: + vmImage: $(HostedMacImage) + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: ./setup-test-environment.yaml + parameters: + provisionatorChannel: ${{ parameters.provisionatorChannel }} + + - template: ./run-xaprepare.yaml + parameters: + displayName: install emulator + arguments: --s=EmulatorTestDependencies + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/$(XA.Build.Configuration) + + - task: MSBuild@1 + displayName: build remap-assembly-ref.csproj + inputs: + solution: build-tools/remap-assembly-ref/remap-assembly-ref.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/remap-assembly-ref.binlog + + - template: ./apk-instrumentation.yaml + parameters: + configuration: $(XA.Build.Configuration) + testName: Xamarin.Android.Bcl-Tests + project: tests/BCL-Tests/Xamarin.Android.Bcl-Tests/Xamarin.Android.Bcl-Tests.csproj + testResultsFiles: TestResult-Xamarin.Android.Bcl_Tests.nunit-$(XA.Build.Configuration).xml + artifactSource: bin/Test$(XA.Build.Configuration)/Xamarin.Android.Bcl_Tests-Signed.apk + artifactFolder: Default + + - task: PublishTestResults@2 + displayName: publish Xamarin.Android.Bcl-Tests-XUnit results + inputs: + testResultsFormat: NUnit + testResultsFiles: TestResult-Xamarin.Android.Bcl_Tests.xunit-$(XA.Build.Configuration).xml + testRunTitle: Xamarin.Android.Bcl-Tests-NUnit + + - task: MSBuild@1 + displayName: shut down emulator + inputs: + solution: tests/BCL-Tests/Xamarin.Android.Bcl-Tests/Xamarin.Android.Bcl-Tests.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:AcquireAndroidTarget,ReleaseAndroidTarget + /bl:$(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/shutdown-emulator.binlog + condition: always() + + - template: ./upload-results.yaml + parameters: + artifactName: Test Results - BCL With Emulator - macOS + + - template: ./fail-on-issue.yaml + +- stage: dotnet_prepare_release + displayName: Prepare .NET Release + dependsOn: + - mac_build + - linux_build + condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) + jobs: + # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)" + - template: sign-artifacts/jobs/v2.yml@yaml-templates + parameters: + name: sign_net_mac_win + poolName: $(VSEngMicroBuildPool) + artifactName: $(NuGetArtifactName) + signType: $(MicroBuildSignType) + signedArtifactName: nuget-signed + usePipelineArtifactTasks: true + + # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)" + - template: sign-artifacts/jobs/v2.yml@yaml-templates + parameters: + name: sign_net_linux + displayName: Sign Linux Archive + poolName: $(VSEngMicroBuildPool) + artifactName: $(LinuxNuGetArtifactName) + signType: $(MicroBuildSignType) + signedArtifactName: nuget-linux-signed + usePipelineArtifactTasks: true + + # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)" + - template: nuget-msi-convert/job/v3.yml@yaml-templates + parameters: + yamlResourceName: yaml-templates + dependsOn: sign_net_mac_win + artifactName: nuget-signed + artifactPatterns: | + !*Darwin* + propsArtifactName: $(NuGetArtifactName) + signType: $(MicroBuildSignType) + postConvertSteps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(NuGetArtifactName) + downloadPath: $(Build.StagingDirectory)\sign-verify + patterns: | + **/SignVerifyIgnore.txt + + - task: MicroBuildCodesignVerify@3 + displayName: verify signed msi content + inputs: + TargetFolders: $(Build.StagingDirectory)\bin\manifests + ExcludeSNVerify: true + ApprovalListPathForCerts: $(Build.StagingDirectory)\sign-verify\SignVerifyIgnore.txt + + # Check - "Xamarin.Android (Prepare .NET Release Push Internal)" + - job: push_signed_nugets + displayName: Push Internal + dependsOn: + - nuget_convert + - sign_net_linux + condition: and(eq(dependencies.nuget_convert.result, 'Succeeded'), eq(dependencies.sign_net_linux.result, 'Succeeded')) + timeoutInMinutes: 60 + pool: $(VSEngMicroBuildPool) + workspace: + clean: all + variables: + - ${{ if eq(variables['MicroBuildSignType'], 'Real') }}: + - group: Publish-Build-Assets + steps: + - checkout: self + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: nuget-signed + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: nuget-linux-signed + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vs-msi-nugets + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(WindowsToolchainPdbArtifactName) + downloadPath: $(Build.StagingDirectory)\nuget-signed + + - task: NuGetCommand@2 + displayName: push nupkgs + inputs: + command: push + packagesToPush: $(Build.StagingDirectory)\nuget-signed\*.nupkg + nuGetFeedType: external + publishFeedCredentials: $(DotNetFeedCredential) + condition: and(succeeded(), eq(variables['PushXAPackages'], 'true')) + + - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions + parameters: + githubToken: $(GitHub.Token) + githubContext: $(NupkgCommitStatusName) + blobName: $(NupkgCommitStatusName) + packagePrefix: xamarin-android + artifactsPath: $(Build.StagingDirectory)\nuget-signed + yamlResourceName: yaml-templates + + - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions + parameters: + githubToken: $(GitHub.Token) + githubContext: $(VSDropCommitStatusName) + blobName: $(VSDropCommitStatusName) + packagePrefix: xamarin-android + artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) + yamlResourceName: yaml-templates + downloadSteps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vsdrop-signed + downloadPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) + + - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions + parameters: + githubToken: $(GitHub.Token) + githubContext: $(MultiTargetVSDropCommitStatusName) + blobName: $(MultiTargetVSDropCommitStatusName) + packagePrefix: xamarin-android + artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) + yamlResourceName: yaml-templates + downloadSteps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vsdrop-multitarget-signed + downloadPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) + + - powershell: >- + & dotnet build -v:n -c $(XA.Build.Configuration) + -t:PushManifestToBuildAssetRegistry + -p:BuildAssetRegistryToken=$(MaestroAccessToken) + -p:OutputPath=$(Build.StagingDirectory)\nuget-signed\ + $(System.DefaultWorkingDirectory)\build-tools\create-packs\Microsoft.Android.Sdk.proj + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\push-bar-manifest.binlog + displayName: generate and publish BAR manifest + condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true')) + + - powershell: | + $versionEndpoint = 'https://maestro-prod.westus2.cloudapp.azure.com/api/assets/darc-version?api-version=2019-01-16' + $darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content + $arcadeServicesSource = 'https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json' + & dotnet tool update microsoft.dotnet.darc --version "$darcVersion" --add-source "$arcadeServicesSource" --tool-path $(Agent.ToolsDirectory)\darc -v n + & $(Agent.ToolsDirectory)\darc\darc add-build-to-channel --default-channels --id $(BARBuildId) --publishing-infra-version 3 --skip-assets-publishing --password $(MaestroAccessToken) --azdev-pat $(publishing-dnceng-devdiv-code-r-build-re) + displayName: add build to default darc channel + condition: and(succeeded(), eq(variables['PushXAPackageInfoToMaestro'], 'true')) + + - template: .\upload-results.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory) + artifactName: Prepare Release - Push Internal + includeBuildResults: true + +# .NET 6 VS Insertion Stage +# Check - "Xamarin.Android (VS Insertion - Wait For Approval)" +# Check - "Xamarin.Android (VS Insertion - Create VS Drop and Open PR)" +- template: vs-insertion/stage/v1.yml@yaml-templates + parameters: + dependsOn: dotnet_prepare_release + symbolArtifactName: nuget-signed + symbolArtifactPatterns: | + !*Darwin* + pushToShippingFeed: true + nupkgArtifactName: nuget-signed + msiNupkgArtifactName: vs-msi-nugets + condition: eq(variables['MicroBuildSignType'], 'Real') + +- stage: push_nugets_to_nuget_org + displayName: Push to NuGet.org + dependsOn: dotnet_prepare_release + condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded')) + jobs: + - job: wait_for_nuget_org_approval + displayName: Wait For NuGet.org Approval + timeoutInMinutes: 60 # The job timeout should be longer than the task timeout. + pool: server + steps: + - task: ManualValidation@0 + timeoutInMinutes: 30 # The stage can be re-ran if needed. + inputs: + instructions: 'Press "Resume" to push .NET 6 packages to NuGet.org.' + onTimeout: reject + continueOnError: true + + - job: push_to_nuget_org + displayName: Push to NuGet.org + pool: $(VSEngMicroBuildPool) + dependsOn: wait_for_nuget_org_approval + condition: eq(dependencies.wait_for_nuget_org_approval.result, 'Succeeded') + steps: + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: nuget-signed + downloadPath: $(System.DefaultWorkingDirectory)\nuget-signed + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: nuget-linux-signed + downloadPath: $(System.DefaultWorkingDirectory)\nuget-signed + + - task: NuGetCommand@2 + displayName: push nupkgs + inputs: + command: push + packagesToPush: $(System.DefaultWorkingDirectory)\nuget-signed\*.nupkg + nuGetFeedType: external + publishFeedCredentials: Xamarin nuget.org - xamarinc + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vs-msi-nugets + downloadPath: $(System.DefaultWorkingDirectory)\vs-msi-nugets + + - task: NuGetCommand@2 + displayName: push msi nupkgs + inputs: + command: push + packagesToPush: $(System.DefaultWorkingDirectory)\vs-msi-nugets\*.nupkg + nuGetFeedType: external + publishFeedCredentials: Xamarin nuget.org - xamarinc + +- stage: finalize_installers + displayName: Prepare Classic Release + dependsOn: mac_build + condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) + jobs: + # Check - "Xamarin.Android (Prepare Classic Release Sign VSIX)" + - job: sign_vsix + displayName: Sign VSIX + pool: $(VSEngMicroBuildPool) + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - checkout: self + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(InstallerArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)\vsix-artifact + patterns: | + Xamarin.Android*.vsix + + - powershell: | + $vsix = Get-ChildItem -Path "$(System.DefaultWorkingDirectory)\vsix-artifact\*" -Include *.vsix -File + if (![System.IO.File]::Exists($vsix)) { + throw [System.IO.FileNotFoundException] "Did not find .vsix file in $(System.DefaultWorkingDirectory)\vsix-artifact" + } + Write-Host "##vso[task.setvariable variable=XA.Unsigned.Vsix]$vsix" + displayName: set variables to unsigned installers + + - powershell: | + $signList = "$(System.DefaultWorkingDirectory)\build-tools\create-packs\SignList.xml" + (Get-Content $signList).Replace("*", "%2A") | Set-Content -Path $signList + displayName: Escape SignList.xml + + - template: .\install-microbuild-tooling.yaml + + - task: MSBuild@1 + displayName: msbuild /t:Restore sign-content.proj + inputs: + solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj + configuration: $(XA.Build.Configuration) + msbuildArguments: /t:Restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\restore-sign-content.binlog + + - task: MSBuild@1 + displayName: unzip and sign .vsix content + inputs: + solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:AddVsixContent;Build + /p:SignType=$(MicroBuildSignType) + /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)\MicroBuild\Plugins + /p:VsixPath=$(XA.Unsigned.Vsix) + /p:OutDir=$(Build.StagingDirectory)\ + /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\sign-vsix-content.binlog + + - task: MSBuild@1 + displayName: rezip .vsix + inputs: + solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:ZipVsixContent + /p:VsixPath=$(XA.Unsigned.Vsix) + /p:OutDir=$(Build.StagingDirectory)\ + /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\zip-vsix-content.binlog + + - task: MSBuild@1 + displayName: sign .vsix + inputs: + solution: $(System.DefaultWorkingDirectory)\build-tools\installers\sign-content.proj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:SignVsix;Build + /p:SignType=$(MicroBuildSignType) + /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)\MicroBuild\Plugins + /p:OutDir=$(System.DefaultWorkingDirectory)\vsix-artifact + /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\sign-vsix.binlog + + - task: MicroBuildCodesignVerify@3 + displayName: verify signed .vsix + inputs: + TargetFolders: $(System.DefaultWorkingDirectory)\vsix-artifact + ExcludeSNVerify: true + ApprovalListPathForCerts: $(System.DefaultWorkingDirectory)\build-tools\create-packs\SignVerifyIgnore.txt + + - task: PublishPipelineArtifact@1 + displayName: upload signed vsix + inputs: + artifactName: vsix-signed + targetPath: $(XA.Unsigned.Vsix) + + - template: .\remove-microbuild-tooling.yaml + + - template: .\upload-results.yaml + parameters: + artifactName: Clasic Signing Results - vsix + includeBuildResults: true + + # Check - "Xamarin.Android (Prepare Classic Release Notarize and Upload)" + - job: sign_upload_storage + dependsOn: sign_vsix + displayName: Notarize and Upload + pool: + name: $(MacBuildPoolName) + vmImage: $(MacBuildPoolImage) + timeoutInMinutes: 180 + workspace: + clean: all + variables: + - group: Xamarin Notarization + steps: + - checkout: self + submodules: recursive + path: s/xamarin-android + + - checkout: release_scripts + clean: true + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(InstallerArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/storage-artifacts + patterns: | + xamarin.android*.pkg + updateinfo + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: vsix-signed + downloadPath: $(System.DefaultWorkingDirectory)/storage-artifacts + + - powershell: | + $pkg = Get-ChildItem -Path "$(System.DefaultWorkingDirectory)/storage-artifacts/*" -Include *.pkg -File + if (![System.IO.File]::Exists($pkg)) { + throw [System.IO.FileNotFoundException] "Did not find .pkg file in $(System.DefaultWorkingDirectory)/storage-artifacts" + } + Write-Host "##vso[task.setvariable variable=XA.Unsigned.Pkg]$pkg" + displayName: set variables to unsigned installers + + - template: ./install-microbuild-tooling.yaml + + - task: MSBuild@1 + displayName: msbuild /t:Restore sign-content.proj + inputs: + solution: $(System.DefaultWorkingDirectory)/xamarin-android/build-tools/installers/sign-content.proj + configuration: $(XA.Build.Configuration) + msbuildArguments: /t:Restore /bl:$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/restore-sign-content.binlog + + - task: MSBuild@1 + displayName: sign .pkg + inputs: + solution: $(System.DefaultWorkingDirectory)/xamarin-android/build-tools/installers/sign-content.proj + configuration: $(XA.Build.Configuration) + msbuildArguments: >- + /t:SignPkg;Build + /p:SignType=$(MicroBuildSignType) + /p:MicroBuildOverridePluginDirectory=$(Build.StagingDirectory)/MicroBuild/Plugins + /p:OutDir=$(System.DefaultWorkingDirectory)/storage-artifacts + /bl:$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/sign-pkg.binlog + + - script: > + cd $(System.DefaultWorkingDirectory)/release-scripts && + pwsh notarize.ps1 -FolderForApps $(System.DefaultWorkingDirectory)/storage-artifacts + failOnStderr: true + displayName: Notarize PKG + + - script: xcrun stapler validate $(XA.Unsigned.Pkg) + displayName: validate notarized pkg + + - template: upload-to-storage.yml@yaml-templates + parameters: + BuildPackages: $(System.DefaultWorkingDirectory)/storage-artifacts + AzureContainerName: $(Azure.Container.Name) + AzureUploadLocation: $(Build.DefinitionName)/public/$(Build.BuildId)/$(Build.SourceBranchName)/$(Build.SourceVersion) + SourceDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + + - template: ./remove-microbuild-tooling.yaml + + - template: ./upload-results.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + artifactName: Classic Signing Results - pkg + includeBuildResults: true + +- stage: post_build + displayName: Post Build + dependsOn: + - dotnet_prepare_release + - finalize_installers + condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded'), eq(dependencies.finalize_installers.result, 'Succeeded')) + jobs: + - template: compliance/sbom/job.v1.yml@yaml-templates + parameters: + artifactNames: [ nuget-signed, nuget-linux-signed, vs-msi-nugets, vsdrop-signed ] + statusContexts: [ 'vsts-devdiv artifacts' ] + packageName: xamarin-android + packageFilter: '*.nupkg;*.msi;*.pkg;*.vsix' + GitHub.Token: $(GitHub.Token) + +- stage: tenets + dependsOn: [] + displayName: Tenets + jobs: + # Check - "Xamarin.Android (Tenets Code Analysis)" + - job: run_static_analysis + displayName: Code Analysis + pool: + vmImage: $(HostedWinImage) + timeoutInMinutes: 60 + cancelTimeoutInMinutes: 5 + steps: + - checkout: self + submodules: recursive + + - template: security\credscan\v2.yml@yaml-templates + parameters: + suppressionsFile: $(System.DefaultWorkingDirectory)\build-tools\automation\CredScanSuppressions.json + + - template: security\policheck\v1.yml@yaml-templates + parameters: + exclusionFile: $(System.DefaultWorkingDirectory)\build-tools\automation\PoliCheckExclusions.xml + pE: 1|2|3|4 + rulesDBPath: $(System.DefaultWorkingDirectory)\build-tools\automation\policheck-rules-db.mdb + + - task: securedevelopmentteam.vss-secure-development-tools.build-task-antimalware.AntiMalware@3 + displayName: Run AntiMalware (Defender) Scan + inputs: + FileDirPath: $(System.DefaultWorkingDirectory) + EnableServices: true + condition: succeededOrFailed() + + - task: securedevelopmentteam.vss-secure-development-tools.build-task-report.SdtReport@1 + displayName: Create Security Analysis Report + inputs: + CredScan: true + PoliCheck: true + condition: succeededOrFailed() + + - task: securedevelopmentteam.vss-secure-development-tools.build-task-publishsecurityanalysislogs.PublishSecurityAnalysisLogs@2 + displayName: Publish Security Analysis Logs + inputs: + ArtifactName: CodeAnalysisLogs + condition: succeededOrFailed() + + - task: securedevelopmentteam.vss-secure-development-tools.build-task-postanalysis.PostAnalysis@1 + displayName: Fail Job if Security Issues are Detected + inputs: + CredScan: true + PoliCheck: true + condition: succeededOrFailed() + + # Check - "Xamarin.Android (Tenets OneLocBuild)" + - job: OneLocBuild + displayName: OneLocBuild + condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) + pool: VSEngSS-MicroBuild2022-1ES + timeoutInMinutes: 30 + variables: + - group: Xamarin-Secrets + workspace: + clean: all + steps: + - checkout: self + clean: true + + - task: PowerShell@2 + displayName: Update LocProject.json + inputs: + targetType: filePath + filePath: $(Build.SourcesDirectory)\Localize\update-locproject.ps1 + arguments: -SourcesDirectory "$(Build.SourcesDirectory)" -LocProjectPath "$(Build.SourcesDirectory)\Localize\LocProject.json" + + - task: OneLocBuild@2 + displayName: OneLocBuild + env: + SYSTEM_ACCESSTOKEN: $(System.AccessToken) + inputs: + locProj: Localize/LocProject.json + outDir: $(Build.StagingDirectory) + packageSourceAuth: patAuth + patVariable: $(OneLocBuild--PAT) + isCreatePrSelected: true + repoType: gitHub + gitHubPatVariable: $(github--pat--vs-mobiletools-engineering-service2) + prSourceBranchPrefix: locpr + isShouldReusePrSelected: true + isAutoCompletePrSelected: false + isUseLfLineEndingsSelected: true + + - task: PublishBuildArtifacts@1 + displayName: Publish Localization Files + inputs: + PathtoPublish: $(Build.StagingDirectory)/loc + ArtifactName: Loc + condition: succeededOrFailed()