Skip to content

Commit 4e09bf4

Browse files
[ci] Move build stages into yaml templates (#7553) (#7720)
Context: xamarin/sdk-insertions#42 Context: https://devdiv.visualstudio.com/DevDiv/_build?definitionId=17671&_a=summary As part of efforts to create an integration and release pipeline for all of MAUI we will want to "templatize" more of our YAML. Our three build stages have been moved into new templates that can be referenced by the MAUI "mega pipeline". In an attempt to unify the build for all the SDKs we need to rename all the resources to use the same names. Co-authored-by: Manuel de la Pena <mandel@microsoft.com>
1 parent 402a7f1 commit 4e09bf4

File tree

8 files changed

+348
-270
lines changed

8 files changed

+348
-270
lines changed

build-tools/automation/azure-pipelines-nightly.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pr:
1111
# External sources, scripts, tests, and yaml template files.
1212
resources:
1313
repositories:
14-
- repository: yaml
14+
- repository: yaml-templates
1515
type: github
1616
name: xamarin/yaml-templates
1717
ref: refs/heads/main

build-tools/automation/azure-pipelines.yaml

Lines changed: 21 additions & 263 deletions
Large diffs are not rendered by default.
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
parameters:
2+
buildPool: android-devdiv-ubuntu-vmss
3+
buildResultArtifactName: Build Results - Linux
4+
checkoutCommit: ''
5+
checkoutPath: 's/xamarin-android'
6+
checkoutPersistCredentials: false
7+
dependsOn: ''
8+
dependsOnResult: ''
9+
jobName: linux_build_create_sdk_pack
10+
jobDisplayName: Linux > Build
11+
nugetArtifactName: $(LinuxNuGetArtifactName)
12+
repositoryAlias: self
13+
stageName: linux_build
14+
stageDisplayName: Linux
15+
16+
stages:
17+
- stage: ${{ parameters.stageName }}
18+
displayName: ${{ parameters.stageDisplayName }}
19+
dependsOn: ${{ parameters.dependsOn }}
20+
${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}:
21+
condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}')
22+
jobs:
23+
- job: ${{ parameters.jobName }}
24+
displayName: ${{ parameters.jobDisplayName }}
25+
pool: ${{ parameters.buildPool }}
26+
timeoutInMinutes: 180
27+
workspace:
28+
clean: all
29+
variables:
30+
CXX: g++-10
31+
CC: gcc-10
32+
steps:
33+
- template: sdk-unified/steps/checkout/v1.yml@yaml-templates
34+
parameters:
35+
resource: ${{ parameters.repositoryAlias }}
36+
commit: ${{ parameters.checkoutCommit }}
37+
path: ${{ parameters.checkoutPath }}
38+
persistCredentials: ${{ parameters.checkoutPersistCredentials }}
39+
40+
- checkout: monodroid
41+
clean: true
42+
submodules: recursive
43+
path: s/xamarin-android/external/monodroid
44+
persistCredentials: true
45+
46+
- script: rm -rf external/monodroid/external/xamarin-android
47+
workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
48+
displayName: delete external xamarin-android submodule
49+
50+
- template: setup-ubuntu.yaml
51+
52+
- task: NuGetAuthenticate@0
53+
displayName: authenticate with azure artifacts
54+
inputs:
55+
forceReinstallCredentialProvider: true
56+
57+
- script: make prepare-external-git-dependencies PREPARE_CI=1 CONFIGURATION=$(XA.Build.Configuration)
58+
workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
59+
displayName: make prepare-external-git-dependencies
60+
61+
- script: make jenkins PREPARE_CI=1 PREPARE_AUTOPROVISION=1 CONFIGURATION=$(XA.Build.Configuration)
62+
workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
63+
displayName: make jenkins
64+
65+
- script: make create-nupkgs CONFIGURATION=$(XA.Build.Configuration)
66+
workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
67+
displayName: make create-nupkgs
68+
69+
- script: >
70+
df -h &&
71+
mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux &&
72+
ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/Microsoft.Android.Sdk.Linux*.nupkg
73+
$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux &&
74+
ln $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)/SignList.xml
75+
$(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux
76+
workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
77+
displayName: copy linux sdk
78+
79+
- task: PublishPipelineArtifact@1
80+
displayName: upload linux sdk
81+
inputs:
82+
artifactName: ${{ parameters.nugetArtifactName }}
83+
targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/nuget-linux
84+
85+
- template: upload-results.yaml
86+
parameters:
87+
xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
88+
artifactName: ${{ parameters.buildResultArtifactName }}
89+
includeBuildResults: true
90+
91+
- template: fail-on-issue.yaml
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
parameters:
2+
buildPoolName: $(MacBuildPoolName)
3+
buildPoolImage: $(MacBuildPoolImage)
4+
buildResultArtifactName: Build Results - macOS
5+
checkoutCommit: ''
6+
checkoutPath: 's/xamarin-android'
7+
checkoutPersistCredentials: false
8+
dependsOn: ''
9+
dependsOnResult: ''
10+
installerArtifactName: $(InstallerArtifactName)
11+
jobName: mac_build_create_installers
12+
jobDisplayName: macOS > Build
13+
nugetArtifactName: $(NuGetArtifactName)
14+
provisionatorChannel: latest
15+
repositoryAlias: self
16+
signClassicPkgContent: false
17+
stageName: mac_build
18+
stageDisplayName: Mac
19+
testAssembliesArtifactName: $(TestAssembliesArtifactName)
20+
windowsToolchainPdbArtifactName: $(WindowsToolchainPdbArtifactName)
21+
22+
stages:
23+
- stage: ${{ parameters.stageName }}
24+
displayName: ${{ parameters.stageDisplayName }}
25+
dependsOn: ${{ parameters.dependsOn }}
26+
${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}:
27+
condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}')
28+
jobs:
29+
# Check - "Xamarin.Android (macOS > Build)"
30+
- job: ${{ parameters.jobName }}
31+
displayName: ${{ parameters.jobDisplayName }}
32+
pool:
33+
name: ${{ parameters.buildPoolName }}
34+
vmImage: ${{ parameters.buildPoolImage }}
35+
${{ if or(and(ne(variables['Build.DefinitionName'],'Xamarin.Android'), ne(variables['Build.DefinitionName'], 'Xamarin.Android-Private')), eq(variables['Build.Reason'], 'PullRequest')) }}:
36+
demands: macOS.Name -equals Monterey
37+
timeoutInMinutes: 240
38+
cancelTimeoutInMinutes: 5
39+
workspace:
40+
clean: all
41+
steps:
42+
- template: sdk-unified/steps/checkout/v1.yml@yaml-templates
43+
parameters:
44+
resource: ${{ parameters.repositoryAlias }}
45+
commit: ${{ parameters.checkoutCommit }}
46+
path: ${{ parameters.checkoutPath }}
47+
persistCredentials: ${{ parameters.checkoutPersistCredentials }}
48+
49+
- template: install-microbuild-tooling.yaml
50+
parameters:
51+
condition: and(succeeded(), eq(variables['MicroBuildSignType'], 'Real'))
52+
53+
- template: commercial-build.yaml
54+
parameters:
55+
installerArtifactName: ${{ parameters.installerArtifactName }}
56+
nugetArtifactName: ${{ parameters.nugetArtifactName }}
57+
provisionatorChannel: ${{ parameters.provisionatorChannel }}
58+
signClassicPkgContent: ${{ parameters.signClassicPkgContent }}
59+
testAssembliesArtifactName: ${{ parameters.testAssembliesArtifactName }}
60+
61+
- template: remove-microbuild-tooling.yaml
62+
parameters:
63+
condition: and(succeededOrFailed(), eq(variables['MicroBuildSignType'], 'Real'))
64+
65+
- script: >
66+
mkdir -p $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb &&
67+
cd $(System.DefaultWorkingDirectory)/xamarin-android/bin/$(XA.Build.Configuration)/lib/packs/Microsoft.Android.Sdk.Darwin/*/tools/binutils/windows-toolchain-pdb &&
68+
zip -r $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb/windows-toolchain-pdb.zip .
69+
workingDirectory: $(System.DefaultWorkingDirectory)/xamarin-android
70+
displayName: zip Windows toolchain pdb files
71+
72+
- task: PublishPipelineArtifact@1
73+
displayName: upload Windows toolchain pdb files
74+
inputs:
75+
artifactName: ${{ parameters.windowsToolchainPdbArtifactName }}
76+
targetPath: $(System.DefaultWorkingDirectory)/xamarin-android/bin/Build$(XA.Build.Configuration)/windows-toolchain-pdb
77+
78+
- template: upload-results.yaml
79+
parameters:
80+
xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
81+
artifactName: ${{ parameters.buildResultArtifactName }}
82+
includeBuildResults: true
83+
84+
- template: run-xaprepare.yaml
85+
parameters:
86+
arguments: --s=DetermineApplicableTests
87+
xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
88+
displayName: determine which test stages to run
89+
name: TestConditions
90+
condition: and(succeeded(), eq(variables['Build.DefinitionName'], 'Xamarin.Android-PR'))
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
parameters:
2+
buildPool: $(1ESWindowsPool)
3+
buildResultArtifactName: Build Results - Windows
4+
checkoutCommit: ''
5+
checkoutPath: ''
6+
checkoutPersistCredentials: false
7+
dependsOn: ''
8+
dependsOnResult: ''
9+
jobName: win_build_test
10+
jobDisplayName: Windows > Build & Smoke Test
11+
repositoryAlias: self
12+
stageName: win_build_test
13+
stageDisplayName: Windows
14+
15+
# This stage ensures Windows specific build steps continue to work, and runs unit tests.
16+
stages:
17+
- stage: ${{ parameters.stageName }}
18+
displayName: ${{ parameters.stageDisplayName }}
19+
dependsOn: ${{ parameters.dependsOn }}
20+
${{ if and(ne(parameters.dependsOn, ''), ne(parameters.dependsOnResult, '')) }}:
21+
condition: eq(dependencies.${{ parameters.dependsOn }}.result, '${{ parameters.dependsOnResult }}')
22+
jobs:
23+
# Check - "Xamarin.Android (Windows > Build & Smoke Test)"
24+
- job: ${{ parameters.jobName }}
25+
displayName: ${{ parameters.jobDisplayName }}
26+
pool: ${{ parameters.buildPool }}
27+
timeoutInMinutes: 360
28+
steps:
29+
- template: sdk-unified/steps/checkout/v1.yml@yaml-templates
30+
parameters:
31+
resource: ${{ parameters.repositoryAlias }}
32+
commit: ${{ parameters.checkoutCommit }}
33+
path: ${{ parameters.checkoutPath }}
34+
persistCredentials: ${{ parameters.checkoutPersistCredentials }}
35+
36+
- template: kill-processes.yaml
37+
38+
- template: clean.yaml
39+
40+
- script: |
41+
echo ##vso[task.setvariable variable=JI_JAVA_HOME]%JAVA_HOME_11_X64%
42+
displayName: set JI_JAVA_HOME
43+
44+
- template: use-dot-net.yaml
45+
parameters:
46+
remove_dotnet: true
47+
48+
# xabuild still depends on .NET Core 3 or earlier
49+
- template: use-dot-net.yaml
50+
parameters:
51+
version: 3.1.417
52+
53+
# 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.
54+
# The VS installer will attempt to resume any failed or partial installation before trying to downgrade Xamarin.Android.
55+
# VSIXInstaller.exe will exit non-zero when the downgrade attempt is a no-op, so we will allow this step to fail silently.
56+
- powershell: |
57+
$vsWhere = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe"
58+
& "$vsWhere" -all -prerelease -latest | Out-Default
59+
$isLatestVSLaunchable = & "$vsWhere" -all -prerelease -latest -property isLaunchable
60+
if ($isLatestVSLaunchable -eq 0) {
61+
$vsPath = & "$vsWhere" -all -prerelease -latest -property installationPath
62+
Write-Host "Attempting to repair VS instance:" $vsPath
63+
$vsInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vs_installer.exe"
64+
& "$vsInstaller" resume --installPath $vsPath --quiet --norestart | Out-Default
65+
Write-Host "vs_installer.exe resume attempt complete"
66+
}
67+
$vsixInstaller = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\resources\app\ServiceHub\Services\Microsoft.VisualStudio.Setup.Service\VSIXInstaller.exe"
68+
$ts = Get-Date -Format FileDateTimeUniversal
69+
$log = "xavsixdowngrade-$ts.log"
70+
$process = Start-Process -NoNewWindow -FilePath $vsixInstaller -ArgumentList "/downgrade:Xamarin.Android.Sdk /admin /quiet /logFile:$log" -Wait -PassThru -RedirectStandardError "err.txt"
71+
Get-Content "err.txt" | Write-Host
72+
Get-Content "${env:TEMP}\$log" | Write-Host
73+
Write-Host "VSInstaller.exe exited with code:" $process.ExitCode
74+
Remove-Item "${env:TEMP}\$log"
75+
displayName: downgrade XA to stable
76+
ignoreLASTEXITCODE: true
77+
78+
- task: DotNetCoreCLI@2
79+
displayName: Prepare Solution
80+
inputs:
81+
projects: Xamarin.Android.sln
82+
arguments: '-c $(XA.Build.Configuration) -t:Prepare --no-restore -p:AutoProvision=true -bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build-prepare.binlog'
83+
84+
# Build, pack .nupkgs, and extract workload packs to dotnet preview test directory
85+
- template: run-dotnet-preview.yaml
86+
parameters:
87+
project: Xamarin.Android.sln
88+
arguments: >-
89+
-t:BuildDotNet,PackDotNet -c $(XA.Build.Configuration) -v:n
90+
-bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-build.binlog
91+
displayName: Build Solution
92+
continueOnError: false
93+
94+
- task: MSBuild@1
95+
displayName: msbuild create-vsix
96+
inputs:
97+
solution: build-tools\create-vsix\create-vsix.csproj
98+
configuration: $(XA.Build.Configuration)
99+
msbuildArguments: /p:CreateVsixContainer=True /p:ZipPackageCompressionLevel=Normal /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-create-vsix.binlog
100+
101+
- task: MSBuild@1
102+
displayName: msbuild xabuild
103+
inputs:
104+
solution: tools\xabuild\xabuild.csproj
105+
configuration: $(XA.Build.Configuration)
106+
msbuildArguments: /restore /bl:$(System.DefaultWorkingDirectory)\bin\Build$(XA.Build.Configuration)\dotnet-xabuild.binlog
107+
108+
- task: CmdLine@1
109+
displayName: xabuild Xamarin.Android-Tests
110+
inputs:
111+
filename: bin\$(XA.Build.Configuration)\bin\xabuild.exe
112+
arguments: Xamarin.Android-Tests.sln /restore /p:Configuration=$(XA.Build.Configuration) /bl:$(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\dotnet-build-tests.binlog
113+
114+
- template: install-apkdiff.yaml
115+
116+
- template: run-nunit-tests.yaml
117+
parameters:
118+
testRunTitle: Smoke MSBuild Tests - Windows Build Tree
119+
testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\net472\Xamarin.Android.Build.Tests.dll
120+
testResultsFile: TestResult-SmokeMSBuildTests-WinBuildTree-$(XA.Build.Configuration).xml
121+
nunitConsoleExtraArgs: --where "cat == SmokeTests"
122+
123+
- template: run-nunit-tests.yaml
124+
parameters:
125+
useDotNet: true
126+
testRunTitle: Smoke MSBuild Tests - Windows Dotnet Build
127+
testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll
128+
testResultsFile: TestResult-SmokeMSBuildTests-WinDotnetBuild-$(XA.Build.Configuration).xml
129+
dotNetTestExtraArgs: --filter "TestCategory = SmokeTests $(DotNetNUnitCategories)"
130+
131+
- template: upload-results.yaml
132+
parameters:
133+
artifactName: ${{ parameters.buildResultArtifactName }}
134+
includeBuildResults: true
135+
136+
- template: fail-on-issue.yaml

build-tools/automation/yaml-templates/commercial-build.yaml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
parameters:
2+
installerArtifactName: $(InstallerArtifactName)
23
xaSourcePath: $(System.DefaultWorkingDirectory)/xamarin-android
34
makeMSBuildArgs: ''
5+
nugetArtifactName: $(NuGetArtifactName)
46
provisionatorChannel: latest
57
signClassicPkgContent: true
8+
testAssembliesArtifactName: $(TestAssembliesArtifactName)
69

710
steps:
811
- script: echo "##vso[task.setvariable variable=JI_JAVA_HOME]$HOME/android-toolchain/jdk-11"
@@ -118,7 +121,7 @@ steps:
118121
- task: PublishPipelineArtifact@1
119122
displayName: upload nupkgs
120123
inputs:
121-
artifactName: $(NuGetArtifactName)
124+
artifactName: ${{ parameters.nugetArtifactName }}
122125
targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/$(NuGetArtifactName)
123126

124127
- script: >
@@ -137,7 +140,7 @@ steps:
137140
- task: PublishPipelineArtifact@1
138141
displayName: upload installers
139142
inputs:
140-
artifactName: $(InstallerArtifactName)
143+
artifactName: ${{ parameters.installerArtifactName }}
141144
targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/$(InstallerArtifactName)
142145

143146
# Upload test assemblies
@@ -150,11 +153,11 @@ steps:
150153
- task: PublishPipelineArtifact@1
151154
displayName: upload test assemblies
152155
inputs:
153-
artifactName: $(TestAssembliesArtifactName)
156+
artifactName: ${{ parameters.testAssembliesArtifactName }}
154157
targetPath: ${{ parameters.xaSourcePath }}/bin/Test$(XA.Build.Configuration)
155158

156159
- task: PublishPipelineArtifact@1
157160
displayName: upload build tools inventory
158161
inputs:
159-
artifactName: BuildToolsInventory
162+
artifactName: AndroidBuildToolsInventory
160163
targetPath: ${{ parameters.xaSourcePath }}/bin/Build$(XA.Build.Configuration)/buildtoolsinventory.csv

build-tools/automation/yaml-templates/install-microbuild-tooling.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ steps:
1010
condition: ${{ parameters.condition }}
1111

1212
# ESRP signing requires minimum azure client version 2.8.0
13-
- template: azure-tools/az-client-update.yml@yaml
13+
- template: azure-tools/az-client-update.yml@yaml-templates
1414
parameters:
1515
version: '2.8.0'
1616
condition: and(${{ parameters.condition }}, eq(variables['agent.os'], 'Darwin'))

build-tools/automation/yaml-templates/update-vs.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,6 @@ steps:
1212
provisioning_extra_args: -vv
1313
condition: ${{ parameters.condition }}
1414

15-
- template: environment/win/vs-msbuild.v1.yml@yaml # Display (in log) VS installation(s) including installation status with associated MSBuild location(s)
15+
- template: environment/win/vs-msbuild.v1.yml@yaml-templates # Display (in log) VS installation(s) including installation status with associated MSBuild location(s)
1616
parameters:
1717
condition: ${{ parameters.condition }}

0 commit comments

Comments
 (0)