build-job.yml 16.9 KB
Newer Older
1 2
parameters:
  archType: ''
3
  buildConfig: ''
4 5 6
  # compilerName specifies the compiler to use to do the builds. This can either be 'gcc' or left
  # unset to use the default (clang on Linux/Mac, Visual C++ on Windows).
  compilerName: ''
7 8
  condition: true
  container: ''
9
  crossBuild: false
10
  dependOnEvaluatePaths: false
11
  disableClrTest: false
12
  isOfficialBuild: false
13
  osGroup: ''
14
  osSubgroup: ''
D
Davis Goodin 已提交
15
  platform: ''
16
  pool: ''
17
  runtimeVariant: ''
18
  signBinaries: false
19
  stagedBuild: false
20 21
  testGroup: ''
  timeoutInMinutes: ''
22
  variables: {}
A
Andy Gocke 已提交
23
  pgoType: ''
24 25 26

### Product build
jobs:
27
- template: xplat-pipeline-job.yml
28 29 30 31
  parameters:
    buildConfig: ${{ parameters.buildConfig }}
    archType: ${{ parameters.archType }}
    osGroup: ${{ parameters.osGroup }}
32
    osSubgroup: ${{ parameters.osSubgroup }}
33
    runtimeVariant: ${{ parameters.runtimeVariant }}
34
    testGroup: ${{ parameters.testGroup }}
R
Russ Keldorph 已提交
35
    helixType: 'build/product/'
36
    enableMicrobuild: true
37
    stagedBuild: ${{ parameters.stagedBuild }}
38
    pool: ${{ parameters.pool }}
39
    condition: ${{ parameters.condition }}
40
    dependOnEvaluatePaths: ${{ parameters.dependOnEvaluatePaths }}
41
    disableClrTest: ${{ parameters.disableClrTest }}
42
    pgoType: ${{ parameters.pgoType }}
43 44

    # Compute job name from template parameters
45
    ${{ if and(ne(parameters.testGroup, 'clrTools'), eq(parameters.compilerName, 'gcc')) }}:
