From 4d76dbf29589d6febb79596747d07191a1c55184 Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Wed, 22 Dec 2021 11:39:13 -0500 Subject: [PATCH 1/2] [ci] Move Linux tests to separate stage --- build-tools/automation/azure-pipelines.yaml | 71 ++++++++++++------- .../yaml-templates/run-installer.yaml | 2 + .../setup-test-environment.yaml | 38 +++++----- .../Xamarin.Android.Build.Tests/BuildTest.cs | 5 +- .../Xamarin.ProjectTools/Common/Builder.cs | 32 +++++---- .../Common/TestEnvironment.cs | 21 ++++++ 6 files changed, 109 insertions(+), 60 deletions(-) diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 7e01336ed52..61ed258a8eb 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -341,15 +341,15 @@ stages: - template: yaml-templates\fail-on-issue.yaml -# Check - "Xamarin.Android (Linux Build and Smoke Test)" -- stage: linux_build_test +# Check - "Xamarin.Android (Linux Build)" +- stage: linux_build displayName: Linux dependsOn: [] jobs: - - job: linux_build_test - displayName: Build and Smoke Test + - job: linux_build_create_sdk_pack + displayName: Build pool: android-devdiv-ubuntu-vmss - timeoutInMinutes: 240 + timeoutInMinutes: 180 cancelTimeoutInMinutes: 2 workspace: clean: all @@ -387,13 +387,9 @@ stages: workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android displayName: make jenkins - - task: DotNetCoreCLI@2 - displayName: extract workload packs - inputs: - projects: $(System.DefaultWorkingDirectory)/xamarin-android/build-tools/create-packs/Microsoft.Android.Sdk.proj - arguments: >- - -t:CreateAllPacks,ExtractWorkloadPacks -c $(XA.Build.Configuration) - -bl:$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/create-all-packs.binlog + - script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make create-nupkgs - script: > mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && @@ -408,29 +404,18 @@ stages: artifactName: nuget-linux-unsigned targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - - template: yaml-templates/install-apkdiff.yaml - - - template: yaml-templates/run-nunit-tests.yaml - parameters: - useDotNet: true - testRunTitle: Xamarin.Android.Build.Tests - Linux .NET 6 Smoke Tests - testAssembly: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Test$(XA.Build.Configuration)/net6.0/Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter CheckSignApk # TODO: Add more tests (e.g. "TestCategory = SmokeTests $(DotNetNUnitCategories)" ) - testResultsFile: TestResult-NET6SmokeMSBuildTests-Linux-$(XA.Build.Configuration).xml - - 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 + - template: yaml-templates/fail-on-issue.yaml - stage: smoke_tests displayName: Smoke Tests dependsOn: mac_build jobs: - # Check - "Xamarin.Android (Smoke Tests APKs Legacy - macOS)" - job: mac_apk_tests_legacy displayName: APKs Legacy - macOS @@ -866,6 +851,44 @@ stages: - 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 Smoke)" + - job: linux_tests_smoke + displayName: MSBuild Smoke + pool: android-devdiv-ubuntu-vmss + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: yaml-templates/setup-ubuntu.yaml + + - template: yaml-templates/setup-test-environment.yaml + + - 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)/net6.0/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" + testResultsFile: TestResult-NET6SmokeMSBuildTests-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 diff --git a/build-tools/automation/yaml-templates/run-installer.yaml b/build-tools/automation/yaml-templates/run-installer.yaml index bf09aeede15..f2269e666b0 100644 --- a/build-tools/automation/yaml-templates/run-installer.yaml +++ b/build-tools/automation/yaml-templates/run-installer.yaml @@ -28,6 +28,7 @@ steps: } Write-Host "##vso[task.setvariable variable=XA.Provisionator.Args]$installer" displayName: find installer and set provisionator variable + condition: and(succeeded(), ne(variables['agent.os'], 'Linux')) - task: provisionator@2 inputs: @@ -35,3 +36,4 @@ steps: github_token: $(GitHub.Token) provisioning_script: $(XA.Provisionator.Args) provisioning_extra_args: ${{ parameters.provisionExtraArgs }} + condition: and(succeeded(), ne(variables['agent.os'], 'Linux')) diff --git a/build-tools/automation/yaml-templates/setup-test-environment.yaml b/build-tools/automation/yaml-templates/setup-test-environment.yaml index 234a8aaeed0..93c0f3add45 100644 --- a/build-tools/automation/yaml-templates/setup-test-environment.yaml +++ b/build-tools/automation/yaml-templates/setup-test-environment.yaml @@ -27,6 +27,12 @@ steps: displayName: set JI_JAVA_HOME condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) +- script: | + echo "##vso[task.setvariable variable=JI_JAVA_HOME]$HOME/android-toolchain/${{ parameters.jdkTestFolder }}" + echo "##vso[task.setvariable variable=DOTNET_TOOL_PATH]$HOME/anroid-toolchain/dotnet/dotnet" + displayName: set JI_JAVA_HOME + condition: and(succeeded(), eq(variables['agent.os'], 'Linux')) + - script: | echo ##vso[task.setvariable variable=JI_JAVA_HOME]%USERPROFILE%\android-toolchain\${{ parameters.jdkTestFolder }} echo ##vso[task.setvariable variable=DOTNET_TOOL_PATH]%USERPROFILE%\android-toolchain\dotnet\dotnet.exe @@ -48,32 +54,24 @@ steps: arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) xaSourcePath: ${{ parameters.xaSourcePath }} - + - template: run-xaprepare.yaml parameters: arguments: --s=AndroidTestDependencies xaSourcePath: ${{ parameters.xaSourcePath }} -- task: MSBuild@1 - displayName: nuget restore Xamarin.Android.Build.Tasks.sln - inputs: - solution: ${{ parameters.xaSourcePath }}/Xamarin.Android.Build.Tasks.sln - configuration: ${{ parameters.configuration }} - msbuildArguments: /t:Restore /p:RestoreConfigFile=${{ parameters.xaSourcePath }}/NuGet.config /bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.Android.Build.Tasks.binlog - -- task: MSBuild@1 - displayName: nuget restore Xamarin.Android-Tests.sln +- task: DotNetCoreCLI@2 + displayName: restore NUnit.Console inputs: - solution: ${{ parameters.xaSourcePath }}/Xamarin.Android-Tests.sln - configuration: ${{ parameters.configuration }} - msbuildArguments: /t:Restore /p:RestoreConfigFile=${{ parameters.xaSourcePath }}/NuGet.config /bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.Android-Tests.binlog + command: restore + projects: ${{ parameters.xaSourcePath }}/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/Xamarin.Android.Build.Tests.csproj + restoreArguments: --configfile ${{ parameters.xaSourcePath }}/NuGet.config -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/restore-Xamarin.Android.Build.Tests.binlog -- task: MSBuild@1 +- task: DotNetCoreCLI@2 displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj inputs: - solution: ${{ parameters.xaSourcePath }}/build-tools/xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj - configuration: ${{ parameters.configuration }} - msbuildArguments: /restore /bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/BootstrapTasks.binlog + projects: ${{ parameters.xaSourcePath }}/build-tools/Xamarin.Android.Tools.BootstrapTasks/Xamarin.Android.Tools.BootstrapTasks.csproj + arguments: -c ${{ parameters.configuration }} -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/BootstrapTasks.binlog # Download and install .NET nupkgs - task: DownloadPipelineArtifact@2 @@ -81,6 +79,12 @@ steps: artifactName: $(NuGetArtifactName) downloadPath: ${{ parameters.xaSourcePath }}/bin/Build${{ parameters.configuration }}/$(NuGetArtifactName) +- task: DownloadPipelineArtifact@2 + inputs: + artifactName: nuget-linux-unsigned + downloadPath: ${{ parameters.xaSourcePath }}/bin/Build${{ parameters.configuration }}/$(NuGetArtifactName) + condition: and(succeeded(), eq(variables['agent.os'], 'Linux')) + - task: DotNetCoreCLI@2 displayName: extract workload packs inputs: diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs index 3debecd42bc..30a1775209b 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/BuildTest.cs @@ -394,10 +394,7 @@ public void BuildWithExternalJavaLibrary () AndroidClassParser = "class-parse", }; using (var bbuilder = CreateDllBuilder (Path.Combine (path, "BuildWithExternalJavaLibraryBinding"))) { - string multidex_path = TestEnvironment.IsRunningOnCI ? - TestEnvironment.MonoAndroidToolsDirectory : - Path.Combine (XABuildPaths.PrefixDirectory, "lib", "xamarin.android", "xbuild", "Xamarin", "Android"); - string multidex_jar = Path.Combine (multidex_path, "android-support-multidex.jar"); + string multidex_jar = Path.Combine (bbuilder.AndroidMSBuildDirectory, "android-support-multidex.jar"); binding.Jars.Add (new AndroidItem.InputJar (() => multidex_jar)); Assert.IsTrue (bbuilder.Build (binding), "Binding build should succeed."); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs index de887ec912d..47f67720501 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/Builder.cs @@ -100,9 +100,11 @@ public string BuildOutputDirectory { /// /// The MonoAndroidTools directory within a local build tree, e.g. xamarin-android/bin/Debug/lib/xamarin.android/xbuild/Xamarin/Android.
- /// If a local build tree can not be found, or if it is empty, this will return the system installation location instead:
+ /// If a local build tree can not be found, or if it is empty, this will return the system installation or .NET sandbox location instead:
/// Windows: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Xamarin\Android
- /// macOS: /Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild/Xamarin/Android + /// macOS: /Library/Frameworks/Xamarin.Android.framework/Versions/Current/lib/xamarin.android/xbuild/Xamarin/Android
+ /// Windows (dotnet): %USERPROFILE%\android-toolchain\dotnet\packs\Microsoft.Android.Sdk.Windows\$(Latest)\tools
+ /// macOS (dotnet): $HOME/android-toolchain/dotnet/packs/Microsoft.Android.Sdk.Darwin/$(Latest)/tools ///
public string AndroidMSBuildDirectory { get { @@ -110,7 +112,11 @@ public string AndroidMSBuildDirectory { if (Directory.Exists (msbuildDir) && File.Exists (Path.Combine (msbuildDir, "lib", Arm32AbiDir, "libmono-android.release.so"))) return msbuildDir; - return TestEnvironment.MonoAndroidToolsDirectory; + if (UseDotNet) { + return TestEnvironment.DotNetAndroidSdkToolsDirectory; + } else { + return TestEnvironment.MonoAndroidToolsDirectory; + } } } @@ -189,17 +195,13 @@ public void GetTargetFrameworkVersionRange (out string firstApiLevel, out string Version lastVersion = null; List allTFVs = new List (); - foreach (var dir in Directory.EnumerateDirectories (FrameworkLibDirectory, "v*", SearchOption.TopDirectoryOnly)) { - // No binding assemblies in `v1.0`; don't process. - if (Path.GetFileName (dir) == "v1.0") + var searchDir = UseDotNet ? Path.Combine (TestEnvironment.DotNetAndroidSdkDirectory, "data") : FrameworkLibDirectory; + foreach (var apiInfoFile in Directory.EnumerateFiles (searchDir, "AndroidApiInfo.xml", SearchOption.AllDirectories)) { + string frameworkVersion = GetApiInfoElementValue (apiInfoFile, "/AndroidApiInfo/Version"); + string apiLevel = GetApiInfoElementValue (apiInfoFile, "/AndroidApiInfo/Level"); + bool.TryParse (GetApiInfoElementValue (apiInfoFile, "/AndroidApiInfo/Stable"), out bool isStable); + if (!isStable || !Version.TryParse (frameworkVersion.Replace ("v", ""), out Version version)) continue; - Version version; - string v = Path.GetFileName (dir).Replace ("v", ""); - if (!Version.TryParse (v, out version)) - continue; - - string frameworkVersion = "v" + version.ToString (); - string apiLevel = GetApiLevelFromInfoPath (Path.Combine (dir, "AndroidApiInfo.xml")); if (firstVersion == null || version < firstVersion) { firstVersion = version; firstFrameworkVersion = frameworkVersion; @@ -215,13 +217,13 @@ public void GetTargetFrameworkVersionRange (out string firstApiLevel, out string allFrameworkVersions = allTFVs.ToArray (); } - static string GetApiLevelFromInfoPath (string androidApiInfo) + static string GetApiInfoElementValue (string androidApiInfo, string elementPath) { if (!File.Exists (androidApiInfo)) return null; var doc = XDocument.Load (androidApiInfo); - return doc.XPathSelectElement ("/AndroidApiInfo/Level")?.Value; + return doc.XPathSelectElement (elementPath)?.Value; } public bool TargetFrameworkExists (string targetFramework) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs index ac8336b24f4..38da9c40a46 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using Xamarin.Android.Tools.VSWhere; @@ -97,6 +98,26 @@ public static string MonoAndroidToolsDirectory { } } + static string _dotNetAndroidSdkDirectory; + public static string DotNetAndroidSdkDirectory { + get { + if (!string.IsNullOrEmpty (_dotNetAndroidSdkDirectory)) { + return _dotNetAndroidSdkDirectory; + } + var sdkName = IsMacOS ? "Microsoft.Android.Sdk.Darwin" + : TestEnvironment.IsWindows ? "Microsoft.Android.Sdk.Windows" + : "Microsoft.Android.Sdk.Linux"; + + return _dotNetAndroidSdkDirectory = Directory.GetDirectories (Path.Combine (AndroidSdkResolver.GetDotNetPreviewPath (), "packs", sdkName)).LastOrDefault (); + } + } + + public static string DotNetAndroidSdkToolsDirectory { + get { + return Path.Combine (DotNetAndroidSdkDirectory, "tools"); + } + } + public static bool IsUsingJdk8 => AndroidSdkResolver.GetJavaSdkVersionString ().Contains ("1.8.0"); public static bool IsUsingJdk11 => AndroidSdkResolver.GetJavaSdkVersionString ().Contains ("11.0"); From 9702857a17a91880010bba141597c770d0e34ef8 Mon Sep 17 00:00:00 2001 From: Peter Collins Date: Wed, 5 Jan 2022 13:04:29 -0500 Subject: [PATCH 2/2] Update src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs Co-authored-by: Jonathan Peppers --- .../Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs index 38da9c40a46..4bd432cb75f 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/TestEnvironment.cs @@ -104,9 +104,9 @@ public static string DotNetAndroidSdkDirectory { if (!string.IsNullOrEmpty (_dotNetAndroidSdkDirectory)) { return _dotNetAndroidSdkDirectory; } - var sdkName = IsMacOS ? "Microsoft.Android.Sdk.Darwin" - : TestEnvironment.IsWindows ? "Microsoft.Android.Sdk.Windows" - : "Microsoft.Android.Sdk.Linux"; + var sdkName = IsMacOS ? "Microsoft.Android.Sdk.Darwin" : + IsWindows ? "Microsoft.Android.Sdk.Windows" : + "Microsoft.Android.Sdk.Linux"; return _dotNetAndroidSdkDirectory = Directory.GetDirectories (Path.Combine (AndroidSdkResolver.GetDotNetPreviewPath (), "packs", sdkName)).LastOrDefault (); }