diff --git a/build-tools/automation/azure-pipelines-public.yaml b/build-tools/automation/azure-pipelines-public.yaml new file mode 100644 index 00000000000..e3fc3b8a359 --- /dev/null +++ b/build-tools/automation/azure-pipelines-public.yaml @@ -0,0 +1,359 @@ +# .NET for Android Pipeline - Public Build +# This pipeline runs on the public dnceng instance for: +# - PRs from forks (contributors) +# - Main or release branch CI builds +# Internal branches use the DevDiv pipeline (azure-pipelines.yaml) + +name: $(Build.SourceBranchName)-$(Build.SourceVersion)-$(Rev:r) + +trigger: + branches: + include: + - main + - release/* + +pr: + branches: + include: + - main + - release/* + +parameters: +- name: macTestAgentsUseCleanImages # Test agents we do not need to clean up when finished because they are not reused + default: true +- name: skipTests # Skip all test stages (builds only). Use 'auto' to auto-skip for non-fork PRs. + displayName: Skip Tests + type: string + default: 'auto' + values: + - 'auto' + - 'true' + - 'false' + +# Repository resources - checkout android-tools to force multi-repo checkout behavior +resources: + repositories: + - repository: android-tools + type: github + name: dotnet/android-tools + endpoint: public + ref: refs/heads/main + +# Global variables +variables: +- template: /build-tools/automation/yaml-templates/variables.yaml@self +# Override for public pipeline +- name: DefaultJavaSdkMajorVersion + value: 21 +# Override pool images for public Microsoft-hosted agents +- name: HostedMacImage + value: macOS-14 +- name: LinuxPoolImage + value: ubuntu-22.04 +- name: NetCorePublicPoolName + value: NetCore-Public +- name: WindowsPoolImageNetCorePublic + value: windows.vs2022.amd64.open +- name: LinuxPoolImageNetCorePublic + value: build.Ubuntu.2204.amd64.open +# Skip tests for non-fork PRs (they should use DevDiv pipeline) unless explicitly requested +- name: SkipTestStages + ${{ if eq(parameters.skipTests, 'true') }}: + value: true + ${{ elseif eq(parameters.skipTests, 'false') }}: + value: false + ${{ elseif and(eq(variables['Build.Reason'], 'PullRequest'), ne(variables['System.PullRequest.IsFork'], 'True')) }}: + value: true + ${{ else }}: + value: false + +# Public builds don't use 1ES templates - just plain stages +stages: +# macOS Build Stage +- stage: mac_build + displayName: Mac + jobs: + - job: mac_build_create_installers + displayName: macOS > Build + pool: + name: Azure Pipelines + vmImage: $(HostedMacImage) + os: macOS + timeoutInMinutes: 240 + cancelTimeoutInMinutes: 5 + workspace: + clean: all + steps: + - checkout: self + path: s/android + persistCredentials: false + + # Checkout a second repo to force multi-repo checkout behavior + # https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path + - checkout: android-tools + path: s/android-tools + + - template: /build-tools/automation/yaml-templates/build-macos-steps.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/android + installerArtifactName: $(InstallerArtifactName) + nugetArtifactName: $(NuGetArtifactName) + testAssembliesArtifactName: $(TestAssembliesArtifactName) + windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName) + buildResultArtifactName: Build Results - macOS + use1ESTemplate: false + +# Windows Build Stage +- stage: win_build_test + displayName: Windows + dependsOn: [] + jobs: + - job: win_build_test + displayName: Windows > Build & Smoke Test + pool: + name: $(NetCorePublicPoolName) + demands: + - ImageOverride -equals $(WindowsPoolImageNetCorePublic) + timeoutInMinutes: 240 + steps: + - checkout: self + persistCredentials: false + + - template: /build-tools/automation/yaml-templates/build-windows-steps.yaml + parameters: + buildResultArtifactName: Build Results - Windows + use1ESTemplate: false + +# Linux Build Stage +- stage: linux_build + displayName: Linux + dependsOn: [] + jobs: + - job: linux_build_create_sdk_pack + displayName: Linux > Build + pool: + name: $(NetCorePublicPoolName) + demands: + - ImageOverride -equals $(LinuxPoolImageNetCorePublic) + timeoutInMinutes: 240 + workspace: + clean: all + variables: + CXX: g++-10 + CC: gcc-10 + steps: + - checkout: self + path: s/android + persistCredentials: false + + # Checkout a second repo to force multi-repo checkout behavior + - checkout: android-tools + path: s/android-tools + + - script: | + sudo apt-get update + sudo apt-get install -y g++-10 gcc-10 + displayName: install g++-10 and gcc-10 + + - template: /build-tools/automation/yaml-templates/build-linux-steps.yaml + parameters: + buildResultArtifactName: Build Results - Linux + xaSourcePath: $(System.DefaultWorkingDirectory)/android + nugetArtifactName: $(LinuxNuGetArtifactName) + use1ESTemplate: false + +# Package Tests Stage +- ${{ if ne(variables.SkipTestStages, 'true') }}: + - template: /build-tools/automation/yaml-templates/stage-package-tests.yaml + parameters: + macTestAgentsUseCleanImages: ${{ parameters.macTestAgentsUseCleanImages }} + use1ESTemplate: false + +# Linux Tests Stage +- stage: linux_tests + displayName: Linux Tests + dependsOn: + - mac_build + - linux_build + condition: and(succeeded(), ne(variables['SkipTestStages'], 'true')) + jobs: + - job: linux_tests_smoke_1 + displayName: Linux > Tests > MSBuild 1 + pool: + name: $(NetCorePublicPoolName) + demands: + - ImageOverride -equals $(LinuxPoolImageNetCorePublic) + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: /build-tools/automation/yaml-templates/setup-test-environment-public.yaml + parameters: + useAgentJdkPath: false + use1ESTemplate: false + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux BuildTest + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = BuildTest" + + - template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + configuration: $(XA.Build.Configuration) + artifactName: Test Results - MSBuild - Linux 1 + use1ESTemplate: false + + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml + + - job: linux_tests_smoke_2 + displayName: Linux > Tests > MSBuild 2 + pool: + name: $(NetCorePublicPoolName) + demands: + - ImageOverride -equals $(LinuxPoolImageNetCorePublic) + timeoutInMinutes: 180 + workspace: + clean: all + steps: + - template: /build-tools/automation/yaml-templates/setup-test-environment-public.yaml + parameters: + useAgentJdkPath: false + use1ESTemplate: false + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux PackagingTest + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = PackagingTest" + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux XASdkTests + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = XASdkTests & Name != XamarinLegacySdk" + + - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml + parameters: + testRunTitle: Xamarin.Android.Build.Tests - Linux AndroidDependenciesTests + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "Name = AndroidDependenciesTests" + + - task: ShellScript@2 + displayName: Test dotnet-local.sh + inputs: + scriptPath: dotnet-local.sh + args: >- + build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj + -p:AndroidSdkDirectory="$(HOME)/android-toolchain/sdk" + -bl:$(System.DefaultWorkingDirectory)/bin/Build$(XA.Build.Configuration)/build-helloworld.binlog + + - template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + configuration: $(XA.Build.Configuration) + artifactName: Test Results - MSBuild - Linux 2 + includeBuildResults: true + use1ESTemplate: false + + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml + +# MSBuild Tests Stage +- stage: msbuild_dotnet + displayName: MSBuild Tests + dependsOn: mac_build + condition: and(succeeded(), ne(variables['SkipTestStages'], 'true')) + jobs: + - job: mac_msbuild_tests + strategy: + parallel: 10 + displayName: macOS > Tests > MSBuild + pool: + name: Azure Pipelines + vmImage: $(HostedMacImage) + os: macOS + timeoutInMinutes: 240 + cancelTimeoutInMinutes: 5 + steps: + - template: /build-tools/automation/yaml-templates/setup-test-environment-public.yaml + parameters: + installTestSlicer: true + use1ESTemplate: false + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml + parameters: + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + testFilter: '' + testRunTitle: Xamarin.Android.Build.Tests - macOS + retryFailedTests: false + xaSourcePath: $(System.DefaultWorkingDirectory) + + - template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + artifactName: Test Results - MSBuild - macOS-$(System.JobPositionInPhase) + xaSourcePath: $(System.DefaultWorkingDirectory) + use1ESTemplate: false + + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml + parameters: + condition: true + + - job: win_msbuild_tests + strategy: + parallel: 8 + displayName: Windows > Tests > MSBuild + pool: + name: $(NetCorePublicPoolName) + demands: + - ImageOverride -equals $(WindowsPoolImageNetCorePublic) + timeoutInMinutes: 240 + cancelTimeoutInMinutes: 5 + steps: + - script: netsh int ipv4 set global sourceroutingbehavior=drop + + - template: /build-tools/automation/yaml-templates/kill-processes.yaml + + - template: /build-tools/automation/yaml-templates/clean.yaml + + - template: /build-tools/automation/yaml-templates/setup-test-environment-public.yaml + parameters: + useAgentJdkPath: false + installTestSlicer: true + use1ESTemplate: false + + - task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(TestAssembliesArtifactName) + downloadPath: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration) + + - template: /build-tools/automation/yaml-templates/run-sliced-nunit-tests.yaml + parameters: + testAssembly: $(System.DefaultWorkingDirectory)/bin/Test$(XA.Build.Configuration)/$(DotNetStableTargetFramework)/Xamarin.Android.Build.Tests.dll + testFilter: '' + testRunTitle: Xamarin.Android.Build.Tests - Windows + retryFailedTests: false + xaSourcePath: $(System.DefaultWorkingDirectory) + + - template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + artifactName: Test Results - MSBuild - Windows-$(System.JobPositionInPhase) + xaSourcePath: $(System.DefaultWorkingDirectory) + use1ESTemplate: false + + - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml + parameters: + condition: true diff --git a/build-tools/automation/yaml-templates/build-linux-steps.yaml b/build-tools/automation/yaml-templates/build-linux-steps.yaml new file mode 100644 index 00000000000..b883d19dd99 --- /dev/null +++ b/build-tools/automation/yaml-templates/build-linux-steps.yaml @@ -0,0 +1,86 @@ +# Shared Linux build steps for both public and private pipelines +# This template contains the actual build logic without references to private repos + +parameters: + buildResultArtifactName: Build Results - Linux + xaSourcePath: $(System.DefaultWorkingDirectory)/android + nugetArtifactName: $(LinuxNuGetArtifactName) + use1ESTemplate: true + +steps: +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml + parameters: + useAgentJdkPath: false + jdkMajorVersion: $(LatestJavaSdkMajorVersion) + +- template: /build-tools/automation/yaml-templates/use-dot-net.yaml + parameters: + remove_dotnet: true + +- task: NuGetAuthenticate@1 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true + +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: make jenkins + +- script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: make create-nupkgs + +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- task: CopyFiles@2 + inputs: + SourceFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + Contents: | + **/Microsoft.Android.Sdk.Linux*.symbols.nupkg + **/SignList.xml + TargetFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux-symbols + +- task: DeleteFiles@1 + inputs: + SourceFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + Contents: '*.symbols.nupkg' + +- script: > + df -h && + mkdir -p ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux && + ln ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned/Microsoft.Android.Sdk.Linux*.nupkg + ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux && + ln ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned/SignList.xml + ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: copy linux sdk + +- ${{ if ne(parameters.use1ESTemplate, true) }}: + - task: PublishPipelineArtifact@1 + displayName: upload linux sdk + inputs: + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux + + - task: PublishPipelineArtifact@1 + displayName: upload linux sdk symbols + inputs: + artifactName: ${{ parameters.nugetArtifactName }}-symbols + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux-symbols + +- template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + xaSourcePath: ${{ parameters.xaSourcePath }} + artifactName: ${{ parameters.buildResultArtifactName }} + includeBuildResults: true + use1ESTemplate: ${{ parameters.use1ESTemplate }} + +- template: /build-tools/automation/yaml-templates/fail-on-dirty-tree.yaml + parameters: + xaSourcePath: ${{ parameters.xaSourcePath }} + +- template: /build-tools/automation/yaml-templates/fail-on-issue.yaml diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml index 08999e2f033..78fdd444121 100644 --- a/build-tools/automation/yaml-templates/build-linux.yaml +++ b/build-tools/automation/yaml-templates/build-linux.yaml @@ -50,22 +50,11 @@ stages: parameters: resource: ${{ parameters.repositoryAlias }} commit: ${{ parameters.checkoutCommit }} - path: ${{ parameters.checkoutPath }} - persistCredentials: ${{ parameters.checkoutPersistCredentials }} # Always checkout a second resource to ensure we are using multi-repo checkout behavior # https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path - checkout: maui - - template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml - parameters: - useAgentJdkPath: false - jdkMajorVersion: $(LatestJavaSdkMajorVersion) - - - template: /build-tools/automation/yaml-templates/use-dot-net.yaml - parameters: - remove_dotnet: true - - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}: - checkout: android-platform-support clean: true @@ -77,64 +66,9 @@ stages: workingDirectory: ${{ parameters.xaSourcePath }} displayName: make prepare-external-git-dependencies - - task: NuGetAuthenticate@1 - displayName: authenticate with azure artifacts - inputs: - forceReinstallCredentialProvider: true - - - script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: ${{ parameters.xaSourcePath }} - displayName: make jenkins - - - script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: ${{ parameters.xaSourcePath }} - displayName: make create-nupkgs - - - task: CopyFiles@2 - inputs: - SourceFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned - Contents: | - **/Microsoft.Android.Sdk.Linux*.symbols.nupkg - **/SignList.xml - TargetFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux-symbols - - - task: DeleteFiles@1 - inputs: - SourceFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned - Contents: '*.symbols.nupkg' - - - script: > - df -h && - mkdir -p ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned/Microsoft.Android.Sdk.Linux*.nupkg - ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned/SignList.xml - ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux - workingDirectory: ${{ parameters.xaSourcePath }} - displayName: copy linux sdk - - - ${{ if ne(parameters.use1ESTemplate, true) }}: - - task: PublishPipelineArtifact@1 - displayName: upload linux sdk - inputs: - artifactName: ${{ parameters.nugetArtifactName }} - targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux - - - task: PublishPipelineArtifact@1 - displayName: upload linux sdk symbols - inputs: - artifactName: ${{ parameters.nugetArtifactName }}-symbols - targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-linux-symbols - - - template: /build-tools/automation/yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/build-linux-steps.yaml parameters: + buildResultArtifactName: ${{ parameters.buildResultArtifactName }} xaSourcePath: ${{ parameters.xaSourcePath }} - artifactName: ${{ parameters.buildResultArtifactName }} - includeBuildResults: true + nugetArtifactName: ${{ parameters.nugetArtifactName }} use1ESTemplate: ${{ parameters.use1ESTemplate }} - - - template: /build-tools/automation/yaml-templates/fail-on-dirty-tree.yaml - parameters: - xaSourcePath: ${{ parameters.xaSourcePath }} - - - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml diff --git a/build-tools/automation/yaml-templates/build-macos-steps.yaml b/build-tools/automation/yaml-templates/build-macos-steps.yaml new file mode 100644 index 00000000000..f9d207ec43f --- /dev/null +++ b/build-tools/automation/yaml-templates/build-macos-steps.yaml @@ -0,0 +1,104 @@ +# Shared macOS build steps for both public and private pipelines +# This template contains the actual build logic without references to private repos + +parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/android + makeMSBuildArgs: '' + installerArtifactName: $(InstallerArtifactName) + nugetArtifactName: $(NuGetArtifactName) + testAssembliesArtifactName: $(TestAssembliesArtifactName) + windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName) + buildResultArtifactName: Build Results - macOS + use1ESTemplate: true + +steps: +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml + parameters: + useAgentJdkPath: false + jdkMajorVersion: $(LatestJavaSdkMajorVersion) + +- template: /build-tools/automation/yaml-templates/use-dot-net.yaml + parameters: + remove_dotnet: true + +- task: NuGetAuthenticate@1 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true + +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +# Prepare and Build everything +- script: make jenkins CONFIGURATION=$(XA.Build.Configuration) PREPARE_CI=1 PREPARE_AUTOPROVISION=1 MSBUILD_ARGS='${{ parameters.makeMSBuildArgs }}' + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: make jenkins + +- script: make create-installers CONFIGURATION=$(XA.Build.Configuration) MSBUILD_ARGS='${{ parameters.makeMSBuildArgs }}' + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: make create-installers + +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- script: > + mkdir -p ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && + cd ${{ parameters.xaSourcePath }}/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && + zip -r ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: zip Windows toolchain pdb files + +- task: CopyFiles@2 + inputs: + SourceFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + Contents: | + **/*.symbols.nupkg + **/SignList.xml + TargetFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned-symbols + +- task: DeleteFiles@1 + inputs: + SourceFolder: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + Contents: '*.symbols.nupkg' + +- ${{ if ne(parameters.use1ESTemplate, true) }}: + - task: PublishPipelineArtifact@1 + displayName: upload nupkgs + inputs: + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned + + - task: PublishPipelineArtifact@1 + displayName: upload symbols nupkgs + inputs: + artifactName: ${{ parameters.nugetArtifactName }}-symbols + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/nuget-unsigned-symbols + + - task: PublishPipelineArtifact@1 + displayName: upload test assemblies + inputs: + artifactName: ${{ parameters.testAssembliesArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) + + - task: PublishPipelineArtifact@1 + displayName: upload Windows toolchain pdb files + inputs: + artifactName: ${{ parameters.windowsToolchainPdbArtifactName }} + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb + + - task: PublishPipelineArtifact@1 + displayName: upload build tools inventory + inputs: + artifactName: AndroidBuildToolsInventory + targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv + +- template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + xaSourcePath: ${{ parameters.xaSourcePath }} + artifactName: ${{ parameters.buildResultArtifactName }} + includeBuildResults: true + use1ESTemplate: ${{ parameters.use1ESTemplate }} + +- template: /build-tools/automation/yaml-templates/fail-on-dirty-tree.yaml + parameters: + xaSourcePath: ${{ parameters.xaSourcePath }} diff --git a/build-tools/automation/yaml-templates/build-macos.yaml b/build-tools/automation/yaml-templates/build-macos.yaml index 58817ec76da..cd46157f26a 100644 --- a/build-tools/automation/yaml-templates/build-macos.yaml +++ b/build-tools/automation/yaml-templates/build-macos.yaml @@ -72,25 +72,45 @@ stages: parameters: resource: ${{ parameters.repositoryAlias }} commit: ${{ parameters.checkoutCommit }} - path: ${{ parameters.checkoutPath }} - persistCredentials: ${{ parameters.checkoutPersistCredentials }} - - template: /build-tools/automation/yaml-templates/commercial-build.yaml + # Always checkout a second resource to ensure we are using multi-repo checkout behavior + # https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#checkout-path + - checkout: maui + + - ${{ if ne(variables['System.PullRequest.IsFork'], 'True') }}: + - checkout: android-platform-support + submodules: recursive + path: s/android/external/android-platform-support + persistCredentials: true + + - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: ${{ parameters.xaSourcePath }} + displayName: make prepare-external-git-dependencies + + - task: CodeQL3000Init@0 + displayName: CodeQL 3000 Init + condition: and(succeeded(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) + + # Call the shared build steps template + - template: /build-tools/automation/yaml-templates/build-macos-steps.yaml parameters: xaSourcePath: ${{ parameters.xaSourcePath }} installerArtifactName: ${{ parameters.installerArtifactName }} nugetArtifactName: ${{ parameters.nugetArtifactName }} testAssembliesArtifactName: ${{ parameters.testAssembliesArtifactName }} windowsToolchainPdbArtifactName: ${{ parameters.windowsToolchainPdbArtifactName }} + buildResultArtifactName: ${{ parameters.buildResultArtifactName }} use1ESTemplate: ${{ parameters.use1ESTemplate }} - - template: /build-tools/automation/yaml-templates/upload-results.yaml - parameters: - xaSourcePath: ${{ parameters.xaSourcePath }} - artifactName: ${{ parameters.buildResultArtifactName }} - includeBuildResults: true - use1ESTemplate: ${{ parameters.use1ESTemplate }} + - task: CodeQL3000Finalize@0 + displayName: CodeQL 3000 Finalize + condition: and(succeededOrFailed(), eq(variables['Codeql.Enabled'], 'true'), eq(variables['Build.SourceBranch'], 'refs/heads/main')) - - template: /build-tools/automation/yaml-templates/fail-on-dirty-tree.yaml - parameters: - xaSourcePath: ${{ parameters.xaSourcePath }} + - task: DotNetCoreCLI@2 + displayName: macOS signing - add runtime entitlements + condition: and(succeeded(), and(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['Build.DefinitionName'], 'Xamarin.Android'))) + inputs: + projects: ${{ parameters.xaSourcePath }}/build-tools/installers/sign-content.proj + arguments: >- + /t:AddMachOEntitlements /p:Configuration=$(XA.Build.Configuration) + /bl:${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/sign-content.binlog diff --git a/build-tools/automation/yaml-templates/build-windows-steps.yaml b/build-tools/automation/yaml-templates/build-windows-steps.yaml new file mode 100644 index 00000000000..6d3d6738ad2 --- /dev/null +++ b/build-tools/automation/yaml-templates/build-windows-steps.yaml @@ -0,0 +1,112 @@ +# Shared Windows build steps for both public and private pipelines +# This template contains the actual build logic without references to private repos + +parameters: + buildResultArtifactName: Build Results - Windows + use1ESTemplate: true + +steps: +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- template: /build-tools/automation/yaml-templates/kill-processes.yaml + +- template: /build-tools/automation/yaml-templates/clean.yaml + +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml + parameters: + useAgentJdkPath: false + jdkMajorVersion: $(LatestJavaSdkMajorVersion) + +- template: /build-tools/automation/yaml-templates/use-dot-net.yaml + parameters: + remove_dotnet: 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 Xamarin.Android and configure local workloads to test improved local build loop +- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: >- + -t:BuildDotNet -c $(XA.Build.Configuration) -v:n + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog + displayName: Build Solution + continueOnError: false + +- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml + parameters: + project: build-tools/create-packs/Microsoft.Android.Sdk.proj + arguments: >- + -t:ConfigureLocalWorkload -c $(XA.Build.Configuration) -v:n -p:RunningOnCI=false + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\local-workload.binlog + displayName: Run ConfigureLocalWorkload target + continueOnError: false + +- template: /build-tools/automation/yaml-templates/log-disk-space.yaml + +- template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml + parameters: + toolName: apkdiff + version: $(ApkDiffToolVersion) + +- template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml + parameters: + testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build + testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll + dotNetTestExtraArgs: --filter "TestCategory = SmokeTests" + +- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self + parameters: + command: test + project: src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj + arguments: -c $(XA.Build.Configuration) --logger trx --results-directory $(Agent.TempDirectory)/analysis-tests + displayName: Test Microsoft.Android.Sdk.Analysis $(XA.Build.Configuration) + continueOnError: true + +- task: PublishTestResults@2 + displayName: publish Microsoft.Android.Sdk.Analysis.Tests results + inputs: + testResultsFormat: VSTest + testResultsFiles: "$(Agent.TempDirectory)/analysis-tests/*.trx" + testRunTitle: Microsoft.Android.Sdk.Analysis.Tests + continueOnError: true + +- task: BatchScript@1 + displayName: Test dotnet-local.cmd - create template + inputs: + filename: dotnet-local.cmd + arguments: new android -o $(Build.StagingDirectory)/LocalWorkloadTest + +- task: BatchScript@1 + displayName: Test dotnet-local.cmd - build template + inputs: + filename: dotnet-local.cmd + arguments: >- + build -v:n $(Build.StagingDirectory)/LocalWorkloadTest + -p:AndroidSdkDirectory="$(USERPROFILE)\android-toolchain\sdk" + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\build-template.binlog + +# Pack .nupkgs and extract workload packs to dotnet preview test directory +- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: >- + -t:PackDotNet -c $(XA.Build.Configuration) -v:n + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-pack.binlog + displayName: Test PackDotNet + +- template: /build-tools/automation/yaml-templates/upload-results.yaml + parameters: + artifactName: ${{ parameters.buildResultArtifactName }} + includeBuildResults: true + use1ESTemplate: ${{ parameters.use1ESTemplate }} + +- template: /build-tools/automation/yaml-templates/fail-on-dirty-tree.yaml + +- template: /build-tools/automation/yaml-templates/fail-on-issue.yaml diff --git a/build-tools/automation/yaml-templates/build-windows.yaml b/build-tools/automation/yaml-templates/build-windows.yaml index 713f484e92c..228c16a088f 100644 --- a/build-tools/automation/yaml-templates/build-windows.yaml +++ b/build-tools/automation/yaml-templates/build-windows.yaml @@ -10,6 +10,7 @@ parameters: repositoryAlias: self stageName: win_build_test stageDisplayName: Windows + use1ESTemplate: true # This stage ensures Windows specific build steps continue to work, and runs unit tests. stages: @@ -32,100 +33,8 @@ stages: parameters: resource: ${{ parameters.repositoryAlias }} commit: ${{ parameters.checkoutCommit }} - path: ${{ parameters.checkoutPath }} - persistCredentials: ${{ parameters.checkoutPersistCredentials }} - - template: /build-tools/automation/yaml-templates/kill-processes.yaml - - - template: /build-tools/automation/yaml-templates/clean.yaml - - - template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml - parameters: - useAgentJdkPath: false - jdkMajorVersion: $(LatestJavaSdkMajorVersion) - - - template: /build-tools/automation/yaml-templates/use-dot-net.yaml - parameters: - remove_dotnet: 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 Xamarin.Android and configure local workloads to test improved local build loop - - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: >- - -t:BuildDotNet -c $(XA.Build.Configuration) -v:n - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog - displayName: Build Solution - continueOnError: false - - - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml - parameters: - project: build-tools/create-packs/Microsoft.Android.Sdk.proj - arguments: >- - -t:ConfigureLocalWorkload -c $(XA.Build.Configuration) -v:n -p:RunningOnCI=false - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\local-workload.binlog - displayName: Run ConfigureLocalWorkload target - continueOnError: false - - - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml - parameters: - toolName: apkdiff - version: $(ApkDiffToolVersion) - - - template: /build-tools/automation/yaml-templates/run-nunit-tests.yaml - parameters: - testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build - testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll - dotNetTestExtraArgs: --filter "TestCategory = SmokeTests" - - - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self - parameters: - command: test - project: src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj - arguments: -c $(XA.Build.Configuration) --logger trx --results-directory $(Agent.TempDirectory)/analysis-tests - displayName: Test Microsoft.Android.Sdk.Analysis $(XA.Build.Configuration) - continueOnError: true - - - task: PublishTestResults@2 - displayName: publish Microsoft.Android.Sdk.Analysis.Tests results - inputs: - testResultsFormat: VSTest - testResultsFiles: "$(Agent.TempDirectory)/analysis-tests/*.trx" - testRunTitle: Microsoft.Android.Sdk.Analysis.Tests - continueOnError: true - - - task: BatchScript@1 - displayName: Test dotnet-local.cmd - create template - inputs: - filename: dotnet-local.cmd - arguments: new android -o $(Build.StagingDirectory)/LocalWorkloadTest - - - task: BatchScript@1 - displayName: Test dotnet-local.cmd - build template - inputs: - filename: dotnet-local.cmd - arguments: build -v:n $(Build.StagingDirectory)/LocalWorkloadTest - - # Pack .nupkgs and extract workload packs to dotnet preview test directory - - template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: >- - -t:PackDotNet -c $(XA.Build.Configuration) -v:n - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-pack.binlog - displayName: Test PackDotNet - - - template: /build-tools/automation/yaml-templates/upload-results.yaml + - template: /build-tools/automation/yaml-templates/build-windows-steps.yaml parameters: - artifactName: ${{ parameters.buildResultArtifactName }} - includeBuildResults: true - - - template: /build-tools/automation/yaml-templates/fail-on-dirty-tree.yaml - - - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml + buildResultArtifactName: ${{ parameters.buildResultArtifactName }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} diff --git a/build-tools/automation/yaml-templates/log-disk-space.yaml b/build-tools/automation/yaml-templates/log-disk-space.yaml new file mode 100644 index 00000000000..0588684ec2c --- /dev/null +++ b/build-tools/automation/yaml-templates/log-disk-space.yaml @@ -0,0 +1,21 @@ +# Template to log disk space usage on Windows, macOS, and Linux agents +# Useful for diagnosing disk space issues during builds + +steps: +- pwsh: | + Write-Host "=== Disk Space Report ===" + if ($IsWindows) { + Get-PSDrive -PSProvider FileSystem | Where-Object { $_.Used -ne $null } | ForEach-Object { + $total = $_.Used + $_.Free + $usedPercent = ($_.Used / $total) * 100 + Write-Host "$($_.Name):\ - Total: $([math]::Round($total/1GB, 2)) GB, Used: $([math]::Round($_.Used/1GB, 2)) GB ($([math]::Round($usedPercent, 2))%), Free: $([math]::Round($_.Free/1GB, 2)) GB" + } + } else { + # Unix (macOS/Linux) + $dfOutput = df -h / /tmp /home 2>/dev/null | Select-Object -Skip 1 + $dfOutput | ForEach-Object { + Write-Host $_ + } + } + Write-Host "=========================" + displayName: Log Disk Space Usage diff --git a/build-tools/automation/yaml-templates/run-emulator-tests.yaml b/build-tools/automation/yaml-templates/run-emulator-tests.yaml index 3142a2c6a5d..82f583343b9 100644 --- a/build-tools/automation/yaml-templates/run-emulator-tests.yaml +++ b/build-tools/automation/yaml-templates/run-emulator-tests.yaml @@ -21,13 +21,15 @@ jobs: workspace: clean: all steps: - - template: agent-cleanser/v1.yml@yaml-templates + - ${{ if eq(parameters.use1ESTemplate, true) }}: + - template: agent-cleanser/v1.yml@yaml-templates - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml parameters: xaprepareScenario: EmulatorTestDependencies jdkMajorVersion: ${{ parameters.jdkMajorVersion }} useAgentJdkPath: ${{ parameters.useAgentJdkPath }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: diff --git a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml index 7853353e798..d3dbd20c04c 100644 --- a/build-tools/automation/yaml-templates/run-msbuild-tests.yaml +++ b/build-tools/automation/yaml-templates/run-msbuild-tests.yaml @@ -41,6 +41,7 @@ jobs: xaSourcePath: ${{ parameters.xaSourcePath }} repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: diff --git a/build-tools/automation/yaml-templates/setup-test-environment-public.yaml b/build-tools/automation/yaml-templates/setup-test-environment-public.yaml new file mode 100644 index 00000000000..4577ed8f35e --- /dev/null +++ b/build-tools/automation/yaml-templates/setup-test-environment-public.yaml @@ -0,0 +1,42 @@ +# Public version of setup-test-environment template - no private repo references +# Used by the public pipeline running on dnceng-public + +parameters: + configuration: $(XA.Build.Configuration) + xaSourcePath: $(System.DefaultWorkingDirectory) + jdkMajorVersion: $(DefaultJavaSdkMajorVersion) + useAgentJdkPath: true + remove_dotnet: false + dotnetVersion: $(DotNetSdkVersion) + dotnetQuality: $(DotNetSdkQuality) + installTestSlicer: false + installApkDiff: true + updateMono: false + androidSdkPlatforms: $(DefaultTestSdkPlatforms) + repositoryAlias: 'self' + commit: '' + xaprepareScenario: AndroidTestDependencies # Use 'EmulatorTestDependencies' for agents that need the emulator installed + use1ESTemplate: false + +steps: +- checkout: ${{ parameters.repositoryAlias }} + ${{ if ne(parameters.commit, '') }}: + ref: ${{ parameters.commit }} + clean: true + submodules: recursive + +- template: /build-tools/automation/yaml-templates/setup-test-environment-steps.yaml + parameters: + configuration: ${{ parameters.configuration }} + xaSourcePath: ${{ parameters.xaSourcePath }} + jdkMajorVersion: ${{ parameters.jdkMajorVersion }} + useAgentJdkPath: ${{ parameters.useAgentJdkPath }} + remove_dotnet: ${{ parameters.remove_dotnet }} + dotnetVersion: ${{ parameters.dotnetVersion }} + dotnetQuality: ${{ parameters.dotnetQuality }} + installTestSlicer: ${{ parameters.installTestSlicer }} + installApkDiff: ${{ parameters.installApkDiff }} + updateMono: ${{ parameters.updateMono }} + androidSdkPlatforms: ${{ parameters.androidSdkPlatforms }} + xaprepareScenario: ${{ parameters.xaprepareScenario }} + use1ESTemplate: false diff --git a/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml b/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml new file mode 100644 index 00000000000..4f401c02773 --- /dev/null +++ b/build-tools/automation/yaml-templates/setup-test-environment-steps.yaml @@ -0,0 +1,96 @@ +# Shared test environment setup steps for both public and private pipelines +# This template contains the actual setup logic without references to private repos + +parameters: + configuration: $(XA.Build.Configuration) + xaSourcePath: $(System.DefaultWorkingDirectory) + jdkMajorVersion: $(DefaultJavaSdkMajorVersion) + useAgentJdkPath: true + remove_dotnet: false + dotnetVersion: $(DotNetSdkVersion) + dotnetQuality: $(DotNetSdkQuality) + installTestSlicer: false + installApkDiff: true + updateMono: false + androidSdkPlatforms: $(DefaultTestSdkPlatforms) + xaprepareScenario: AndroidTestDependencies # Use 'EmulatorTestDependencies' for agents that need the emulator installed + use1ESTemplate: true + +steps: +- template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml + parameters: + jdkMajorVersion: ${{ parameters.jdkMajorVersion }} + useAgentJdkPath: ${{ parameters.useAgentJdkPath }} + +# Install latest .NET +- template: /build-tools/automation/yaml-templates/use-dot-net.yaml + parameters: + version: ${{ parameters.dotnetVersion }} + quality: ${{ parameters.dotnetQuality }} + remove_dotnet: ${{ parameters.remove_dotnet }} + +- task: DotNetCoreCLI@2 + displayName: shut down existing build daemons + inputs: + command: custom + custom: build-server + arguments: shutdown + +- ${{ if eq(parameters.updateMono, true) }}: + - template: /build-tools/automation/yaml-templates/run-xaprepare.yaml + parameters: + displayName: run xaprepare-UpdateMono + arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes + condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) + xaSourcePath: ${{ parameters.xaSourcePath }} + +# Install p7zip on Linux for public agents +- ${{ if ne(parameters.use1ESTemplate, true) }}: + - bash: | + set -e + sudo apt-get update + sudo apt-get install -y p7zip-full + displayName: Install p7zip on Linux + condition: and(succeeded(), eq(variables['agent.os'], 'Linux')) + +- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml + parameters: + arguments: --s=${{ parameters.xaprepareScenario }} --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}" + xaSourcePath: ${{ parameters.xaSourcePath }} + +- task: DotNetCoreCLI@2 + displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj + inputs: + 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 }}/nuget-unsigned + +- task: DownloadPipelineArtifact@2 + inputs: + artifactName: $(LinuxNuGetArtifactName) + downloadPath: ${{ parameters.xaSourcePath }}/bin/Build${{ parameters.configuration }}/nuget-unsigned + condition: and(succeeded(), eq(variables['agent.os'], 'Linux')) + +- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml + parameters: + displayName: extract workload packs + xaSourcePath: ${{ parameters.xaSourcePath }} + project: ${{ parameters.xaSourcePath }}/build-tools/create-packs/Microsoft.Android.Sdk.proj + arguments: -t:ExtractWorkloadPacks -c ${{ parameters.configuration }} -v:n -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/extract-workloads.binlog + +- ${{ if eq(parameters.installApkDiff, true) }}: + - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml + parameters: + toolName: apkdiff + version: $(ApkDiffToolVersion) + +- ${{ if eq(parameters.installTestSlicer, true) }}: + - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml + parameters: + toolName: dotnet-test-slicer + version: $(TestSlicerToolVersion) diff --git a/build-tools/automation/yaml-templates/setup-test-environment.yaml b/build-tools/automation/yaml-templates/setup-test-environment.yaml index 19a98a86fad..a1470c8c220 100644 --- a/build-tools/automation/yaml-templates/setup-test-environment.yaml +++ b/build-tools/automation/yaml-templates/setup-test-environment.yaml @@ -13,80 +13,35 @@ parameters: repositoryAlias: 'self' commit: '' xaprepareScenario: AndroidTestDependencies # Use 'EmulatorTestDependencies' for agents that need the emulator installed + use1ESTemplate: true steps: -- template: sdk-unified/steps/checkout/v1.yml@yaml-templates - parameters: - resource: ${{ parameters.repositoryAlias }} - commit: ${{ parameters.commit }} +- ${{ if eq(parameters.use1ESTemplate, true) }}: + - template: sdk-unified/steps/checkout/v1.yml@yaml-templates + parameters: + resource: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.commit }} + clean: true + submodules: recursive +- ${{ if ne(parameters.use1ESTemplate, true) }}: + - checkout: ${{ parameters.repositoryAlias }} + ${{ if ne(parameters.commit, '') }}: + ref: ${{ parameters.commit }} clean: true submodules: recursive -- template: /build-tools/automation/yaml-templates/setup-jdk-variables.yaml +- template: /build-tools/automation/yaml-templates/setup-test-environment-steps.yaml parameters: + configuration: ${{ parameters.configuration }} + xaSourcePath: ${{ parameters.xaSourcePath }} jdkMajorVersion: ${{ parameters.jdkMajorVersion }} useAgentJdkPath: ${{ parameters.useAgentJdkPath }} - -# Install latest .NET -- template: /build-tools/automation/yaml-templates/use-dot-net.yaml - parameters: - version: ${{ parameters.dotnetVersion }} - quality: ${{ parameters.dotnetQuality }} remove_dotnet: ${{ parameters.remove_dotnet }} - -- task: DotNetCoreCLI@2 - displayName: shut down existing build daemons - inputs: - command: custom - custom: build-server - arguments: shutdown - -- ${{ if eq(parameters.updateMono, true) }}: - - template: /build-tools/automation/yaml-templates/run-xaprepare.yaml - parameters: - displayName: run xaprepare-UpdateMono - arguments: --s=UpdateMono --auto-provision=yes --auto-provision-uses-sudo=yes - condition: and(succeeded(), eq(variables['agent.os'], 'Darwin')) - xaSourcePath: ${{ parameters.xaSourcePath }} - -- template: /build-tools/automation/yaml-templates/run-xaprepare.yaml - parameters: - arguments: --s=${{ parameters.xaprepareScenario }} --android-sdk-platforms="${{ parameters.androidSdkPlatforms }}" - xaSourcePath: ${{ parameters.xaSourcePath }} - -- task: DotNetCoreCLI@2 - displayName: build Xamarin.Android.Tools.BootstrapTasks.csproj - inputs: - 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 }}/nuget-unsigned - -- task: DownloadPipelineArtifact@2 - inputs: - artifactName: $(LinuxNuGetArtifactName) - downloadPath: ${{ parameters.xaSourcePath }}/bin/Build${{ parameters.configuration }}/nuget-unsigned - condition: and(succeeded(), eq(variables['agent.os'], 'Linux')) - -- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml - parameters: - displayName: extract workload packs - xaSourcePath: ${{ parameters.xaSourcePath }} - project: ${{ parameters.xaSourcePath }}/build-tools/create-packs/Microsoft.Android.Sdk.proj - arguments: -t:ExtractWorkloadPacks -c ${{ parameters.configuration }} -v:n -bl:${{ parameters.xaSourcePath }}/bin/Test${{ parameters.configuration }}/extract-workloads.binlog - -- ${{ if eq(parameters.installApkDiff, true) }}: - - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml - parameters: - toolName: apkdiff - version: $(ApkDiffToolVersion) - -- ${{ if eq(parameters.installTestSlicer, true) }}: - - template: /build-tools/automation/yaml-templates/install-dotnet-tool.yaml - parameters: - toolName: dotnet-test-slicer - version: $(TestSlicerToolVersion) + dotnetVersion: ${{ parameters.dotnetVersion }} + dotnetQuality: ${{ parameters.dotnetQuality }} + installTestSlicer: ${{ parameters.installTestSlicer }} + installApkDiff: ${{ parameters.installApkDiff }} + updateMono: ${{ parameters.updateMono }} + androidSdkPlatforms: ${{ parameters.androidSdkPlatforms }} + xaprepareScenario: ${{ parameters.xaprepareScenario }} + use1ESTemplate: ${{ parameters.use1ESTemplate }} diff --git a/build-tools/automation/yaml-templates/stage-linux-tests.yaml b/build-tools/automation/yaml-templates/stage-linux-tests.yaml index 92173aa7f37..cda09f6fd87 100644 --- a/build-tools/automation/yaml-templates/stage-linux-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-linux-tests.yaml @@ -1,5 +1,8 @@ # Runs smoke tests on Linux packages. +parameters: + use1ESTemplate: true + stages: - stage: linux_tests displayName: Linux Tests @@ -19,6 +22,8 @@ stages: clean: all steps: - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml + parameters: + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: @@ -77,7 +82,10 @@ stages: displayName: Test dotnet-local.sh inputs: scriptPath: dotnet-local.sh - args: build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj + args: >- + build samples/HelloWorld/HelloWorld/HelloWorld.DotNet.csproj + -p:AndroidSdkDirectory="$(HOME)/android-toolchain/sdk" + -bl:$(System.DefaultWorkingDirectory)/bin/Build$(XA.Build.Configuration)/build-helloworld.binlog - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: diff --git a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml index 957e3f239fb..30e22fa0718 100644 --- a/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-msbuild-emulator-tests.yaml @@ -43,6 +43,7 @@ stages: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} xaprepareScenario: EmulatorTestDependencies + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: @@ -110,6 +111,7 @@ stages: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} xaprepareScenario: EmulatorTestDependencies + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: @@ -173,6 +175,7 @@ stages: repositoryAlias: ${{ parameters.repositoryAlias }} commit: ${{ parameters.commit }} xaprepareScenario: EmulatorTestDependencies + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: diff --git a/build-tools/automation/yaml-templates/stage-package-tests.yaml b/build-tools/automation/yaml-templates/stage-package-tests.yaml index d101018c23a..869ac45cee1 100644 --- a/build-tools/automation/yaml-templates/stage-package-tests.yaml +++ b/build-tools/automation/yaml-templates/stage-package-tests.yaml @@ -2,6 +2,7 @@ parameters: macTestAgentsUseCleanImages: + use1ESTemplate: true stages: - stage: smoke_tests @@ -22,6 +23,7 @@ stages: - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml parameters: xaprepareScenario: EmulatorTestDependencies + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: @@ -98,11 +100,13 @@ stages: - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS 1 + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: artifactName: Test Results - APKs .NET Debug - macOS 1 configuration: Debug + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml @@ -119,6 +123,7 @@ stages: - template: /build-tools/automation/yaml-templates/setup-test-environment.yaml parameters: xaprepareScenario: EmulatorTestDependencies + use1ESTemplate: ${{ parameters.use1ESTemplate }} - task: DownloadPipelineArtifact@2 inputs: @@ -236,10 +241,12 @@ stages: - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: artifactName: Test Results - APKs .NET $(XA.Build.Configuration) - macOS 2 + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/upload-results.yaml parameters: artifactName: Test Results - APKs .NET Debug - macOS 2 configuration: Debug + use1ESTemplate: ${{ parameters.use1ESTemplate }} - template: /build-tools/automation/yaml-templates/fail-on-issue.yaml diff --git a/build-tools/automation/yaml-templates/variables.yaml b/build-tools/automation/yaml-templates/variables.yaml index 27bcf5d0ca5..e671ce2e3a1 100644 --- a/build-tools/automation/yaml-templates/variables.yaml +++ b/build-tools/automation/yaml-templates/variables.yaml @@ -63,7 +63,7 @@ variables: - name: IsRelOrTargetingRel value: $[or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['System.PullRequest.TargetBranch'], 'release/'))] - name: DefaultTestSdkPlatforms # Comma-separated SDK Platform(s) to install on test agents (no spaces) - value: 36,36.1 + value: 35,36,36.1 - name: DefaultJavaSdkMajorVersion value: 17 - name: LatestJavaSdkMajorVersion diff --git a/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs b/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs index 956744edb87..95beacebd5e 100644 --- a/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs +++ b/build-tools/xaprepare/xaprepare/Steps/Step_Android_SDK_NDK.cs @@ -175,11 +175,8 @@ bool GatherNDKInfo (Context context) return false; } - // Ignore NDK property setting if not installing the NDK - if (!DependencyTypeToInstall.HasFlag (AndroidToolchainComponentType.BuildDependency)) - return true; - else - return context.BuildInfo.GatherNDKInfo (context); + // Always install the NDK, as NativeAOT-based tests require it + return context.BuildInfo.GatherNDKInfo (context); } bool CopyRedistributableFiles (Context context) 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 9614fb88225..753f6d7a9fa 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 @@ -275,6 +275,10 @@ protected bool BuildInternal (string projectOrSolution, string target, string [] if (Directory.Exists (sdkPath)) { sw.WriteLine ("/p:AndroidSdkDirectory=\"{0}\"", sdkPath); } + string ndkPath = AndroidSdkResolver.GetAndroidNdkPath (); + if (Directory.Exists (ndkPath)) { + sw.WriteLine ("/p:AndroidNdkDirectory=\"{0}\"", ndkPath); + } string jdkPath = AndroidSdkResolver.GetJavaSdkPath (); if (Directory.Exists (jdkPath)) { sw.WriteLine ("/p:JavaSdkDirectory=\"{0}\"", jdkPath); diff --git a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs index 9d38ac66cf5..ffb06837a2d 100644 --- a/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs +++ b/src/Xamarin.Android.Build.Tasks/Tests/Xamarin.ProjectTools/Common/DotNetCLI.cs @@ -13,6 +13,7 @@ public class DotNetCLI public string ProcessLogFile { get; set; } public string Verbosity { get; set; } = "normal"; public string AndroidSdkPath { get; set; } = AndroidSdkResolver.GetAndroidSdkPath (); + public string AndroidNdkPath { get; set; } = AndroidSdkResolver.GetAndroidNdkPath (); public string JavaSdkPath { get; set; } = AndroidSdkResolver.GetJavaSdkPath (); public string ProjectDirectory { get; set; } @@ -156,6 +157,9 @@ List GetDefaultCommandLineArgs (string verb, string target = null, strin if (Directory.Exists (AndroidSdkPath)) { arguments.Add ($"/p:AndroidSdkDirectory=\"{AndroidSdkPath.TrimEnd('\\')}\""); } + if (Directory.Exists (AndroidNdkPath)) { + arguments.Add ($"/p:AndroidNdkDirectory=\"{AndroidNdkPath.TrimEnd('\\')}\""); + } if (Directory.Exists (JavaSdkPath)) { arguments.Add ($"/p:JavaSdkDirectory=\"{JavaSdkPath.TrimEnd ('\\')}\""); }