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..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
@@ -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" :
+ 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");