Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 47 additions & 24 deletions build-tools/automation/azure-pipelines.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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 &&
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions build-tools/automation/yaml-templates/run-installer.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ 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:
provisionator_uri: $(provisionator-uri)
github_token: $(GitHub.Token)
provisioning_script: $(XA.Provisionator.Args)
provisioning_extra_args: ${{ parameters.provisionExtraArgs }}
condition: and(succeeded(), ne(variables['agent.os'], 'Linux'))
38 changes: 21 additions & 17 deletions build-tools/automation/yaml-templates/setup-test-environment.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -48,39 +54,37 @@ 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
inputs:
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:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks fine to me, this test just needs a valid android-support-multidex.jar from somewhere. It doesn't need to be a particular version of it.

binding.Jars.Add (new AndroidItem.InputJar (() => multidex_jar));

Assert.IsTrue (bbuilder.Build (binding), "Binding build should succeed.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,17 +100,23 @@ public string BuildOutputDirectory {

/// <summary>
/// The MonoAndroidTools directory within a local build tree, e.g. xamarin-android/bin/Debug/lib/xamarin.android/xbuild/Xamarin/Android.<br/>
/// If a local build tree can not be found, or if it is empty, this will return the system installation location instead:<br/>
/// 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:<br/>
/// Windows: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Xamarin\Android <br/>
/// 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<br/>
/// Windows (dotnet): %USERPROFILE%\android-toolchain\dotnet\packs\Microsoft.Android.Sdk.Windows\$(Latest)\tools<br/>
/// macOS (dotnet): $HOME/android-toolchain/dotnet/packs/Microsoft.Android.Sdk.Darwin/$(Latest)/tools
/// </summary>
public string AndroidMSBuildDirectory {
get {
var msbuildDir = Path.Combine (BuildOutputDirectory, "lib", "xamarin.android", "xbuild", "Xamarin", "Android");
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;
}
}
}

Expand Down Expand Up @@ -189,17 +195,13 @@ public void GetTargetFrameworkVersionRange (out string firstApiLevel, out string
Version lastVersion = null;
List<string> allTFVs = new List<string> ();

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;
Expand All @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using Xamarin.Android.Tools.VSWhere;

Expand Down Expand Up @@ -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");
Expand Down