msbuild
264 строки · 11.3 Кб
1# Internal resources (telemetry, microbuild) can only be accessed from non-public projects,
2# and some (Microbuild) should only be applied to non-PR cases for internal builds.
3
4parameters:
5# Job schema parameters - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job
6cancelTimeoutInMinutes: ''
7condition: ''
8container: ''
9continueOnError: false
10dependsOn: ''
11displayName: ''
12pool: ''
13steps: []
14strategy: ''
15timeoutInMinutes: ''
16variables: []
17workspace: ''
18templateContext: ''
19
20# Job base template specific parameters
21# See schema documentation - https://github.com/dotnet/arcade/blob/master/Documentation/AzureDevOps/TemplateSchema.md
22artifacts: ''
23enableMicrobuild: false
24enablePublishBuildArtifacts: false
25enablePublishBuildAssets: false
26enablePublishTestResults: false
27enablePublishUsingPipelines: false
28enableBuildRetry: false
29disableComponentGovernance: ''
30componentGovernanceIgnoreDirectories: ''
31mergeTestResults: false
32testRunTitle: ''
33testResultsFormat: ''
34name: ''
35preSteps: []
36runAsPublic: false
37# Sbom related params
38enableSbom: true
39PackageVersion: 7.0.0
40BuildDropPath: '$(Build.SourcesDirectory)/artifacts'
41
42jobs:
43- job: ${{ parameters.name }}
44
45${{ if ne(parameters.cancelTimeoutInMinutes, '') }}:
46cancelTimeoutInMinutes: ${{ parameters.cancelTimeoutInMinutes }}
47
48${{ if ne(parameters.condition, '') }}:
49condition: ${{ parameters.condition }}
50
51${{ if ne(parameters.container, '') }}:
52container: ${{ parameters.container }}
53
54${{ if ne(parameters.continueOnError, '') }}:
55continueOnError: ${{ parameters.continueOnError }}
56
57${{ if ne(parameters.dependsOn, '') }}:
58dependsOn: ${{ parameters.dependsOn }}
59
60${{ if ne(parameters.displayName, '') }}:
61displayName: ${{ parameters.displayName }}
62
63${{ if ne(parameters.pool, '') }}:
64pool: ${{ parameters.pool }}
65
66${{ if ne(parameters.strategy, '') }}:
67strategy: ${{ parameters.strategy }}
68
69${{ if ne(parameters.timeoutInMinutes, '') }}:
70timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
71
72${{ if ne(parameters.templateContext, '') }}:
73templateContext: ${{ parameters.templateContext }}
74
75variables:
76- ${{ if ne(parameters.enableTelemetry, 'false') }}:
77- name: DOTNET_CLI_TELEMETRY_PROFILE
78value: '$(Build.Repository.Uri)'
79- ${{ if eq(parameters.enableRichCodeNavigation, 'true') }}:
80- name: EnableRichCodeNavigation
81value: 'true'
82# Retry signature validation up to three times, waiting 2 seconds between attempts.
83# See https://learn.microsoft.com/en-us/nuget/reference/errors-and-warnings/nu3028#retry-untrusted-root-failures
84- name: NUGET_EXPERIMENTAL_CHAIN_BUILD_RETRY_POLICY
85value: 3,2000
86- ${{ each variable in parameters.variables }}:
87# handle name-value variable syntax
88# example:
89# - name: [key]
90# value: [value]
91- ${{ if ne(variable.name, '') }}:
92- name: ${{ variable.name }}
93value: ${{ variable.value }}
94
95# handle variable groups
96- ${{ if ne(variable.group, '') }}:
97- group: ${{ variable.group }}
98
99# handle template variable syntax
100# example:
101# - template: path/to/template.yml
102# parameters:
103# [key]: [value]
104- ${{ if ne(variable.template, '') }}:
105- template: ${{ variable.template }}
106${{ if ne(variable.parameters, '') }}:
107parameters: ${{ variable.parameters }}
108
109# handle key-value variable syntax.
110# example:
111# - [key]: [value]
112- ${{ if and(eq(variable.name, ''), eq(variable.group, ''), eq(variable.template, '')) }}:
113- ${{ each pair in variable }}:
114- name: ${{ pair.key }}
115value: ${{ pair.value }}
116
117# DotNet-HelixApi-Access provides 'HelixApiAccessToken' for internal builds
118- ${{ if and(eq(parameters.enableTelemetry, 'true'), eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
119- group: DotNet-HelixApi-Access
120
121${{ if ne(parameters.workspace, '') }}:
122workspace: ${{ parameters.workspace }}
123
124steps:
125- ${{ if ne(parameters.preSteps, '') }}:
126- ${{ each preStep in parameters.preSteps }}:
127- ${{ preStep }}
128
129- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
130- ${{ if eq(parameters.enableMicrobuild, 'true') }}:
131- task: MicroBuildSigningPlugin@4
132displayName: Install MicroBuild plugin
133inputs:
134signType: $(_SignType)
135zipSources: false
136feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
137env:
138TeamName: $(_TeamName)
139MicroBuildOutputFolderOverride: '$(Agent.TempDirectory)'
140continueOnError: ${{ parameters.continueOnError }}
141condition: and(succeeded(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
142
143- ${{ if and(eq(parameters.runAsPublic, 'false'), eq(variables['System.TeamProject'], 'internal')) }}:
144- task: NuGetAuthenticate@1
145
146- ${{ if and(ne(parameters.artifacts.download, 'false'), ne(parameters.artifacts.download, '')) }}:
147- task: DownloadPipelineArtifact@2
148inputs:
149buildType: current
150artifactName: ${{ coalesce(parameters.artifacts.download.name, 'Artifacts_$(Agent.OS)_$(_BuildConfig)') }}
151targetPath: ${{ coalesce(parameters.artifacts.download.path, 'artifacts') }}
152itemPattern: ${{ coalesce(parameters.artifacts.download.pattern, '**') }}
153
154- ${{ each step in parameters.steps }}:
155- ${{ step }}
156
157- ${{ if eq(parameters.enableRichCodeNavigation, true) }}:
158- task: RichCodeNavIndexer@0
159displayName: RichCodeNav Upload
160inputs:
161languages: ${{ coalesce(parameters.richCodeNavigationLanguage, 'csharp') }}
162environment: ${{ coalesce(parameters.richCodeNavigationEnvironment, 'production') }}
163richNavLogOutputDirectory: $(Build.SourcesDirectory)/artifacts/bin
164uploadRichNavArtifacts: ${{ coalesce(parameters.richCodeNavigationUploadArtifacts, false) }}
165continueOnError: true
166
167- template: /eng/common/templates-official/steps/component-governance.yml
168parameters:
169${{ if eq(parameters.disableComponentGovernance, '') }}:
170${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.runAsPublic, 'false'), or(startsWith(variables['Build.SourceBranch'], 'refs/heads/release/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/dotnet/'), startsWith(variables['Build.SourceBranch'], 'refs/heads/microsoft/'), eq(variables['Build.SourceBranch'], 'refs/heads/main'))) }}:
171disableComponentGovernance: false
172${{ else }}:
173disableComponentGovernance: true
174${{ else }}:
175disableComponentGovernance: ${{ parameters.disableComponentGovernance }}
176componentGovernanceIgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
177
178- ${{ if eq(parameters.enableMicrobuild, 'true') }}:
179- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
180- task: MicroBuildCleanup@1
181displayName: Execute Microbuild cleanup tasks
182condition: and(always(), in(variables['_SignType'], 'real', 'test'), eq(variables['Agent.Os'], 'Windows_NT'))
183continueOnError: ${{ parameters.continueOnError }}
184env:
185TeamName: $(_TeamName)
186
187- ${{ if ne(parameters.artifacts.publish, '') }}:
188- ${{ if and(ne(parameters.artifacts.publish.artifacts, 'false'), ne(parameters.artifacts.publish.artifacts, '')) }}:
189- task: CopyFiles@2
190displayName: Gather binaries for publish to artifacts
191inputs:
192SourceFolder: 'artifacts/bin'
193Contents: '**'
194TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/bin'
195- task: CopyFiles@2
196displayName: Gather packages for publish to artifacts
197inputs:
198SourceFolder: 'artifacts/packages'
199Contents: '**'
200TargetFolder: '$(Build.ArtifactStagingDirectory)/artifacts/packages'
201- task: 1ES.PublishBuildArtifacts@1
202displayName: Publish pipeline artifacts
203inputs:
204PathtoPublish: '$(Build.ArtifactStagingDirectory)/artifacts'
205PublishLocation: Container
206ArtifactName: ${{ coalesce(parameters.artifacts.publish.artifacts.name , 'Artifacts_$(Agent.Os)_$(_BuildConfig)') }}
207continueOnError: true
208condition: always()
209- ${{ if and(ne(parameters.artifacts.publish.logs, 'false'), ne(parameters.artifacts.publish.logs, '')) }}:
210- task: 1ES.PublishPipelineArtifact@1
211inputs:
212targetPath: 'artifacts/log'
213artifactName: ${{ coalesce(parameters.artifacts.publish.logs.name, 'Logs_Build_$(Agent.Os)_$(_BuildConfig)') }}
214displayName: 'Publish logs'
215continueOnError: true
216condition: always()
217
218- ${{ if ne(parameters.enablePublishBuildArtifacts, 'false') }}:
219- task: 1ES.PublishBuildArtifacts@1
220displayName: Publish Logs
221inputs:
222PathtoPublish: '$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)'
223PublishLocation: Container
224ArtifactName: ${{ coalesce(parameters.enablePublishBuildArtifacts.artifactName, '$(Agent.Os)_$(Agent.JobName)' ) }}
225continueOnError: true
226condition: always()
227
228- ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'xunit')) }}:
229- task: PublishTestResults@2
230displayName: Publish XUnit Test Results
231inputs:
232testResultsFormat: 'xUnit'
233testResultsFiles: '*.xml'
234searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
235testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-xunit
236mergeTestResults: ${{ parameters.mergeTestResults }}
237continueOnError: true
238condition: always()
239- ${{ if or(and(eq(parameters.enablePublishTestResults, 'true'), eq(parameters.testResultsFormat, '')), eq(parameters.testResultsFormat, 'vstest')) }}:
240- task: PublishTestResults@2
241displayName: Publish TRX Test Results
242inputs:
243testResultsFormat: 'VSTest'
244testResultsFiles: '*.trx'
245searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
246testRunTitle: ${{ coalesce(parameters.testRunTitle, parameters.name, '$(System.JobName)') }}-trx
247mergeTestResults: ${{ parameters.mergeTestResults }}
248continueOnError: true
249condition: always()
250
251- ${{ if and(eq(parameters.runAsPublic, 'false'), ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.enableSbom, 'true')) }}:
252- template: /eng/common/templates-official/steps/generate-sbom.yml
253parameters:
254PackageVersion: ${{ parameters.packageVersion}}
255BuildDropPath: ${{ parameters.buildDropPath }}
256IgnoreDirectories: ${{ parameters.componentGovernanceIgnoreDirectories }}
257
258- ${{ if eq(parameters.enableBuildRetry, 'true') }}:
259- task: 1ES.PublishPipelineArtifact@1
260inputs:
261targetPath: '$(Build.SourcesDirectory)\eng\common\BuildConfiguration'
262artifactName: 'BuildConfiguration'
263displayName: 'Publish build retry configuration'
264continueOnError: true