Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ci] Move build stages into yaml templates #7553

Merged
merged 8 commits into from
Jan 19, 2023
255 changes: 6 additions & 249 deletions build-tools/automation/azure-pipelines.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,258 +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
quality: GA

# 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
Expand Down
91 changes: 91 additions & 0 deletions build-tools/automation/yaml-templates/build-linux.yaml
Original file line number Diff line number Diff line change
@@ -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
Loading