46
      name: ${{ format('coreclr_{0}_product_build_{1}{1}_{3}_{4}', parameters.compilerName, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }}
47
      displayName: ${{ format('GCC Product Build {0}{1} {2} {3}', parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }}
48
    ${{ if and(ne(parameters.testGroup, 'clrTools'), ne(parameters.compilerName, 'gcc')) }}:
A
Andy Gocke 已提交
49 50 51 52 53 54 55 56 57 58 59 60
      name: ${{ format('coreclr_{0}_product_build_{1}{2}_{3}_{4}{5}',
        parameters.runtimeVariant,
        parameters.osGroup,
        parameters.osSubgroup,
        parameters.archType,
        parameters.buildConfig,
        parameters.pgoType) }}
      displayName: ${{ format('CoreCLR {0} Product Build {1}{2} {3} {4} {5}',
        parameters.runtimeVariant, parameters.osGroup, parameters.osSubgroup,
        parameters.archType,
        parameters.buildConfig,
        parameters.pgoType) }}
61 62 63
    ${{ if eq(parameters.testGroup, 'clrTools') }}:
      name: ${{ format('coreclr_{0}_tools_unittests_{1}{2}_{3}_{4}', parameters.runtimeVariant, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }}
      displayName: ${{ format('CoreCLR {0} Tools Unit Tests {1}{2} {3} {4}', parameters.runtimeVariant, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }}
64 65

    # Run all steps in the container.
66 67
    # Note that the containers are defined in platform-matrix.yml
    container: ${{ parameters.container }}
68 69 70

    timeoutInMinutes: ${{ parameters.timeoutInMinutes }}

71
    crossBuild: ${{ parameters.crossBuild }}
72

73 74
    gatherAssetManifests: true
    variables:
75 76 77 78
    - name: osGroup
      value: ${{ parameters.osGroup }}
    - name: osSubgroup
      value: ${{ parameters.osSubgroup }}
79
    - name: compilerArg
80
      value: ''
81 82
    - name: publishLogsArtifactPrefix
      value: 'BuildLogs_CoreCLR'
83 84 85
    - ${{ if eq(parameters.testGroup, 'clrTools') }}:
      - name: publishLogsArtifactPrefix
        value: 'BuildLogs_CoreCLR_ToolsUnitTests'
86 87
    - ${{ if eq(parameters.compilerName, 'gcc') }}:
      - name: compilerArg
88
        value: '-gcc'
89 90
      - name: publishLogsArtifactPrefix
        value: 'BuildLogs_CoreCLR_GCC'
91
    - ${{ if and(ne(parameters.osGroup, 'windows'), ne(parameters.compilerName, 'gcc')) }}:
92
      - name: compilerArg
93
        value: '-clang9'
94 95
      # We need to use the stable version available on Alpine Linux
      - ${{ if and(eq(parameters.osGroup, 'Linux'), eq(parameters.osSubgroup, '_musl')) }}:
96
        - name: compilerArg
97
          value: ''
A
Adeel Mujahid 已提交
98
      # AppleClang has different version scheme, so we let compiler introspection pick up the available clang from PATH
99
      - ${{ if eq(parameters.osGroup, 'OSX') }}:
100
        - name: compilerArg
101
          value: ''
102 103 104
    - ${{ if and(ne(variables['System.TeamProject'], 'public'), ne(variables['Build.Reason'], 'PullRequest')) }}:
      # Variables used to publish packages to blob feed
      - name: dotnetfeedUrl
105
        value: https://dotnetfeed.blob.core.windows.net/dotnet-coreclr/index.json
106 107 108 109 110
      - name: dotnetfeedPAT
        value: $(dotnetfeed-storage-access-key-1)
      # Variables used by arcade to gather asset manifests
      - name: _DotNetPublishToBlobFeed
        value: true
111 112
    - name: officialBuildIdArg
      value: ''
113
    - ${{ if eq(parameters.isOfficialBuild, true) }}:
114
      - name: officialBuildIdArg
115
        value: '/p:OfficialBuildId=$(Build.BuildNumber)'
116 117 118
    - name: enforcePgoArg
      value: ''
    # The EnforcePGO script is only supported on Windows and is not supported on arm or arm64.
A
Andy Gocke 已提交
119
    - ${{ if and(eq(parameters.buildConfig, 'Release'), and(eq(parameters.osGroup, 'windows'), not(or(eq(parameters.archType, 'arm64'), eq(parameters.archType, 'arm')))), ne(parameters.pgoType, 'pgo')) }}:
120 121
      - name: enforcePgoArg
        value: '-enforcepgo'
122

123 124 125 126 127
    - name: clrInterpreterBuildArg
      value: ''
    - ${{ if eq(parameters.testGroup, 'clrinterpreter') }}:
      - name: clrInterpreterBuildArg
        value: '-cmakeargs "-DFEATURE_INTERPRETER=1"'
128

129
    - name: clrRuntimeComponentsBuildArg
D
David Wrighton 已提交
130 131
      value: ''
    - ${{ if ne(parameters.testGroup, 'innerloop') }}:
132
      - name: clrRuntimeComponentsBuildArg
133
        value: '-component runtime -component alljits -component paltests -component nativeaot -component spmi '
134 135
    - ${{ if and(eq(parameters.osGroup, 'Linux'), eq(parameters.archType, 'x86')) }}:
      - name: clrRuntimeComponentsBuildArg
136
        value: '-component runtime -component jit -component iltools -component spmi '
137

A
Andy Gocke 已提交
138 139 140 141
    - name: pgoInstrumentArg
      value: ''
    - ${{ if eq(parameters.pgoType, 'PGO' )}}:
      - name: pgoInstrumentArg
142
        value: '-pgoinstrument '
A
Andy Gocke 已提交
143

144 145
    - name: SignType
      value: $[ coalesce(variables.OfficialSignType, 'real') ]
146

147 148
    - name: clrRuntimePortableBuildArg
      value: ''
149
    - ${{ if eq(parameters.osGroup, 'Tizen') }}:
150 151 152
      - name: clrRuntimePortableBuildArg
        value: '-portablebuild=false'

153
    - ${{ parameters.variables }}
154

155 156 157
    steps:

    # Install native dependencies
158 159 160
    # Linux builds use docker images with dependencies preinstalled,
    # and FreeBSD builds use a build agent with dependencies
    # preinstalled, so we only need this step for OSX and Windows.
161
    - ${{ if eq(parameters.osGroup, 'OSX') }}:
162
      - script: $(Build.SourcesDirectory)/eng/install-native-dependencies.sh $(osGroup)
163 164
        displayName: Install native dependencies

165 166 167 168
    # Install internal tools on official builds
    # Since our internal tools are behind an authenticated feed,
    # we need to use the DotNetCli AzDO task to restore from the feed using a service connection.
    # We can't do this from within the build, so we need to do this as a separate step.
169
    - ${{ if and(eq(variables['System.TeamProject'], 'internal'), ne(variables['Build.Reason'], 'PullRequest')) }}:
170
      - template: /eng/pipelines/common/restore-internal-tools.yml
171

172 173 174 175 176 177 178 179 180 181 182
    # Install MicroBuild for signing the DAC and DBI
    - ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.signBinaries, true), eq(parameters.osGroup, 'windows')) }}:
      - task: MicroBuildSigningPlugin@2
        displayName: Install MicroBuild plugin for Signing
        inputs:
          signType: $(SignType)
          zipSources: false
          feedSource: https://dnceng.pkgs.visualstudio.com/_packaging/MicroBuildToolset/nuget/v3/index.json
        continueOnError: false
        condition: and(succeeded(), in(variables['SignType'], 'real', 'test'))

