diff --git a/build-tools/automation/azure-pipelines-nightly.yaml b/build-tools/automation/azure-pipelines-nightly.yaml index 9eed588b0a4..accfeb81df6 100644 --- a/build-tools/automation/azure-pipelines-nightly.yaml +++ b/build-tools/automation/azure-pipelines-nightly.yaml @@ -11,7 +11,7 @@ pr: # External sources, scripts, tests, and yaml template files. resources: repositories: - - repository: yaml + - repository: yaml-templates type: github name: xamarin/yaml-templates ref: refs/heads/main diff --git a/build-tools/automation/azure-pipelines.yaml b/build-tools/automation/azure-pipelines.yaml index 4d85c43825c..cd472b7c49f 100644 --- a/build-tools/automation/azure-pipelines.yaml +++ b/build-tools/automation/azure-pipelines.yaml @@ -11,7 +11,7 @@ trigger: # External sources, scripts, tests, and yaml template files. resources: repositories: - - repository: yaml + - repository: yaml-templates type: github name: xamarin/yaml-templates ref: refs/heads/main @@ -85,257 +85,15 @@ variables: # Stage and Job "display names" are shortened because they are combined to form the name of the corresponding GitHub check. stages: -- stage: mac_build - displayName: Mac - dependsOn: [] - jobs: - # Check - "Xamarin.Android (macOS > Build)" - - job: mac_build_create_installers - displayName: macOS > Build - pool: - name: $(MacBuildPoolName) - vmImage: $(MacBuildPoolImage) - ${{ if eq(variables['MacBuildPoolName'], 'VSEng-Xamarin-RedmondMac-Android-Untrusted') }}: - demands: macOS.Name -equals Monterey - timeoutInMinutes: 240 - cancelTimeoutInMinutes: 5 - workspace: - clean: all - steps: - - checkout: self - submodules: recursive - path: s/xamarin-android - - - template: yaml-templates/install-microbuild-tooling.yaml - parameters: - condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) - - - template: yaml-templates/commercial-build.yaml - parameters: - provisionatorChannel: ${{ parameters.provisionatorChannel }} - signClassicPkgContent: ${{ parameters.signClassicPkgContent }} - - - template: yaml-templates/remove-microbuild-tooling.yaml - parameters: - condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real')) - - - script: > - mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && - cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && - zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: zip Windows toolchain pdb files - - - task: PublishPipelineArtifact@1 - displayName: upload Windows toolchain pdb files - inputs: - artifactName: $(WindowsToolchainPdbArtifactName) - targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb - - - template: yaml-templates/upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - artifactName: Build Results - macOS - includeBuildResults: true - - - template: yaml-templates/run-xaprepare.yaml - parameters: - arguments: --s=DetermineApplicableTests - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: determine which test stages to run - name: TestConditions - condition: and(succeeded(), eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR')) - -# This stage ensures Windows specific build steps continue to work, and runs unit tests. -- stage: win_build_test - displayName: Windows - dependsOn: [] - jobs: - # Check - "Xamarin.Android (Windows > Build & Smoke Test)" - - job: win_build_test - displayName: Windows > Build & Smoke Test - pool: $(1ESWindowsPool) - timeoutInMinutes: 360 - cancelTimeoutInMinutes: 5 - steps: - - checkout: self - submodules: recursive - - - template: yaml-templates\kill-processes.yaml - - - template: yaml-templates\clean.yaml - - - script: | - echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_11_X64% - displayName: set JI_JAVA_HOME - - - template: yaml-templates\use-dot-net.yaml - parameters: - remove_dotnet: true - - # xabuild still depends on .NET Core 3 or earlier - - template: yaml-templates\use-dot-net.yaml - parameters: - version: 3.1.417 - - # Downgrade the XA .vsix installed into the instance of VS that we are building with so that we don't restore/build against a test version. - # The VS installer will attempt to resume any failed or partial installation before trying to downgrade Xamarin.Android. - # VSIXInstaller.exe will exit non-zero when the downgrade attempt is a no-op, so we will allow this step to fail silently. - - powershell: | - $vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" - & "$vsWhere" -all -prerelease -latest | Out-Default - $isLatestVSLaunchable = & "$vsWhere" -all -prerelease -latest -property isLaunchable - if ($isLatestVSLaunchable -eq 0) { - $vsPath = & "$vsWhere" -all -prerelease -latest -property installationPath - Write-Host "Attempting to repair VS instance:" $vsPath - $vsInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe" - & "$vsInstaller" resume --installPath $vsPath --quiet --norestart | Out-Default - Write-Host "vs_installer.exe resume attempt complete" - } - $vsixInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\VSIXInstaller.exe" - $ts = Get-Date -Format FileDateTimeUniversal - $log = "xavsixdowngrade-$ts.log" - $process = Start-Process -NoNewWindow -FilePath $vsixInstaller -ArgumentList "/downgrade:Xamarin.Android.Sdk /admin /quiet /logFile:$log" -Wait -PassThru -RedirectStandardError "err.txt" - Get-Content "err.txt" | Write-Host - Get-Content "${env:TEMP}\$log" | Write-Host - Write-Host "VSInstaller.exe exited with code:" $process.ExitCode - Remove-Item "${env:TEMP}\$log" - displayName: downgrade XA to stable - ignoreLASTEXITCODE: true - - - task: DotNetCoreCLI@2 - displayName: Prepare Solution - inputs: - projects: Xamarin.Android.sln - arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog' - - # Build, pack .nupkgs, and extract workload packs to dotnet preview test directory - - template: yaml-templates\run-dotnet-preview.yaml - parameters: - project: Xamarin.Android.sln - arguments: >- - -t:BuildDotNet,PackDotNet -c $(XA.Build.Configuration) -v:n - -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog - displayName: Build Solution - continueOnError: false - - - task: MSBuild@1 - displayName: msbuild create-vsix - inputs: - solution: build-tools\create-vsix\create-vsix.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-create-vsix.binlog - - - task: MSBuild@1 - displayName: msbuild xabuild - inputs: - solution: tools\xabuild\xabuild.csproj - configuration: $(XA.Build.Configuration) - msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-xabuild.binlog - - - task: CmdLine@1 - displayName: xabuild Xamarin.Android-Tests - inputs: - filename: bin\$(XA.Build.Configuration)\bin\xabuild.exe - arguments: Xamarin.Android-Tests.sln /restore /p:Configuration=$(XA.Build.Configuration) /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\dotnet-build-tests.binlog - - - template: yaml-templates\install-apkdiff.yaml - - - template: yaml-templates\run-nunit-tests.yaml - parameters: - testRunTitle: Smoke MSBuild Tests - Windows Build Tree - testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\net472\Xamarin.Android.Build.Tests.dll - testResultsFile: TestResult-SmokeMSBuildTests-WinBuildTree-$(XA.Build.Configuration).xml - nunitConsoleExtraArgs: --where "cat == SmokeTests" - - - template: yaml-templates\run-nunit-tests.yaml - parameters: - useDotNet: true - testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build - testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll - testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml - dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" - - - template: yaml-templates\upload-results.yaml - parameters: - artifactName: Build Results - Windows - includeBuildResults: true +- template: yaml-templates/build-macos.yaml + parameters: + provisionatorChannel: ${{ parameters.provisionatorChannel }} + signClassicPkgContent: ${{ parameters.signClassicPkgContent }} - - template: yaml-templates\fail-on-issue.yaml +- template: yaml-templates/build-windows.yaml # Check - "Xamarin.Android (Linux > Build)" -- stage: linux_build - displayName: Linux - dependsOn: [] - jobs: - - job: linux_build_create_sdk_pack - displayName: Linux > Build - pool: android-devdiv-ubuntu-vmss - timeoutInMinutes: 180 - cancelTimeoutInMinutes: 2 - workspace: - clean: all - variables: - CXX: g++-10 - CC: gcc-10 - steps: - - checkout: self - clean: true - submodules: recursive - path: s/xamarin-android - - - checkout: monodroid - clean: true - submodules: recursive - path: s/xamarin-android/external/monodroid - persistCredentials: true - - - script: rm -rf external/monodroid/external/xamarin-android - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: delete external xamarin-android submodule - - - template: yaml-templates/setup-ubuntu.yaml - - - task: NuGetAuthenticate@0 - displayName: authenticate with azure artifacts - inputs: - forceReinstallCredentialProvider: true - - - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: make prepare-external-git-dependencies - - - script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: make jenkins - - - script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: make create-nupkgs - - - script: > - df -h && - mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/Microsoft.Android.Sdk.Linux*.nupkg - $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && - ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/SignList.xml - $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android - displayName: copy linux sdk - - - task: PublishPipelineArtifact@1 - displayName: upload linux sdk - inputs: - artifactName: $(LinuxNuGetArtifactName) - targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux - - - template: yaml-templates/upload-results.yaml - parameters: - xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android - artifactName: Build Results - Linux - includeBuildResults: true - - - template: yaml-templates/fail-on-issue.yaml +- template: yaml-templates/build-linux.yaml - stage: smoke_tests displayName: Smoke Tests @@ -1242,11 +1000,11 @@ stages: jdkTestFolder: $(JAVA_HOME_8_X64) provisionatorChannel: ${{ parameters.provisionatorChannel }} - - template: designer/android-designer-build-mac.yaml@yaml + - template: designer/android-designer-build-mac.yaml@yaml-templates parameters: designerSourcePath: $(System.DefaultWorkingDirectory)/UITools/src - - template: designer/android-designer-tests.yaml@yaml + - template: designer/android-designer-tests.yaml@yaml-templates parameters: designerSourcePath: $(System.DefaultWorkingDirectory)/UITools/src runAddinTests: false @@ -1424,7 +1182,7 @@ stages: condition: and(eq(dependencies.mac_build.result, 'Succeeded'), eq(dependencies.linux_build.result, 'Succeeded'), eq(variables['MicroBuildSignType'], 'Real')) jobs: # Check - "Xamarin.Android (Prepare .NET Release Sign Archives)" - - template: sign-artifacts/jobs/v2.yml@yaml + - template: sign-artifacts/jobs/v2.yml@yaml-templates parameters: name: sign_net_mac_win poolName: $(VSEngMicroBuildPool) @@ -1434,7 +1192,7 @@ stages: usePipelineArtifactTasks: true # Check - "Xamarin.Android (Prepare .NET Release Sign Linux Archive)" - - template: sign-artifacts/jobs/v2.yml@yaml + - template: sign-artifacts/jobs/v2.yml@yaml-templates parameters: name: sign_net_linux displayName: Sign Linux Archive @@ -1445,9 +1203,9 @@ stages: usePipelineArtifactTasks: true # Check - "Xamarin.Android (Prepare .NET Release Convert NuGet to MSI)" - - template: nuget-msi-convert/job/v3.yml@yaml + - template: nuget-msi-convert/job/v3.yml@yaml-templates parameters: - yamlResourceName: yaml + yamlResourceName: yaml-templates dependsOn: sign_net_mac_win artifactName: nuget-signed artifactPatterns: | @@ -1522,7 +1280,7 @@ stages: blobName: $(NupkgCommitStatusName) packagePrefix: xamarin-android artifactsPath: $(Build.StagingDirectory)\nuget-signed - yamlResourceName: yaml + yamlResourceName: yaml-templates - template: templates\common\upload-vs-insertion-artifacts.yml@sdk-insertions parameters: @@ -1531,7 +1289,7 @@ stages: blobName: $(VSDropCommitStatusName) packagePrefix: xamarin-android artifactsPath: $(Build.StagingDirectory)\$(VSDropCommitStatusName) - yamlResourceName: yaml + yamlResourceName: yaml-templates downloadSteps: - task: DownloadPipelineArtifact@2 inputs: @@ -1545,7 +1303,7 @@ stages: blobName: $(MultiTargetVSDropCommitStatusName) packagePrefix: xamarin-android artifactsPath: $(Build.StagingDirectory)\$(MultiTargetVSDropCommitStatusName) - yamlResourceName: yaml + yamlResourceName: yaml-templates downloadSteps: - task: DownloadPipelineArtifact@2 inputs: @@ -1580,7 +1338,7 @@ stages: # .NET 6 VS Insertion Stage # Check - "Xamarin.Android (VS Insertion - Wait For Approval)" # Check - "Xamarin.Android (VS Insertion - Create VS Drop and Open PR)" -- template: vs-insertion/stage/v1.yml@yaml +- template: vs-insertion/stage/v1.yml@yaml-templates parameters: dependsOn: dotnet_prepare_release symbolArtifactName: nuget-signed @@ -1816,7 +1574,7 @@ stages: - script: xcrun stapler validate $(XA.Unsigned.Pkg) displayName: validate notarized pkg - - template: upload-to-storage.yml@yaml + - template: upload-to-storage.yml@yaml-templates parameters: BuildPackages: $(System.DefaultWorkingDirectory)/storage-artifacts AzureContainerName: $(Azure.Container.Name) @@ -1838,7 +1596,7 @@ stages: - finalize_installers condition: and(eq(variables['MicroBuildSignType'], 'Real'), eq(dependencies.dotnet_prepare_release.result, 'Succeeded'), eq(dependencies.finalize_installers.result, 'Succeeded')) jobs: - - template: compliance/sbom/job.v1.yml@yaml + - template: compliance/sbom/job.v1.yml@yaml-templates parameters: artifactNames: [ nuget-signed, nuget-linux-signed, vs-msi-nugets, vsdrop-signed ] statusContexts: [ 'vsts-devdiv artifacts' ] @@ -1861,11 +1619,11 @@ stages: - checkout: self submodules: recursive - - template: security\credscan\v2.yml@yaml + - template: security\credscan\v2.yml@yaml-templates parameters: suppressionsFile: $(System.DefaultWorkingDirectory)\build-tools\automation\CredScanSuppressions.json - - template: security\policheck\v1.yml@yaml + - template: security\policheck\v1.yml@yaml-templates parameters: exclusionFile: $(System.DefaultWorkingDirectory)\build-tools\automation\PoliCheckExclusions.xml pE: 1|2|3|4 diff --git a/build-tools/automation/yaml-templates/build-linux.yaml b/build-tools/automation/yaml-templates/build-linux.yaml new file mode 100644 index 00000000000..9da25139e91 --- /dev/null +++ b/build-tools/automation/yaml-templates/build-linux.yaml @@ -0,0 +1,91 @@ +parameters: + buildPool: android-devdiv-ubuntu-vmss + buildResultArtifactName: Build Results - Linux + checkoutCommit: '' + checkoutPath: 's/xamarin-android' + checkoutPersistCredentials: false + dependsOn: '' + dependsOnResult: '' + jobName: linux_build_create_sdk_pack + jobDisplayName: Linux > Build + nugetArtifactName: $(LinuxNuGetArtifactName) + repositoryAlias: self + stageName: linux_build + stageDisplayName: Linux + +stages: +- stage: ${{ parameters.stageName }} + displayName: ${{ parameters.stageDisplayName }} + dependsOn: ${{ parameters.dependsOn }} + ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}: + condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}') + jobs: + - job: ${{ parameters.jobName }} + displayName: ${{ parameters.jobDisplayName }} + pool: ${{ parameters.buildPool }} + timeoutInMinutes: 180 + workspace: + clean: all + variables: + CXX: g++-10 + CC: gcc-10 + steps: + - template: sdk-unified/steps/checkout/v1.yml@yaml-templates + parameters: + resource: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.checkoutCommit }} + path: ${{ parameters.checkoutPath }} + persistCredentials: ${{ parameters.checkoutPersistCredentials }} + + - checkout: monodroid + clean: true + submodules: recursive + path: s/xamarin-android/external/monodroid + persistCredentials: true + + - script: rm -rf external/monodroid/external/xamarin-android + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: delete external xamarin-android submodule + + - template: setup-ubuntu.yaml + + - task: NuGetAuthenticate@0 + displayName: authenticate with azure artifacts + inputs: + forceReinstallCredentialProvider: true + + - script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make prepare-external-git-dependencies + + - script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make jenkins + + - script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration) + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: make create-nupkgs + + - script: > + df -h && + mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && + ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/Microsoft.Android.Sdk.Linux*.nupkg + $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux && + ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/SignList.xml + $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: copy linux sdk + + - task: PublishPipelineArtifact@1 + displayName: upload linux sdk + inputs: + artifactName: ${{ parameters.nugetArtifactName }} + targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux + + - template: upload-results.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + artifactName: ${{ parameters.buildResultArtifactName }} + includeBuildResults: true + + - template: fail-on-issue.yaml diff --git a/build-tools/automation/yaml-templates/build-macos.yaml b/build-tools/automation/yaml-templates/build-macos.yaml new file mode 100644 index 00000000000..fa0a3b60db2 --- /dev/null +++ b/build-tools/automation/yaml-templates/build-macos.yaml @@ -0,0 +1,90 @@ +parameters: + buildPoolName: $(MacBuildPoolName) + buildPoolImage: $(MacBuildPoolImage) + buildResultArtifactName: Build Results - macOS + checkoutCommit: '' + checkoutPath: 's/xamarin-android' + checkoutPersistCredentials: false + dependsOn: '' + dependsOnResult: '' + installerArtifactName: $(InstallerArtifactName) + jobName: mac_build_create_installers + jobDisplayName: macOS > Build + nugetArtifactName: $(NuGetArtifactName) + provisionatorChannel: latest + repositoryAlias: self + signClassicPkgContent: false + stageName: mac_build + stageDisplayName: Mac + testAssembliesArtifactName: $(TestAssembliesArtifactName) + windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName) + +stages: +- stage: ${{ parameters.stageName }} + displayName: ${{ parameters.stageDisplayName }} + dependsOn: ${{ parameters.dependsOn }} + ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}: + condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}') + jobs: + # Check - "Xamarin.Android (macOS > Build)" + - job: ${{ parameters.jobName }} + displayName: ${{ parameters.jobDisplayName }} + pool: + name: ${{ parameters.buildPoolName }} + vmImage: ${{ parameters.buildPoolImage }} + ${{ if or(and(ne(variables['Build.DefinitionName'],'Xamarin.Android'), ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), eq(variables['Build.Reason'], 'PullRequest')) }}: + demands: macOS.Name -equals Monterey + timeoutInMinutes: 240 + cancelTimeoutInMinutes: 5 + workspace: + clean: all + steps: + - template: sdk-unified/steps/checkout/v1.yml@yaml-templates + parameters: + resource: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.checkoutCommit }} + path: ${{ parameters.checkoutPath }} + persistCredentials: ${{ parameters.checkoutPersistCredentials }} + + - template: install-microbuild-tooling.yaml + parameters: + condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real')) + + - template: commercial-build.yaml + parameters: + installerArtifactName: ${{ parameters.installerArtifactName }} + nugetArtifactName: ${{ parameters.nugetArtifactName }} + provisionatorChannel: ${{ parameters.provisionatorChannel }} + signClassicPkgContent: ${{ parameters.signClassicPkgContent }} + testAssembliesArtifactName: ${{ parameters.testAssembliesArtifactName }} + + - template: remove-microbuild-tooling.yaml + parameters: + condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real')) + + - script: > + mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb && + cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb && + zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip . + workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: zip Windows toolchain pdb files + + - task: PublishPipelineArtifact@1 + displayName: upload Windows toolchain pdb files + inputs: + artifactName: ${{ parameters.windowsToolchainPdbArtifactName }} + targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb + + - template: upload-results.yaml + parameters: + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + artifactName: ${{ parameters.buildResultArtifactName }} + includeBuildResults: true + + - template: run-xaprepare.yaml + parameters: + arguments: --s=DetermineApplicableTests + xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android + displayName: determine which test stages to run + name: TestConditions + condition: and(succeeded(), eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR')) diff --git a/build-tools/automation/yaml-templates/build-windows.yaml b/build-tools/automation/yaml-templates/build-windows.yaml new file mode 100644 index 00000000000..1c40d8860e8 --- /dev/null +++ b/build-tools/automation/yaml-templates/build-windows.yaml @@ -0,0 +1,136 @@ +parameters: + buildPool: $(1ESWindowsPool) + buildResultArtifactName: Build Results - Windows + checkoutCommit: '' + checkoutPath: '' + checkoutPersistCredentials: false + dependsOn: '' + dependsOnResult: '' + jobName: win_build_test + jobDisplayName: Windows > Build & Smoke Test + repositoryAlias: self + stageName: win_build_test + stageDisplayName: Windows + +# This stage ensures Windows specific build steps continue to work, and runs unit tests. +stages: +- stage: ${{ parameters.stageName }} + displayName: ${{ parameters.stageDisplayName }} + dependsOn: ${{ parameters.dependsOn }} + ${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}: + condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}') + jobs: + # Check - "Xamarin.Android (Windows > Build & Smoke Test)" + - job: ${{ parameters.jobName }} + displayName: ${{ parameters.jobDisplayName }} + pool: ${{ parameters.buildPool }} + timeoutInMinutes: 360 + steps: + - template: sdk-unified/steps/checkout/v1.yml@yaml-templates + parameters: + resource: ${{ parameters.repositoryAlias }} + commit: ${{ parameters.checkoutCommit }} + path: ${{ parameters.checkoutPath }} + persistCredentials: ${{ parameters.checkoutPersistCredentials }} + + - template: kill-processes.yaml + + - template: clean.yaml + + - script: | + echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_11_X64% + displayName: set JI_JAVA_HOME + + - template: use-dot-net.yaml + parameters: + remove_dotnet: true + + # xabuild still depends on .NET Core 3 or earlier + - template: use-dot-net.yaml + parameters: + version: 3.1.417 + + # Downgrade the XA .vsix installed into the instance of VS that we are building with so that we don't restore/build against a test version. + # The VS installer will attempt to resume any failed or partial installation before trying to downgrade Xamarin.Android. + # VSIXInstaller.exe will exit non-zero when the downgrade attempt is a no-op, so we will allow this step to fail silently. + - powershell: | + $vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" + & "$vsWhere" -all -prerelease -latest | Out-Default + $isLatestVSLaunchable = & "$vsWhere" -all -prerelease -latest -property isLaunchable + if ($isLatestVSLaunchable -eq 0) { + $vsPath = & "$vsWhere" -all -prerelease -latest -property installationPath + Write-Host "Attempting to repair VS instance:" $vsPath + $vsInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe" + & "$vsInstaller" resume --installPath $vsPath --quiet --norestart | Out-Default + Write-Host "vs_installer.exe resume attempt complete" + } + $vsixInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\VSIXInstaller.exe" + $ts = Get-Date -Format FileDateTimeUniversal + $log = "xavsixdowngrade-$ts.log" + $process = Start-Process -NoNewWindow -FilePath $vsixInstaller -ArgumentList "/downgrade:Xamarin.Android.Sdk /admin /quiet /logFile:$log" -Wait -PassThru -RedirectStandardError "err.txt" + Get-Content "err.txt" | Write-Host + Get-Content "${env:TEMP}\$log" | Write-Host + Write-Host "VSInstaller.exe exited with code:" $process.ExitCode + Remove-Item "${env:TEMP}\$log" + displayName: downgrade XA to stable + ignoreLASTEXITCODE: true + + - task: DotNetCoreCLI@2 + displayName: Prepare Solution + inputs: + projects: Xamarin.Android.sln + arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog' + + # Build, pack .nupkgs, and extract workload packs to dotnet preview test directory + - template: run-dotnet-preview.yaml + parameters: + project: Xamarin.Android.sln + arguments: >- + -t:BuildDotNet,PackDotNet -c $(XA.Build.Configuration) -v:n + -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog + displayName: Build Solution + continueOnError: false + + - task: MSBuild@1 + displayName: msbuild create-vsix + inputs: + solution: build-tools\create-vsix\create-vsix.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-create-vsix.binlog + + - task: MSBuild@1 + displayName: msbuild xabuild + inputs: + solution: tools\xabuild\xabuild.csproj + configuration: $(XA.Build.Configuration) + msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-xabuild.binlog + + - task: CmdLine@1 + displayName: xabuild Xamarin.Android-Tests + inputs: + filename: bin\$(XA.Build.Configuration)\bin\xabuild.exe + arguments: Xamarin.Android-Tests.sln /restore /p:Configuration=$(XA.Build.Configuration) /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\dotnet-build-tests.binlog + + - template: install-apkdiff.yaml + + - template: run-nunit-tests.yaml + parameters: + testRunTitle: Smoke MSBuild Tests - Windows Build Tree + testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\net472\Xamarin.Android.Build.Tests.dll + testResultsFile: TestResult-SmokeMSBuildTests-WinBuildTree-$(XA.Build.Configuration).xml + nunitConsoleExtraArgs: --where "cat == SmokeTests" + + - template: run-nunit-tests.yaml + parameters: + useDotNet: true + testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build + testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll + testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml + dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)" + + - template: upload-results.yaml + parameters: + artifactName: ${{ parameters.buildResultArtifactName }} + includeBuildResults: true + + - template: fail-on-issue.yaml diff --git a/build-tools/automation/yaml-templates/commercial-build.yaml b/build-tools/automation/yaml-templates/commercial-build.yaml index d886be39e67..7760518487c 100644 --- a/build-tools/automation/yaml-templates/commercial-build.yaml +++ b/build-tools/automation/yaml-templates/commercial-build.yaml @@ -1,8 +1,11 @@ parameters: + installerArtifactName: $(InstallerArtifactName) xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android makeMSBuildArgs: '' + nugetArtifactName: $(NuGetArtifactName) provisionatorChannel: latest signClassicPkgContent: true + testAssembliesArtifactName: $(TestAssembliesArtifactName) steps: - script: echo "##vso[task.setvariable variable=JI_JAVA_HOME]$HOME/android-toolchain/jdk-11" @@ -118,7 +121,7 @@ steps: - task: PublishPipelineArtifact@1 displayName: upload nupkgs inputs: - artifactName: $(NuGetArtifactName) + artifactName: ${{ parameters.nugetArtifactName }} targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName) - script: > @@ -137,7 +140,7 @@ steps: - task: PublishPipelineArtifact@1 displayName: upload installers inputs: - artifactName: $(InstallerArtifactName) + artifactName: ${{ parameters.installerArtifactName }} targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/$(InstallerArtifactName) # Upload test assemblies @@ -150,11 +153,11 @@ steps: - task: PublishPipelineArtifact@1 displayName: upload test assemblies inputs: - artifactName: $(TestAssembliesArtifactName) + artifactName: ${{ parameters.testAssembliesArtifactName }} targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration) - task: PublishPipelineArtifact@1 displayName: upload build tools inventory inputs: - artifactName: BuildToolsInventory + artifactName: AndroidBuildToolsInventory targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv diff --git a/build-tools/automation/yaml-templates/install-microbuild-tooling.yaml b/build-tools/automation/yaml-templates/install-microbuild-tooling.yaml index 15536ad9484..5da2b01a0d9 100644 --- a/build-tools/automation/yaml-templates/install-microbuild-tooling.yaml +++ b/build-tools/automation/yaml-templates/install-microbuild-tooling.yaml @@ -10,7 +10,7 @@ steps: condition: ${{ parameters.condition }} # ESRP signing requires minimum azure client version 2.8.0 -- template: azure-tools/az-client-update.yml@yaml +- template: azure-tools/az-client-update.yml@yaml-templates parameters: version: '2.8.0' condition: and(${{ parameters.condition }}, eq(variables['agent.os'], 'Darwin')) diff --git a/build-tools/automation/yaml-templates/update-vs.yaml b/build-tools/automation/yaml-templates/update-vs.yaml index c1b07eaba66..22154203e59 100644 --- a/build-tools/automation/yaml-templates/update-vs.yaml +++ b/build-tools/automation/yaml-templates/update-vs.yaml @@ -12,6 +12,6 @@ steps: provisioning_extra_args: -vv condition: ${{ parameters.condition }} -- template: environment/win/vs-msbuild.v1.yml@yaml # Display (in log) VS installation(s) including installation status with associated MSBuild location(s) +- template: environment/win/vs-msbuild.v1.yml@yaml-templates # Display (in log) VS installation(s) including installation status with associated MSBuild location(s) parameters: condition: ${{ parameters.condition }}