183
    - ${{ if in(parameters.osGroup, 'OSX', 'iOS', 'tvOS') }}:
J
Jarret Shook 已提交
184 185 186 187 188
      - script: |
          du -sh $(Build.SourcesDirectory)/*
          df -h
        displayName: Disk Usage before Build

189 190 191
    # Build/Generate native prerequisites
    - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.nativeprereqs $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(officialBuildIdArg) -ci /bl:$(Build.SourcesDirectory)artifacts/log/$(buildConfig)/CoreCLRNativePrereqs.binlog
      displayName: Build and generate native prerequisites
192

193
    # Build CoreCLR Runtime
194
    - ${{ if ne(parameters.osGroup, 'windows') }}:
195
      - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) $(crossArg) $(osArg) -ci $(compilerArg) $(clrRuntimeComponentsBuildArg) $(pgoInstrumentArg) $(officialBuildIdArg) $(clrInterpreterBuildArg) $(clrRuntimePortableBuildArg) $(CoreClrPgoDataArg)
196
        displayName: Build CoreCLR Runtime
197
    - ${{ if eq(parameters.osGroup, 'windows') }}:
198
      - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -ci $(enforcePgoArg) $(pgoInstrumentArg) $(officialBuildIdArg) $(clrInterpreterBuildArg) $(CoreClrPgoDataArg)
199 200
        displayName: Build CoreCLR Runtime

201 202
    - ${{ if ne(parameters.archType, 'x64') }}:
      - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -hostarch x64 $(osArg) -ci $(compilerArg) -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1" $(officialBuildIdArg) $(clrRuntimePortableBuildArg)
A
Adeel Mujahid 已提交
203
        displayName: Build CoreCLR Cross-Arch Tools (Tools that run on x64 targeting x86)
204 205 206

    - ${{ if and(eq(parameters.osGroup, 'windows'), eq(parameters.archType, 'arm')) }}:
      - script: $(Build.SourcesDirectory)/src/coreclr/build-runtime$(scriptExt) $(buildConfig) $(archType) -hostarch x86 $(osArg) -ci $(compilerArg) -component crosscomponents -cmakeargs "-DCLR_CROSS_COMPONENTS_BUILD=1" $(officialBuildIdArg) $(clrRuntimePortableBuildArg)
A
Adeel Mujahid 已提交
207
        displayName: Build CoreCLR Cross-Arch Tools (Tools that run on x86 targeting arm)
208

209
    - ${{ if in(parameters.osGroup, 'OSX', 'iOS', 'tvOS') }}:
J
Jarret Shook 已提交
210 211 212 213 214
      - script: |
          du -sh $(Build.SourcesDirectory)/*
          df -h
        displayName: Disk Usage after Build

215
    # Build CoreCLR Managed Components
216
    - ${{ if or(ne(parameters.osGroup, 'Linux'), ne(parameters.archType, 'x86')) }}:
217
      - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.corelib+clr.nativecorelib+clr.nativeaotlibs+clr.tools+clr.packages+clr.paltestlist $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(pgoInstrumentArg) $(officialBuildIdArg) -ci
218 219 220 221
        displayName: Build managed product components and packages
    - ${{ if and(eq(parameters.osGroup, 'Linux'), eq(parameters.archType, 'x86')) }}:
      - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.corelib $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(pgoInstrumentArg) $(officialBuildIdArg) -ci
        displayName: Build managed product components and packages
222

223 224
    # Run CoreCLR Tools unit tests
    - ${{ if eq(parameters.testGroup, 'clrTools') }}:
225 226
      - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset libs $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(officialBuildIdArg) -ci
        displayName: Build libs
227
      - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) -subset clr.toolstests $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(officialBuildIdArg) -ci -test
228 229
        displayName: Run CoreCLR Tools unit tests

230
    # Build native test components
231
    - ${{ if and(ne(parameters.isOfficialBuild, true), ne(parameters.disableClrTest, true)) }}:
232
      - script: $(Build.SourcesDirectory)/src/tests/build$(scriptExt) skipmanaged skipgeneratelayout $(buildConfig) $(archType) $(crossArg) $(osArg) $(priorityArg) $(compilerArg)
233
        displayName: Build native test components
234

235 236 237
    # Build libs.native, host.native and mono with gcc
    - ${{ if eq(parameters.compilerName, 'gcc') }}:
      - script: $(Build.SourcesDirectory)$(dir)build$(scriptExt) libs.native+host.native+mono $(compilerArg) $(crossArg) -arch $(archType) $(osArg) -c $(buildConfig) $(pgoInstrumentArg) $(officialBuildIdArg) -ci
238
        displayName: Build libs.native+host.native+mono
239

240 241 242 243 244 245
    # Sign and add entitlements to these MacOS binaries
    - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
      - ${{ if eq(parameters.osGroup, 'OSX') }}:

        - template: /eng/pipelines/common/macos-sign-with-entitlements.yml
          parameters:
246
            filesToSign:
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
            - name: createdump
              path: $(buildProductRootFolderPath)
              entitlementsFile: $(Build.SourcesDirectory)/eng/pipelines/common/createdump-entitlements.plist
            - name: corerun
              path: $(buildProductRootFolderPath)
              entitlementsFile: $(Build.SourcesDirectory)/eng/pipelines/common/entitlements.plist

        - task: CopyFiles@2
          displayName: 'Copy signed createdump to sharedFramework'
          inputs:
            contents: createdump
            sourceFolder: $(buildProductRootFolderPath)
            targetFolder: $(buildProductRootFolderPath)/sharedFramework
            overWrite: true

262
    - ${{ if and(eq(parameters.osGroup, 'windows'), eq(parameters.signBinaries, true)) }}:
263 264 265 266 267
      - template: /eng/pipelines/coreclr/templates/sign-diagnostic-files.yml
        parameters:
          basePath: $(buildProductRootFolderPath)
          isOfficialBuild: ${{ parameters.signBinaries }}
          timeoutInMinutes: 30
268

269
    # Builds using gcc are not tested, and clrTools unitests do not publish the build artifacts
270
    - ${{ if and(ne(parameters.compilerName, 'gcc'), ne(parameters.testGroup, 'clrTools'), ne(parameters.disableClrTest, true)) }}:
271 272 273 274 275 276 277 278 279 280 281
      # Publish product output directory for consumption by tests.
      - template: /eng/pipelines/common/upload-artifact-step.yml
        parameters:
          rootFolder: $(buildProductRootFolderPath)
          includeRootFolder: false
          archiveType: $(archiveType)
          tarCompression: $(tarCompression)
          archiveExtension: $(archiveExtension)
          artifactName: $(buildProductArtifactName)
          displayName: 'product build'

282
    - ${{ if and(in(parameters.osGroup, 'windows', 'Linux'), ne(parameters.archType, 'x86'), ne(parameters.compilerName, 'gcc'), ne(parameters.testGroup, 'clrTools'), eq(parameters.pgoType, '')) }}:
283 284 285 286 287
        - template: /eng/pipelines/coreclr/templates/crossdac-build.yml
          parameters:
            archType: ${{ parameters.archType }}
            osGroup: ${{ parameters.osGroup }}
            osSubgroup: ${{ parameters.osSubgroup }}
288
            isOfficialBuild: ${{ parameters.signBinaries }}
J
Juan Hoyos 已提交
289 290 291 292
            ${{ if eq(parameters.archType, 'arm') }}:
              hostArchType: x86
            ${{ else }}:
              hostArchType: x64
293

294
    - ${{ if and(ne(parameters.compilerName, 'gcc'), ne(parameters.testGroup, ''), ne(parameters.testGroup, 'clrTools'), ne(parameters.disableClrTest, true)) }}:
295
      # Publish test native components for consumption by test execution.
296
      - ${{ if and(ne(parameters.isOfficialBuild, true), eq(parameters.pgoType, '')) }}:
297 298 299 300 301 302 303 304 305
        - template: /eng/pipelines/common/upload-artifact-step.yml
          parameters:
            rootFolder: $(nativeTestArtifactRootFolderPath)
            includeRootFolder: false
            archiveType: $(archiveType)
            tarCompression: $(tarCompression)
            archiveExtension: $(archiveExtension)
            artifactName: $(nativeTestArtifactName)
            displayName: 'native test components'
306

307
    # Get key vault secrets for publishing
308
    - ${{ if and(ne(variables['System.TeamProject'], 'public'), ne(variables['Build.Reason'], 'PullRequest')) }}:
309 310 311 312 313 314
      - task: AzureKeyVault@1
        inputs:
          azureSubscription: 'DotNet-Engineering-Services_KeyVault'
          KeyVaultName: EngKeyVault
          SecretsFilter: 'dotnetfeed-storage-access-key-1,microsoft-symbol-server-pat,symweb-symbol-server-pat'

D
Davis Goodin 已提交
315
    # Save packages using the prepare-signed-artifacts format.
316
    - ${{ if and(eq(parameters.isOfficialBuild, true), ne(parameters.testGroup, 'clrTools'), eq(parameters.pgoType, '')) }}:
J
Jeremy Koritzinsky 已提交
317
      - template: /eng/pipelines/common/upload-intermediate-artifacts-step.yml
D
Davis Goodin 已提交
318 319 320
        parameters:
          name: ${{ parameters.platform }}

321 322 323 324 325 326 327 328 329 330 331
    # Publish unit tests results if executing unit tests
    - ${{ if eq(parameters.testGroup, 'clrTools') }}:
      - task: PublishTestResults@2
        inputs:
          testResultsFormat: 'xUnit'
          testResultsFiles: '*.xml'
          testRunTitle: CoreCLR-Tools-Unittests-$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)
          searchFolder: '$(Build.SourcesDirectory)/artifacts/TestResults/$(_BuildConfig)'
        continueOnError: true
        condition: always()

332
    # Publish Logs
333
    - task: PublishPipelineArtifact@1
334 335
      displayName: Publish Logs
      inputs:
336
        targetPath: $(Build.SourcesDirectory)/artifacts/log
337
        artifactName: '$(publishLogsArtifactPrefix)${{ parameters.pgoType }}_$(osGroup)$(osSubgroup)_$(archType)_$(buildConfig)'
338 339
      continueOnError: true
      condition: always()