diff --git a/eng/pipelines/common/platform-matrix.yml b/eng/pipelines/common/platform-matrix.yml index 66f4ddf9820080..fa674a5998aa21 100644 --- a/eng/pipelines/common/platform-matrix.yml +++ b/eng/pipelines/common/platform-matrix.yml @@ -159,6 +159,22 @@ jobs: managedTestBuildOsGroup: OSX ${{ insert }}: ${{ parameters.jobParameters }} +- ${{ if containsValue(parameters.platforms, 'WebAssembly_wasm') }}: + - template: xplat-setup.yml + parameters: + jobTemplate: ${{ parameters.jobTemplate }} + helixQueuesTemplate: ${{ parameters.helixQueuesTemplate }} + osGroup: WebAssembly + archType: wasm + platform: WebAssembly_wasm + container: + image: ubuntu-16.04-a50a721-20191023143845 + registry: mcr + jobParameters: + stagedBuild: ${{ parameters.stagedBuild }} + buildConfig: ${{ parameters.buildConfig }} + ${{ insert }}: ${{ parameters.jobParameters }} + # FreeBSD # FreeBSD machines are currently offline. Re-enable in the official build when diff --git a/eng/pipelines/libraries/.azure-ci.yml b/eng/pipelines/libraries/.azure-ci.yml index af7dc48acb068b..64b7e8919b940d 100644 --- a/eng/pipelines/libraries/.azure-ci.yml +++ b/eng/pipelines/libraries/.azure-ci.yml @@ -22,7 +22,6 @@ trigger: - src/coreclr/* - eng/pipelines/coreclr/* - eng/pipelines/installer/* - - eng/pipelines/common/* pr: branches: @@ -43,30 +42,6 @@ pr: - src/coreclr/* - eng/pipelines/coreclr/* - eng/pipelines/installer/* - - eng/pipelines/common/* - -resources: - containers: - - container: centos7_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-f39df28-20191023143754 - - - container: centos6_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-6-f39df28-20191023143802 - - - container: alpine_39_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.9-WithNode-0fc54a3-20190918214015 - - - container: alpine_37_arm64_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-alpine-406629a-20191023143847 - - - container: ubuntu_1604_arm64_cross_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-cfdd435-20191023143847 - - - container: ubuntu_1604_arm_cross_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-14.04-23cacb0-20191023143847 - - - container: ubuntu_1604 - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-a50a721-20191023143845 variables: - template: variables.yml @@ -83,55 +58,96 @@ variables: - name: _DotNetValidationArtifactsCategory value: .NETCore -stages: - # Windows legs - - template: ${{ variables['pipelinesPath'] }}/windows.yml - parameters: - isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} - - # Linux legs - - template: ${{ variables['pipelinesPath'] }}/linux.yml - parameters: - isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} +jobs: + - template: /eng/pipelines/common/checkout-job.yml - # MacOS legs - - template: ${{ variables['pipelinesPath'] }}/macos.yml + - template: /eng/pipelines/common/platform-matrix.yml parameters: - isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} - - # FreeBSD leg is only for official builds - # - template: ${{ variables['pipelinesPath'] }}/freebsd.yml - # parameters: - # isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - # fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} - - # Publish and validation steps. Only run in official builds - - ${{ if and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }}: - - template: ${{ variables['pipelinesPath'] }}/pre-publish.yml + jobTemplate: /eng/pipelines/libraries/build-job.yml + buildConfig: Release + platforms: + - Linux_rhel6_x64 + - Windows_NT_x86 + - ${{ if eq(variables['isFullMatrix'], true) }}: + - OSX_x64 + - Windows_NT_x64 + - Linux_x64 + - Linux_arm + - Linux_arm64 + - Linux_musl_x64 + - Linux_musl_arm64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + isFullMatrix: ${{ variables['isFullMatrix'] }} + framework: netcoreapp + ${{ if eq(variables['isOfficialBuild'], false) }}: + runTests: true + testScope: innerloop + + - ${{ if eq(variables['isFullMatrix'], false) }}: + - template: /eng/pipelines/common/platform-matrix.yml parameters: - dependsOn: - - WindowsStage - - LinuxStage - - MacOSStage - # - FreeBSD - - - template: eng\common\templates\post-build\post-build.yml - parameters: - validateDependsOn: - - PrePublish - enableSymbolValidation: false # https://github.com/dotnet/arcade/issues/2871 - SDLValidationParameters: - enable: true - params: ' -SourceToolsList @("policheck","credscan") - -TsaInstanceURL "$(TsaInstanceURL)" - -TsaProjectName "$(TsaProjectName)" - -TsaNotificationEmail "$(TsaNotificationEmail)" - -TsaCodebaseAdmin "$(TsaCodebaseAdmin)" - -TsaBugAreaPath "$(TsaBugAreaPath)" - -TsaIterationPath "$(TsaIterationPath)" - -TsaRepositoryName "CoreFX" - -TsaCodebaseName "CoreFX" - -TsaPublish $True' + jobTemplate: /eng/pipelines/libraries/build-job.yml + buildConfig: Debug + platforms: + - Windows_NT_x64 + - OSX_x64 + - Linux_x64 + - Linux_musl_x64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + isFullMatrix: ${{ variables['isFullMatrix'] }} + testScope: innerloop + framework: netcoreapp + runTests: true + + - template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/libraries/build-job.yml + ${{ if eq(variables['isFullMatrix'], false) }}: + buildConfig: Debug + ${{ if eq(variables['isFullMatrix'], true) }}: + buildConfig: Release + platforms: + - WebAssembly_wasm + - ${{ if eq(variables['isFullMatrix'], false) }}: + - Linux_arm + - Linux_arm64 + - Linux_musl_arm64 + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + framework: netcoreapp + + - template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/libraries/build-job.yml + buildConfig: Release + platforms: + - Windows_NT_x86 + - ${{ if eq(variables['isFullMatrix'], true) }}: + - Windows_NT_x64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + framework: netfx + ${{ if eq(variables['isOfficialBuild'], false) }}: + runTests: true + testScope: innerloop + + - template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/libraries/build-job.yml + ${{ if eq(variables['isFullMatrix'], false) }}: + buildConfig: Debug + ${{ if eq(variables['isFullMatrix'], true) }}: + buildConfig: Release + platforms: + - Windows_NT_x64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + framework: allConfigurations + ${{ if eq(variables['isOfficialBuild'], false) }}: + runTests: true diff --git a/eng/pipelines/libraries/base-job.yml b/eng/pipelines/libraries/base-job.yml new file mode 100644 index 00000000000000..e345b8973f81ff --- /dev/null +++ b/eng/pipelines/libraries/base-job.yml @@ -0,0 +1,105 @@ +parameters: + buildConfig: '' + osGroup: '' + archType: '' + osSubgroup: '' + framework: '' + isOfficialBuild: false + timeoutInMinutes: 150 + container: '' + steps: [] + dependsOn: [] + variables: {} + name: '' + displayName: '' + testScope: '' + pool: '' + stepName: '' + +jobs: + - template: /eng/common/templates/job/job.yml + parameters: + name: ${{ format('libraries_{0}_{1}_{2}{3}_{4}_{5}', parameters.stepName, parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + ${{ if eq(parameters.framework, 'netcoreapp') }}: + displayName: ${{ format('{0} {1}{2} {3} {4}', parameters.stepName, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + ${{ if ne(parameters.framework, 'netcoreapp') }}: + displayName: ${{ format('{0} {1} {2} {3} {4}', parameters.stepName, parameters.osGroup, parameters.framework, parameters.archType, parameters.buildConfig) }} + + enableTelemetry: ${{ parameters.isOfficialBuild }} # TODO: figure out if it's needed + container: ${{ parameters.container }} + helixRepo: dotnet/runtime + pool: ${{ parameters.pool }} + variables: + - _BuildConfig: ${{ parameters.buildConfig }} + - _msbuildCommonParameters: '' + - _stripSymbolsArg: '' + - _runtimeOSArg: '' + - _portableArg: '' + - _finalFrameworkArg: -framework ${{ parameters.framework }} + - _buildScript: $(buildScriptFileName)$(scriptExt) + - _warnAsErrorArg: '' + - _testScopeArg: '' + + - ${{ if ne(parameters.testScope, '') }}: + - _testScopeArg: -testscope ${{ parameters.testScope }} + + - ${{ if and(eq(parameters.osGroup, 'Linux'), eq(parameters.osSubGroup, '_rhel6')) }}: + - _runtimeOSArg: /p:RuntimeOS=rhel.6 + - _portableArg: /p:PortableBuild=false + + - ${{ if and(eq(parameters.osGroup, 'Linux'), eq(parameters.osSubGroup, '_musl')) }}: + - _runtimeOSArg: /p:RuntimeOS=linux-musl + + - ${{ if and(eq(parameters.osGroup, 'Linux'), eq(parameters.osSubGroup, ''), eq(parameters.archType, 'arm')) }}: + - _runtimeOSArg: /p:RuntimeOS=ubuntu.16.04 + + - ${{ if and(or(eq(parameters.osGroup, 'Linux'), eq(parameters.osGroup, 'WebAssembly')), ne(parameters.container, '')) }}: + - _warnAsErrorArg: '-warnAsError false' + + - ${{ if eq(parameters.osGroup, 'WebAssembly') }}: + - _runtimeOSArg: -os ${{ parameters.osGroup }} + + - ${{ if eq(parameters.framework, 'allConfigurations' ) }}: + - _finalFrameworkArg: -allConfigurations + + - ${{ if eq(parameters.isOfficialBuild, 'true') }}: + - _msbuildCommonParameters: /p:OfficialBuildId=$(Build.BuildNumber) + + # Windows variables + - ${{ if eq(parameters.osGroup, 'Windows_NT') }}: + - _msbuildCommand: powershell -ExecutionPolicy ByPass -NoProfile eng\common\msbuild.ps1 -warnaserror:0 -ci + - _runtimeOSArg: /p:RuntimeOS=win10 + + # Non-Windows variables + - ${{ if ne(parameters.osGroup, 'Windows_NT') }}: + - _msbuildCommand: ./eng/common/msbuild.sh --warnaserror false --ci + - _buildScript: ./$(buildScriptFileName)$(scriptExt) + - ${{ if eq(parameters.isOfficialBuild, 'true') }}: + - _stripSymbolsArg: -stripSymbols + + - _buildArguments: -configuration ${{ parameters.buildConfig }} -ci -arch ${{ parameters.archType }} $(_finalFrameworkArg) $(_stripSymbolsArg) $(_testScopeArg) $(_warnAsErrorArg) $(_runtimeOSArg) $(_portableArg) $(_msbuildCommonParameters) + - ${{ parameters.variables }} + + dependsOn: + - checkout + - ${{ parameters.dependsOn }} + workspace: + clean: all + + enablePublishBuildArtifacts: true + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + + steps: + - checkout: none + clean: true + + - download: current + artifact: Checkout_bundle + displayName: Download Checkout.bundle + + - script: | + git clone $(Pipeline.Workspace)/Checkout_bundle/Checkout.bundle . + git remote set-url origin $(Build.Repository.Uri) + displayName: Clone the repository from Checkout.bundle + + - ${{ parameters.steps }} diff --git a/eng/pipelines/libraries/build-job.yml b/eng/pipelines/libraries/build-job.yml new file mode 100644 index 00000000000000..0ae7cc6093d34b --- /dev/null +++ b/eng/pipelines/libraries/build-job.yml @@ -0,0 +1,128 @@ +parameters: + buildConfig: '' + osGroup: '' + osSubgroup: '' + archType: '' + framework: netcoreapp + isOfficialBuild: false + timeoutInMinutes: 150 + preBuildSteps: [] + container: '' + variables: {} + pool: '' + runTests: false + testScope: '' + +jobs: + - template: /eng/pipelines/libraries/base-job.yml + parameters: + buildConfig: ${{ parameters.buildConfig }} + osGroup: ${{ parameters.osGroup }} + osSubgroup: ${{ parameters.osSubgroup }} + archType: ${{ parameters.archType }} + framework: ${{ parameters.framework }} + isOfficialBuild: ${{ parameters.isOfficialBuild }} + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + preBuildSteps: ${{ parameters.preBuildSteps }} + container: ${{ parameters.container }} + pool: ${{ parameters.pool }} + testScope: ${{ parameters.testScope }} + stepName: Build + + variables: + - _skipTestRestoreArg: /p:SkipTestRestore=true + - _buildAction: -build + - ${{ parameters.variables }} + - ${{ if eq(parameters.osGroup, 'WebAssembly') }}: + - EMSDK_PATH: $(Build.BinariesDirectory)/emsdk + - ${{ if eq(parameters.runTests, true) }}: + - _buildAction: -build -buildtests /p:ArchiveTests=true + - ${{ if ne(parameters.framework, 'allConfigurations') }}: + - _skipTestRestoreArg: /p:SkipTestRestore=false + + steps: + - script: $(_buildScript) -restore $(_buildArguments) $(_skipTestRestoreArg) + displayName: Restore + + - ${{ if eq(parameters.isOfficialBuild, true) }}: + - task: DotNetCoreCLI@2 + displayName: Restore internal tools + condition: and(succeeded(), ne(variables['_skipRestoreInternalTools'], 'true')) + inputs: + command: restore + feedsToUse: config + projects: 'eng/common/internal/Tools.csproj' + nugetConfigPath: 'eng/internal/NuGet.config' + restoreDirectory: '$(Build.SourcesDirectory)\.packages' + verbosityRestore: 'normal' + externalFeedCredentials: 'dotnet-core-internal-tooling' + + - ${{ if eq(parameters.osGroup, 'OSX') }}: + - script: | + brew install pkgconfig openssl + ln -s /usr/local/opt/openssl/lib/pkgconfig/libcrypto.pc /usr/local/lib/pkgconfig/ + ln -s /usr/local/opt/openssl/lib/pkgconfig/libssl.pc /usr/local/lib/pkgconfig/ + ln -s /usr/local/opt/openssl/lib/pkgconfig/openssl.pc /usr/local/lib/pkgconfig/ + displayName: Install Build Dependencies + + - ${{ if eq(parameters.osGroup, 'WebAssembly') }}: + - script: | + EMSCRIPTEN_VERSION=1.38.47 + git clone https://github.com/emscripten-core/emsdk.git $(EMSDK_PATH) + cd $(EMSDK_PATH) + ./emsdk install ${EMSCRIPTEN_VERSION}-upstream + ./emsdk activate --embedded ${EMSCRIPTEN_VERSION}-upstream + displayName: Install Emscripten + + - script: $(_buildScript) + $(_buildAction) + $(_buildArguments) + displayName: Build + + - ${{ if eq(parameters.runTests, false) }}: + - task: CopyFiles@2 + displayName: Prepare ref folder to publish + inputs: + sourceFolder: $(Build.SourcesDirectory)/artifacts/bin/ref + targetFolder: $(Build.ArtifactStagingDirectory)/artifacts/bin/ref + + - task: CopyFiles@2 + displayName: Prepare runtime folder to publish + inputs: + sourceFolder: $(Build.SourcesDirectory)/artifacts/bin/runtime + targetFolder: $(Build.ArtifactStagingDirectory)/artifacts/bin/runtime + + - task: CopyFiles@2 + displayName: Prepare testhost folder to publish + inputs: + sourceFolder: $(Build.SourcesDirectory)/artifacts/bin/testhost + targetFolder: $(Build.ArtifactStagingDirectory)/artifacts/bin/testhost + + - task: CopyFiles@2 + displayName: Prepare artifacts toolset folder to publish + inputs: + sourceFolder: $(Build.SourcesDirectory)/artifacts/toolset + targetFolder: $(Build.ArtifactStagingDirectory)/artifacts/toolset + + - template: /eng/pipelines/common/upload-artifact-step.yml + parameters: + rootFolder: $(Build.ArtifactStagingDirectory)/artifacts + includeRootFolder: false + archiveType: $(archiveType) + archiveExtension: $(archiveExtension) + tarCompression: $(tarCompression) + artifactName: ${{ format('libraries_bin_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + displayName: Build Assets + + - ${{ if eq(parameters.runTests, true) }}: + - template: /eng/pipelines/libraries/helix.yml + parameters: + targetOS: ${{ parameters.osGroup }} + archGroup: ${{ parameters.archType }} + configuration: ${{ parameters.buildConfig }} + helixQueues: ${{ join('+', parameters.helixQueues) }} + msbuildScript: $(_msbuildCommand) + framework: ${{ parameters.framework }} + testScope: ${{ parameters.testScope }} + creator: dotnet-bot + helixToken: '' diff --git a/eng/pipelines/libraries/build-test-job.yml b/eng/pipelines/libraries/build-test-job.yml new file mode 100644 index 00000000000000..a847b40cf7e235 --- /dev/null +++ b/eng/pipelines/libraries/build-test-job.yml @@ -0,0 +1,65 @@ +parameters: + buildConfig: '' + osGroup: '' + osSubgroup: '' + archType: '' + framework: netcoreapp + isOfficialBuild: false + timeoutInMinutes: 150 + container: '' + publishTestArtifacs: true + pool: '' + testScope: '' + variables: {} + runTests: false + +jobs: + - template: /eng/pipelines/libraries/base-job.yml + parameters: + buildConfig: ${{ parameters.buildConfig }} + osGroup: ${{ parameters.osGroup }} + osSubgroup: ${{ parameters.osSubgroup }} + archType: ${{ parameters.archType }} + framework: ${{ parameters.framework }} + isOfficialBuild: ${{ parameters.isOfficialBuild }} + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + container: ${{ parameters.container }} + pool: ${{ parameters.pool }} + testScope: ${{ parameters.testScope }} + stepName: Test + + dependsOn: + - ${{ format('libraries_Build_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + + variables: + - _archiveTestsParameter: /p:ArchiveTests=true + - _skipTestRestoreArg: /p:SkipTestRestore=false + + - ${{ parameters.variables }} + + steps: + - template: /eng/pipelines/common/download-artifact-step.yml + parameters: + displayName: Build Assets + artifactName: ${{ format('libraries_bin_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + artifactFileName: ${{ format('libraries_bin_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }}$(archiveExtension) + unpackFolder: $(Build.SourcesDirectory)/artifacts + + - script: $(_buildScript) -restore $(_buildArguments) $(_skipTestRestoreArg) + displayName: Restore + + - script: $(_buildScript) + -buildtests + $(_buildArguments) + $(_archiveTestsParameter) + displayName: Build + + - template: /eng/pipelines/common/upload-artifact-step.yml + parameters: + rootFolder: $(Build.SourcesDirectory)/artifacts/helix + includeRootFolder: true + archiveType: $(archiveType) + archiveExtension: $(archiveExtension) + tarCompression: $(tarCompression) + artifactName: ${{ format('libraries_test_assets_{0}_{1}_{2}_{3}', parameters.framework, parameters.osGroup, parameters.archType, parameters.buildConfig) }} + displayName: Test Assets diff --git a/eng/pipelines/libraries/corefx-base.yml b/eng/pipelines/libraries/corefx-base.yml deleted file mode 100644 index aac9dbf563799f..00000000000000 --- a/eng/pipelines/libraries/corefx-base.yml +++ /dev/null @@ -1,217 +0,0 @@ -parameters: - # Required: TargetOS value to know what script commands to use - # Accepted values: - # - Windows_NT - # - Linux - # - OSX - # - FreeBSD - targetOS: '' - - # Required: A collection of jobs to run - https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=vsts&tabs=schema#job - jobs: [] - - # Required: value to specify if the job is comming from an official build to run extra steps and sign binaries - # Default: false - isOfficialBuild: false - - # EACH JOB SHOULD INCLUDE THE FOLLOWING PROPERTIES (ASIDE FROM THE REQUIRED ONES IN THE JOB SCHEMA) - - # Required: as part of the strategy matrix, the following variables should be defined - # _BuildConfig: Debug | Release - # _architecture: x64 | x86 | arm | arm64 - # _framework: (netcoreapp, netfx). - # _helixQueues: Windows.Amd64 (Only needed if submitToHelix -> true.) -- Queues should be separated by + if multiple. - - # Required: empty | innerloop | outerloop | all - testScope: '' - - # Optional: _publishTests -> Boolean -> Publish test assets to blob storage if true. - # Default: false - # _publishTests: true | false - - # Required: submitToHelix -> Boolean -> Value to know if it should submit tests payloads to helix. - - # Optional: buildScriptPrefix -> String -> string to append to Unix build script. - # buildScriptPrefix: 'HOME=/home/ ' -> 'HOME=/home/ ./$(buildScriptName).sh ...' - - # Optional: buildExtraArguments -> String -> string to append at the end of the build arguments - # buildExtraArguments: /p:RuntimeOS=win10 -> '$(buildScriptName).cmd ... /p:RuntimeOS=win10' - - # Optional: customBuildSteps -> Array -> list of steps to run instead of the common build steps. - # customBuildSteps: - # - script: echo Hello World - # displayName: MyScript - - # Optional: preBuildSteps -> Array -> list of steps to be executed before common build steps. - # In example, to install build dependencies, or setup an environment. - # preBuildSteps: - # - script: brew install cmake - # displayName: Install Cmake - - # timeoutInMinutes: if a job doesn't define it, we will default it to 150 minutes - -jobs: - - ${{ each job in parameters.jobs }}: - - template: /eng/common/templates/job/job.yml - parameters: - variables: - - # pass along job variables - - ${{ each variable in job.variables }}: - - ${{ if ne(variable.name, '') }}: - - name: ${{ variable.name }} - value: ${{ variable.value }} - - ${{ if ne(variable.group, '') }}: - - group: ${{ variable.group }} - - # handle key-value variable syntax. - # example: - # - [key]: [value] - - ${{ if and(eq(variable.name, ''), eq(variable.group, '')) }}: - - ${{ each pair in variable }}: - - name: ${{ pair.key }} - value: ${{ pair.value }} - - - _msbuildCommonParameters: '' - - _archiveTestsParameter: '' - - _finalFrameworkArg: -framework $(_framework) - - _testScopeArg: '' - - - ${{ if ne(parameters.testScope, '') }}: - - _testScopeArg: -testscope ${{ parameters.testScope }} - - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - - _msbuildCommonParameters: /p:OfficialBuildId=$(Build.BuildNumber) - - - ${{ if eq(job.submitToHelix, 'true') }}: - - _archiveTestsParameter: /p:ArchiveTests=true - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - - group: DotNet-HelixApi-Access - - - ${{ if ne(job.frameworkArg, '') }}: - - _finalFrameworkArg: ${{ job.frameworkArg }} - - - _args: -configuration $(_BuildConfig) -ci -arch $(_architecture) $(_finalFrameworkArg) $(_archiveTestsParameter) ${{ job.buildExtraArguments }} - - _commonArguments: $(_args) - - # Windows variables - - ${{ if eq(parameters.targetOS, 'Windows_NT') }}: - - _buildScript: $(buildScriptFileName).cmd - - _msbuildCommand: powershell -ExecutionPolicy ByPass -NoProfile eng\common\msbuild.ps1 -warnaserror:0 -ci - - # Non-Windows variables - - ${{ if ne(parameters.targetOS, 'Windows_NT') }}: - - _buildScript: ${{ job.buildScriptPrefix }}./$(buildScriptFileName).sh - - _msbuildCommand: ${{ job.buildScriptPrefix }}./eng/common/msbuild.sh --warnaserror false --ci - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - - _commonArguments: $(_args) -stripSymbols - - # pass along job properties - ${{ each property in job }}: - ${{ if and(ne(property.key, 'job'), ne(property.key, 'variables')) }}: - ${{ property.key }}: ${{ property.value }} - - # enable helix telemetry -- we only send telemetry during official builds - enableTelemetry: ${{ parameters.isOfficialBuild }} - helixRepo: dotnet/corefx - - name: ${{ job.job }} - workspace: - clean: all - - # enabling publish build artifacts, will publish all build logs under /artifacts/log/ - enablePublishBuildArtifacts: true - - ${{ if eq(job.timeoutInMinutes, '') }}: - timeoutInMinutes: 150 - - steps: - - ${{ if ne(job.preBuildSteps[0], '') }}: - - ${{ job.preBuildSteps }} - - - script: $(_buildScript) -restore $(_commonArguments) - displayName: Restore Build Tools - - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - - task: DotNetCoreCLI@2 - displayName: Restore internal tools - condition: and(succeeded(), ne(variables['_skipRestoreInternalTools'], 'true')) - inputs: - command: restore - feedsToUse: config - projects: 'eng/common/internal/Tools.csproj' - nugetConfigPath: 'eng/internal/NuGet.config' - restoreDirectory: '$(Build.SourcesDirectory)\.packages' - verbosityRestore: 'normal' - externalFeedCredentials: 'dotnet-core-internal-tooling' - - - ${{ if eq(job.customBuildSteps[0], '') }}: - - script: $(_buildScript) - -build - -buildtests - $(_commonArguments) - $(_testScopeArg) - $(_msbuildCommonParameters) - displayName: Build Sources and Tests - - - ${{ if ne(job.customBuildSteps[0], '') }}: - - ${{ job.customBuildSteps }} - - - ${{ if eq(job.submitToHelix, 'true') }}: - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - - script: $(_msbuildCommand) $(sourcesRoot)/publishTestAssets.proj - /p:FilesToPublishPattern=$(Build.SourcesDirectory)/artifacts/helix/**/*.zip - /p:AccountKey=$(dotnetfeed-storage-access-key-1) - /p:ExpectedFeedUrl=$(_dotnetFeedUrl) - /p:OSGroup=${{ parameters.targetOS }} - /p:ArchGroup=$(_architecture) - /p:ConfigurationGroup=$(_BuildConfig) - /p:TargetGroup=$(_framework) - /p:OfficialBuildId=$(Build.BuildNumber) - /p:ContinuousIntegrationBuild=true - /p:AssetManifestFileName=corefx-test-assets.xml - /p:ManifestBuildId=$(Build.BuildNumber) - /p:ManifestBuildData=Location=$(_dotnetFeedUrl) - /p:ManifestBranch=$(Build.SourceBranchName) - /p:ManifestCommit=$(Build.SourceVersion) - /p:ManifestRepoUri=$(Build.Repository.Uri) - displayName: Publish test assets to dotnet-core feed - condition: and(succeeded(), eq(variables['_publishTests'], 'true')) - - - task: PublishBuildArtifacts@1 - displayName: Publish test asset manifest to artifacts container - inputs: - pathToPublish: $(Build.SourcesDirectory)/artifacts/TestAssetsManifests - artifactName: $(Agent.Os)_$(Agent.JobName) - artifactType: container - condition: and(succeeded(), eq(variables['_publishTests'], 'true')) - - - template: /eng/pipelines/libraries/helix.yml - parameters: - # send tests to helix only on public builds, official scheduled builds or manual official builds. - condition: eq(${{ parameters.isOfficialBuild }}, False) - targetOS: ${{ parameters.targetOS }} - archGroup: $(_architecture) - configuration: $(_BuildConfig) - helixQueues: $(_helixQueues) - msbuildScript: $(_msbuildCommand) - framework: $(_framework) - testScope: ${{ coalesce(parameters.testScope, 'innerloop') }} # if parameters.testScope is empty use 'innerloop' - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - officialBuildId: $(Build.BuildNumber) - helixToken: $(HelixApiAccessToken) - - ${{ if eq(parameters.isOfficialBuild, 'false') }}: - # TODO: SET Creator to the PR owner whenever Azure DevOps supports a good way to retrieve it. - creator: dotnet-bot - helixToken: '' - - - ${{ if eq(parameters.isOfficialBuild, 'true') }}: - - task: PublishBuildArtifacts@1 - displayName: Publish packages to artifacts container - inputs: - pathToPublish: $(Build.SourcesDirectory)/artifacts/packages - artifactName: packages - artifactType: container - condition: and(succeeded(), ne(variables['_skipPublishPackages'], 'true')) diff --git a/eng/pipelines/libraries/freebsd.yml b/eng/pipelines/libraries/freebsd.yml deleted file mode 100644 index 5c18391311ee61..00000000000000 --- a/eng/pipelines/libraries/freebsd.yml +++ /dev/null @@ -1,34 +0,0 @@ -# FreeBSD leg -parameters: - # Required: value to specify if the job is comming from an official build to run extra steps and sign binaries - # Default: false - isOfficialBuild: false - # Required: value to specify if the full test matrix should be tested - # Default: false - fullMatrix: false - # Optional: value to scope the tests. - # Default: empty - testScope: '' - -jobs: -- template: corefx-base.yml - parameters: - isOfficialBuild: ${{ parameters.isOfficialBuild }} - testScope: ${{ parameters.testScope }} - targetOS: FreeBSD - jobs: - - - job: FreeBSD - strategy: - matrix: - x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netcoreapp - _buildScriptPrefix: 'DotNetCoreSdkDir=/usr/local/dotnet/ DotNetRoot=/usr/local/dotnet/ ' - - pool: - name: dnceng-freebsd-internal - - buildScriptPrefix: $(_buildScriptPrefix) - submitToHelix: false diff --git a/eng/pipelines/libraries/helix-queues-setup.yml b/eng/pipelines/libraries/helix-queues-setup.yml new file mode 100644 index 00000000000000..3c1ea75aec6664 --- /dev/null +++ b/eng/pipelines/libraries/helix-queues-setup.yml @@ -0,0 +1,120 @@ +parameters: + jobTemplate: '' + variables: {} + osGroup: '' + osSubgroup: '' + archType: '' + container: '' + pool: '' + platform: '' + jobParameters: {} + +jobs: +- template: ${{ parameters.jobTemplate }} + parameters: + variables: ${{ parameters.variables }} + osGroup: ${{ parameters.osGroup }} + osSubgroup: ${{ parameters.osSubgroup }} + archType: ${{ parameters.archType }} + container: ${{ parameters.container }} + pool: ${{ parameters.pool }} + helixQueues: + + # Linux arm + - ${{ if eq(parameters.platform, 'Linux_arm') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - \(Debian.9.Arm32.Open\)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm32v7-74c9941-20190620155841 + + # Linux arm64 + - ${{ if eq(parameters.platform, 'Linux_arm64') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - \(Ubuntu.1804.ArmArch.Open\)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-helix-arm64v8-a45aeeb-20190620160300 + + # Linux musl x64 + - ${{ if eq(parameters.platform, 'Linux_musl_x64') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - \(Alpine.310.Amd64.Open\)ubuntu.1604.amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.10-helix-3043688-20190918214010 + - ${{ if eq(parameters.jobParameters.isFullMatrix, false) }}: + - \(Alpine.38.Amd64.Open\)ubuntu.1604.amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.8-helix-09ca40b-20190620184125 + - \(Alpine.39.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.9-helix-09ca40b-20190620184719 + - \(Alpine.310.Amd64.Open\)ubuntu.1604.amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.10-helix-3043688-20190918214010 + + # Linux musl arm64 + - ${{ if eq(parameters.platform, 'Linux_musl_arm64') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - \(Alpine.38.Arm64.Open\)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.8-helix-arm64v8-a45aeeb-20190620184035 + + # Linux rhel6 x64 + - ${{ if eq(parameters.platform, 'Linux_rhel6_x64') }}: + - RedHat.6.Amd64.Open + + # Linux x64 + - ${{ if eq(parameters.platform, 'Linux_x64') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - Centos.7.Amd64.Open + - RedHat.7.Amd64.Open + - Debian.9.Amd64.Open + - Ubuntu.1604.Amd64.Open + - Ubuntu.1804.Amd64.Open + - SLES.12.Amd64.Open + - SLES.15.Amd64.Open + - \(Fedora.29.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-helix-09ca40b-20190508143249 + - \(Ubuntu.1910.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-19.10-helix-amd64-cfcfd50-20191030180623 + - \(Debian.10.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-10-helix-amd64-7c6abd3-20190620155928 + - ${{ if eq(parameters.jobParameters.isFullMatrix, false) }}: + - Centos.7.Amd64.Open + - RedHat.7.Amd64.Open + - Debian.9.Amd64.Open + - Ubuntu.1604.Amd64.Open + - Ubuntu.1804.Amd64.Open + - SLES.15.Amd64.Open + - \(Fedora.29.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-helix-09ca40b-20190508143249 + + # OSX x64 + - ${{ if eq(parameters.platform, 'OSX_x64') }}: + - OSX.1013.Amd64.Open + - OSX.1014.Amd64.Open + + # Windows_NT x64 + - ${{ if eq(parameters.platform, 'Windows_NT_x64') }}: + # netcoreapp + - ${{ if eq(parameters.jobParameters.framework, 'netcoreapp') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - Windows.7.Amd64.Open + - Windows.81.Amd64.Open + - Windows.10.Amd64.ServerRS5.Open + - Windows.10.Amd64.Server19H1.Open + - "`(Windows.Nano.1809.Amd64.Open`)windows.10.amd64.serverrs5.open@mcr.microsoft.com/dotnet-buildtools/prereqs:nanoserver-1809-helix-amd64-61052b7-20190723211353" + - ${{ if eq(parameters.jobParameters.isFullMatrix, false) }}: + - Windows.7.Amd64.Open + - Windows.81.Amd64.Open + - Windows.10.Amd64.Server19H1.ES.Open + - "`(Windows.Nano.1809.Amd64.Open`)windows.10.amd64.serverrs5.open@mcr.microsoft.com/dotnet-buildtools/prereqs:nanoserver-1809-helix-amd64-61052b7-20190723211353" + + # NETFX + - ${{ if eq(parameters.jobParameters.framework, 'netfx') }}: + - Windows.10.Amd64.Client19H1.Open + + # AllConfigurations + - ${{ if eq(parameters.jobParameters.framework, 'allConfigurations') }}: + - Windows.10.Amd64.Server19H1.Open + + # Windows_NT x86 + - ${{ if eq(parameters.platform, 'Windows_NT_x86') }}: + # netcoreapp + - ${{ if eq(parameters.jobParameters.framework, 'netcoreapp') }}: + - ${{ if eq(parameters.jobParameters.isFullMatrix, true) }}: + - Windows.7.Amd64.Open + - Windows.81.Amd64.Open + - Windows.10.Amd64.ServerRS5.Open + - Windows.10.Amd64.Server19H1.Open + - ${{ if eq(parameters.jobParameters.isFullMatrix, false) }}: + - Windows.7.Amd64.Open + - Windows.81.Amd64.Open + - Windows.10.Amd64.Server19H1.ES.Open + + # NETFX + - ${{ if eq(parameters.jobParameters.framework, 'netfx') }}: + - Windows.10.Amd64.Client19H1.Open + + ${{ insert }}: ${{ parameters.jobParameters }} diff --git a/eng/pipelines/libraries/helix.yml b/eng/pipelines/libraries/helix.yml index 8b20f44624de5b..4f5f2d28af3c45 100644 --- a/eng/pipelines/libraries/helix.yml +++ b/eng/pipelines/libraries/helix.yml @@ -4,10 +4,8 @@ parameters: creator: '' framework: '' helixQueues: '' - helixToken: '' msbuildScript: '' targetOS: '' - officialBuildId: '' testScope: 'innerloop' # innerloop | outerloop | all condition: always() @@ -22,9 +20,7 @@ steps: /p:TargetGroup=${{ parameters.framework }} /p:HelixTargetQueues=${{ parameters.helixQueues }} /p:HelixBuild=$(Build.BuildNumber) - /p:HelixAccessToken=${{ parameters.helixToken }} /p:Creator=${{ parameters.creator }} - /p:OfficialBuildId=${{ parameters.officialBuildId }} /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/SendToHelix.binlog displayName: Send to Helix condition: and(succeeded(), ${{ parameters.condition }}) diff --git a/eng/pipelines/libraries/linux.yml b/eng/pipelines/libraries/linux.yml deleted file mode 100644 index 2f58da1b2b66a6..00000000000000 --- a/eng/pipelines/libraries/linux.yml +++ /dev/null @@ -1,195 +0,0 @@ -# Linux legs -parameters: - # Required: value to specify if the job is comming from an official build to run extra steps and sign binaries - # Default: false - isOfficialBuild: false - # Required: value to specify if the full test matrix should be tested - # Default: false - fullMatrix: false - # Optional: value to scope the tests. - # Default: empty - testScope: '' - -stages: -- stage: LinuxStage - displayName: Linux - dependsOn: [] - jobs: - - template: corefx-base.yml - parameters: - isOfficialBuild: ${{ parameters.isOfficialBuild }} - testScope: ${{ parameters.testScope }} - targetOS: Linux - jobs: - - # Legs with Helix testing - - job: LinuxTest - displayName: Build - strategy: - matrix: - # Run RedHat6 in release mode on CI to cover Release configuration differences - RedHat6_x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netcoreapp - _buildScriptPrefix: '' - _buildExtraArguments: /p:RuntimeOS=rhel.6 /p:PortableBuild=false - _dockerContainer: centos6_container - _helixQueues: $(redhatHelixQueue) - _publishTests: ${{ parameters.fullMatrix }} - - ${{ if eq(parameters.fullMatrix, 'false') }}: - x64_Debug: - _BuildConfig: Debug - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(linuxDefaultQueues) - _dockerContainer: centos7_container - _buildScriptPrefix: '' - _buildExtraArguments: '' - - musl_x64_Debug: - _BuildConfig: Debug - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(alpineQueues) - _dockerContainer: alpine_39_container - _buildScriptPrefix: '' - _buildExtraArguments: /p:RuntimeOS=linux-musl - - ${{ if eq(parameters.fullMatrix, 'true') }}: - x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(linuxDefaultQueues) - _dockerContainer: centos7_container - _buildScriptPrefix: '' - _buildExtraArguments: '' - _publishTests: true - - musl_x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(alpineQueues) - _dockerContainer: alpine_39_container - _buildScriptPrefix: '' - _buildExtraArguments: /p:RuntimeOS=linux-musl - _publishTests: true - - arm_Release: - _BuildConfig: Release - _architecture: arm - _framework: netcoreapp - _helixQueues: $(linuxArmQueues) - _dockerContainer: ubuntu_1604_arm_cross_container - _buildScriptPrefix: 'ROOTFS_DIR=/crossrootfs/arm ' - _buildExtraArguments: -warnAsError false - _publishTests: true - - musl_arm64_Release: - _BuildConfig: Release - _architecture: arm64 - _framework: netcoreapp - _helixQueues: $(alpineArm64Queues) - _dockerContainer: alpine_37_arm64_container - _buildScriptPrefix: 'ROOTFS_DIR=/crossrootfs/arm64 ' - _buildExtraArguments: -warnAsError false /p:RuntimeOS=linux-musl - _publishTests: true - - arm64_Release: - _BuildConfig: Release - _architecture: arm64 - _framework: netcoreapp - _helixQueues: $(linuxArm64Queues) - _dockerContainer: ubuntu_1604_arm64_cross_container - _buildScriptPrefix: 'ROOTFS_DIR=/crossrootfs/arm64 ' - _buildExtraArguments: -warnAsError false - _publishTests: true - - pool: - name: Hosted Ubuntu 1604 - - container: $[ variables['_dockerContainer'] ] - buildScriptPrefix: $(_buildScriptPrefix) - buildExtraArguments: $(_buildExtraArguments) - - submitToHelix: true - # Temporary till we reduced workloads on ARM64 - timeoutInMinutes: 240 - - variables: - - redhatHelixQueue: RedHat.6.Amd64.Open - - - ${{ if eq(parameters.fullMatrix, 'false') }}: - - linuxDefaultQueues: Centos.7.Amd64.Open+RedHat.7.Amd64.Open+Debian.9.Amd64.Open+Ubuntu.1604.Amd64.Open+Ubuntu.1804.Amd64.Open+SLES.15.Amd64.Open+\(Fedora.29.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-helix-09ca40b-20190508143249 - - alpineQueues: \(Alpine.310.Amd64.Open\)ubuntu.1604.amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.10-helix-3043688-20190918214010 - - - ${{ if eq(parameters.fullMatrix, 'true') }}: - - linuxDefaultQueues: Centos.7.Amd64.Open+RedHat.7.Amd64.Open+Debian.9.Amd64.Open+Ubuntu.1604.Amd64.Open+Ubuntu.1804.Amd64.Open+SLES.12.Amd64.Open+SLES.15.Amd64.Open+\(Fedora.29.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:fedora-29-helix-09ca40b-20190508143249+\(Ubuntu.1910.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-19.10-helix-amd64-cfcfd50-20191030180623+\(Debian.10.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-10-helix-amd64-7c6abd3-20190620155928 - - linuxArmQueues: \(Debian.9.Arm32.Open\)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:debian-9-helix-arm32v7-74c9941-20190620155841 - - alpineQueues: \(Alpine.38.Amd64.Open\)ubuntu.1604.amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.8-helix-09ca40b-20190620184125+\(Alpine.39.Amd64.Open\)ubuntu.1604.amd64.open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.9-helix-09ca40b-20190620184719+\(Alpine.310.Amd64.Open\)ubuntu.1604.amd64.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.10-helix-3043688-20190918214010 - - alpineArm64Queues: \(Alpine.38.Arm64.Open\)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.8-helix-arm64v8-a45aeeb-20190620184035 - - linuxArm64Queues: \(Ubuntu.1804.ArmArch.Open\)Ubuntu.1804.ArmArch.Open@mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-helix-arm64v8-a45aeeb-20190620160300 - - # Legs without helix testing - # Don't run these legs in outerloop builds - - ${{ if and(ne(parameters.testScope, 'outerloop'), ne(parameters.testScope, 'all')) }}: - - job: LinuxNoTest - displayName: Build - strategy: - matrix: - wasm_Release: - _BuildConfig: Release - _architecture: wasm - _framework: netcoreapp - _dockerContainer: ubuntu_1604 - _emsdkPath: $(Build.BinariesDirectory)/emsdk - _buildScriptPrefix: 'EMSDK_PATH=$(_emsdkPath) ' - _buildExtraArguments: -os WebAssembly -warnAsError false - _installEmscripten: true - - # Only run these legs in PRs. - ${{ if eq(parameters.fullMatrix, 'false') }}: - arm_Debug: - _BuildConfig: Debug - _architecture: arm - _framework: netcoreapp - _buildExtraArguments: /p:RuntimeOS=ubuntu.16.04 -warnAsError false - _buildScriptPrefix: 'ROOTFS_DIR=/crossrootfs/arm ' - _dockerContainer: ubuntu_1604_arm_cross_container - - musl_arm64_Debug: - _BuildConfig: Debug - _architecture: arm64 - _framework: netcoreapp - _dockerContainer: alpine_37_arm64_container - _buildScriptPrefix: 'ROOTFS_DIR=/crossrootfs/arm64 ' - _buildExtraArguments: -warnAsError false /p:RuntimeOS=linux-musl - - arm64_Debug: - _BuildConfig: Debug - _architecture: arm64 - _framework: netcoreapp - _dockerContainer: ubuntu_1604_arm64_cross_container - _buildScriptPrefix: 'ROOTFS_DIR=/crossrootfs/arm64 ' - _buildExtraArguments: --warnAsError false - - preBuildSteps: - - script: | - EMSCRIPTEN_VERSION=1.38.47 - git clone https://github.com/emscripten-core/emsdk.git $(_emsdkPath) - cd $(_emsdkPath) - ./emsdk install ${EMSCRIPTEN_VERSION}-upstream - ./emsdk activate --embedded ${EMSCRIPTEN_VERSION}-upstream - displayName: Install Emscripten - condition: and(succeeded(), eq(variables['_installEmscripten'], 'true')) - - pool: - name: Hosted Ubuntu 1604 - - container: $[ variables['_dockerContainer'] ] - buildExtraArguments: $(_buildExtraArguments) - buildScriptPrefix: $(_buildScriptPrefix) - submitToHelix: false diff --git a/eng/pipelines/libraries/macos.yml b/eng/pipelines/libraries/macos.yml deleted file mode 100644 index 6f78bd00c4350e..00000000000000 --- a/eng/pipelines/libraries/macos.yml +++ /dev/null @@ -1,59 +0,0 @@ -# macOS legs -parameters: - # Required: value to specify if the job is comming from an official build to run extra steps and sign binaries - # Default: false - isOfficialBuild: false - # Required: value to specify if the full test matrix should be tested - # Default: false - fullMatrix: false - # Optional: value to scope the tests. - # Default: empty - testScope: '' - -stages: -- stage: MacOSStage - displayName: MacOS - dependsOn: [] - jobs: - - template: corefx-base.yml - parameters: - isOfficialBuild: ${{ parameters.isOfficialBuild }} - testScope: ${{ parameters.testScope }} - targetOS: OSX - jobs: - - # Legs with Helix testing - - job: MacOS - displayName: Build - strategy: - matrix: - ${{ if eq(parameters.fullMatrix, 'false') }}: - x64_Debug: - _BuildConfig: Debug - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(macOSQueues) - - ${{ if eq(parameters.fullMatrix, 'true') }}: - x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(macOSQueues) - _publishTests: true - - pool: - name: Hosted macOS - - preBuildSteps: - - script: | - brew install pkgconfig openssl - ln -s /usr/local/opt/openssl/lib/pkgconfig/libcrypto.pc /usr/local/lib/pkgconfig/ - ln -s /usr/local/opt/openssl/lib/pkgconfig/libssl.pc /usr/local/lib/pkgconfig/ - ln -s /usr/local/opt/openssl/lib/pkgconfig/openssl.pc /usr/local/lib/pkgconfig/ - displayName: Install Build Dependencies - - submitToHelix: true - - variables: - - macOSQueues: OSX.1013.Amd64.Open+OSX.1014.Amd64.Open diff --git a/eng/pipelines/libraries/outerloop.yml b/eng/pipelines/libraries/outerloop.yml index 3359fd16743bdf..c04696f1c8bb77 100644 --- a/eng/pipelines/libraries/outerloop.yml +++ b/eng/pipelines/libraries/outerloop.yml @@ -6,52 +6,75 @@ schedules: branches: include: - master - - release/3.0 - -resources: - containers: - - container: centos7_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-7-f39df28-20191023143754 - - - container: centos6_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-6-f39df28-20191023143802 - - - container: alpine_39_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.9-WithNode-0fc54a3-20190918214015 - - - container: alpine_37_arm64_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-alpine-406629a-20191023143847 - - - container: ubuntu_1604_arm64_cross_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-arm64-cfdd435-20191023143847 - - - container: ubuntu_1604_arm_cross_container - image: mcr.microsoft.com/dotnet-buildtools/prereqs:ubuntu-16.04-cross-14.04-23cacb0-20191023143847 + - release/*.* variables: - template: variables.yml -stages: - # Windows outerloop legs - - ${{ if or(endsWith(variables['Build.DefinitionName'], 'windows'), endsWith(variables['Build.DefinitionName'], 'outerloop')) }}: - - template: windows.yml - parameters: - isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} - testScope: outerloop +jobs: + - template: /eng/pipelines/common/checkout-job.yml - # Linux outerloop legs - - ${{ if or(endsWith(variables['Build.DefinitionName'], 'linux'), endsWith(variables['Build.DefinitionName'], 'outerloop')) }}: - - template: linux.yml - parameters: - isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} + - template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/libraries/build-job.yml + buildConfig: Release + platforms: + - ${{ if eq(variables['includeWindowsOuterloop'], true) }}: + - Windows_NT_x86 + - ${{ if eq(variables['isFullMatrix'], true) }}: + - Windows_NT_x64 + - ${{ if eq(variables['includeLinuxOuterloop'], true) }}: + - Linux_rhel6_x64 + - ${{ if eq(variables['isFullMatrix'], true) }}: + - Linux_x64 + - Linux_arm + - Linux_arm64 + - Linux_musl_x64 + - Linux_musl_arm64 + - ${{ if and(eq(variables['includeOsxOuterloop'], true), eq(variables['isFullMatrix'], true)) }}: + - OSX_x64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + isFullMatrix: ${{ variables['isFullMatrix'] }} + framework: netcoreapp + runTests: true testScope: outerloop + + - ${{ if eq(variables['isFullMatrix'], false) }}: + - template: /eng/pipelines/common/platform-matrix.yml + parameters: + jobTemplate: /eng/pipelines/libraries/build-job.yml + buildConfig: Debug + platforms: + - ${{ if eq(variables['includeWindowsOuterloop'], true) }}: + - Windows_NT_x86 + - ${{ if eq(variables['includeLinuxOuterloop'], true) }}: + - Linux_x64 + - Linux_musl_x64 + - ${{ if eq(variables['includeOsxOuterloop'], true) }}: + - OSX_x64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + isFullMatrix: ${{ variables['isFullMatrix'] }} + framework: netcoreapp + runTests: true + testScope: outerloop - # MacOS outerloop legs - - ${{ if or(endsWith(variables['Build.DefinitionName'], 'osx'), endsWith(variables['Build.DefinitionName'], 'outerloop')) }}: - - template: macos.yml + - ${{ if eq(variables['includeWindowsOuterloop'], true) }}: + - template: /eng/pipelines/common/platform-matrix.yml parameters: - isOfficialBuild: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} - fullMatrix: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} - testScope: outerloop + jobTemplate: /eng/pipelines/libraries/build-job.yml + buildConfig: Release + platforms: + - Windows_NT_x86 + - ${{ if eq(variables['isFullMatrix'], true) }}: + - Windows_NT_x64 + helixQueuesTemplate: /eng/pipelines/libraries/helix-queues-setup.yml + jobParameters: + isOfficialBuild: ${{ variables['isOfficialBuild'] }} + isFullMatrix: ${{ variables['isFullMatrix'] }} + framework: netfx + runTests: true + testScope: outerloop \ No newline at end of file diff --git a/eng/pipelines/libraries/pre-publish.yml b/eng/pipelines/libraries/pre-publish.yml deleted file mode 100644 index 71752ad206fe78..00000000000000 --- a/eng/pipelines/libraries/pre-publish.yml +++ /dev/null @@ -1,88 +0,0 @@ -parameters: - buildConfiguration: Release - dependsOn: [] - -stages: -- stage: PrePublish - displayName: Pre-publish - dependsOn: ${{ parameters.dependsOn }} - jobs: - - template: /eng/common/templates/jobs/jobs.yml - parameters: - enableMicrobuild: true - enablePublishUsingPipelines: $(_PublishUsingPipelines) - enablePublishBuildAssets: true - enablePublishBuildArtifacts: true - jobs: - - job: SignAndPrepare - displayName: Sign and prepare to publish - timeoutInMinutes: 160 - - pool: - name: NetCoreInternal-Pool - queue: buildpool.windows.10.amd64.vs2017 - - workspace: - clean: all - - variables: - - group: DotNet-Versions-Publish - - _artifactsDir: $(Build.SourcesDirectory)/artifacts - - _TeamName: DotNetCore - - _SignType: real - - _BuildConfig: ${{ parameters.buildConfiguration }} - - steps: - - powershell: | - $prefix = "refs/heads/" - $branch = "$(Build.SourceBranch)" - $branchName = $branch - if ($branchName.StartsWith($prefix)) - { - $branchName = $branchName.Substring($prefix.Length) - } - Write-Host "For Build.SourceBranch $branch, FullBranchName is $branchName" - Write-Host "##vso[task.setvariable variable=FullBranchName;]$branchName" - displayName: Find true SourceBranchName - - - task: DownloadBuildArtifacts@0 - displayName: Download packages to publish - inputs: - artifactName: packages - downloadPath: $(_artifactsDir) - - - script: $(buildScriptFileName).cmd - -restore - -ci - displayName: Restore tools - - - script: $(buildScriptFileName).cmd - -sign - -ci - -configuration $(_BuildConfig) - /p:DotNetSignType=$(_SignType) - /p:OfficialBuildId=$(Build.BuildNumber) - displayName: Sign packages - - - script: $(buildScriptFileName).cmd - -publish - -ci - -configuration $(_BuildConfig) - /p:DotNetPublishUsingPipelines=$(_PublishUsingPipelines) - /p:DotNetArtifactsCategory=$(_DotNetArtifactsCategory) - /p:DotNetPublishBlobFeedUrl=$(_dotnetFeedUrl) - /p:DotNetPublishToBlobFeed=true - /p:DotNetPublishBlobFeedKey=$(dotnetfeed-storage-access-key-1) - /p:OfficialBuildId=$(Build.BuildNumber) - /bl:$(Build.SourcesDirectory)/artifacts/log/$(_BuildConfig)/PublishToArtifacts.binlog - displayName: Publish to artifacts and produce manifest - - - script: powershell -ExecutionPolicy ByPass -NoProfile eng\common\msbuild.ps1 $(sourcesRoot)/build.proj - -warnaserror:0 -ci - /t:UpdatePublishedVersions - /p:GitHubAuthToken=$(AccessToken-dotnet-build-bot-public-repo) - /p:VersionsRepoOwner=dotnet - /p:VersionsRepo=versions - /p:VersionsRepoPath=build-info/dotnet/corefx/$(FullBranchName) - /p:ShippedNuGetPackageGlobPath=$(_artifactsDir)/packages/**/*.nupkg - displayName: Update dotnet/versions diff --git a/eng/pipelines/libraries/run-test-job.yml b/eng/pipelines/libraries/run-test-job.yml new file mode 100644 index 00000000000000..d7b316af4e9555 --- /dev/null +++ b/eng/pipelines/libraries/run-test-job.yml @@ -0,0 +1,64 @@ +parameters: + buildConfig: '' + osGroup: '' + osSubgroup: '' + archType: '' + framework: netcoreapp + isOfficialBuild: false + timeoutInMinutes: 150 + pool: '' + testScope: '' + helixQueues: [] + dependsOnBuildConfiguration: Debug + variables: {} + +jobs: + - template: /eng/pipelines/libraries/base-job.yml + parameters: + buildConfig: ${{ parameters.buildConfig }} + osGroup: ${{ parameters.osGroup }} + osSubgroup: ${{ parameters.osSubgroup }} + archType: ${{ parameters.archType }} + framework: ${{ parameters.framework }} + isOfficialBuild: ${{ parameters.isOfficialBuild }} + timeoutInMinutes: ${{ parameters.timeoutInMinutes }} + container: '' # we just send to helix, no need to use a container. + pool: ${{ parameters.pool }} + stepName: Run + + dependsOn: + - ${{ format('libraries_Build_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + - ${{ format('libraries_Test_{0}_{1}_x64_{2}', parameters.framework, parameters.osGroup, parameters.dependsOnBuildConfiguration) }} + + variables: + - _archiveTestsParameter: /p:ArchiveTests=true + - _skipTestRestoreArg: /p:SkipTestRestore=false + - ${{ parameters.variables }} + + steps: + - template: /eng/pipelines/common/download-artifact-step.yml + parameters: + displayName: Build Assets + artifactName: ${{ format('libraries_bin_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }} + artifactFileName: ${{ format('libraries_bin_{0}_{1}{2}_{3}_{4}', parameters.framework, parameters.osGroup, parameters.osSubgroup, parameters.archType, parameters.buildConfig) }}$(archiveExtension) + unpackFolder: $(Build.SourcesDirectory)/artifacts + + - template: /eng/pipelines/common/download-artifact-step.yml + parameters: + displayName: Test Assets + cleanUnpackFolder: false + unpackFolder: $(Build.SourcesDirectory)/artifacts + artifactName: ${{ format('libraries_test_assets_{0}_{1}_x64_{2}', parameters.framework, parameters.osGroup, parameters.dependsOnBuildConfiguration) }} + artifactFileName: ${{ format('libraries_test_assets_{0}_{1}_x64_{2}', parameters.framework, parameters.osGroup, parameters.dependsOnBuildConfiguration) }}$(archiveExtension) + + - template: /eng/pipelines/libraries/helix.yml + parameters: + targetOS: ${{ parameters.osGroup }} + archGroup: ${{ parameters.archType }} + configuration: ${{ parameters.buildConfig }} + helixQueues: ${{ join('+', parameters.helixQueues) }} + msbuildScript: $(_msbuildCommand) + framework: ${{ parameters.framework }} + testScope: ${{ parameters.testScope }} + creator: dotnet-bot + helixToken: '' \ No newline at end of file diff --git a/eng/pipelines/libraries/variables.yml b/eng/pipelines/libraries/variables.yml index 2e0cf9f6da83f0..ca932a8fe9f180 100644 --- a/eng/pipelines/libraries/variables.yml +++ b/eng/pipelines/libraries/variables.yml @@ -5,3 +5,13 @@ variables: value: $(Build.SourcesDirectory)/src/libraries - name: pipelinesPath value: /eng/pipelines/libraries + - name: isOfficialBuild + value: ${{ and(ne(variables['System.TeamProject'], 'public'), notIn(variables['Build.Reason'], 'PullRequest')) }} + - name: isFullMatrix + value: ${{ notIn(variables['Build.Reason'], 'PullRequest') }} + - name: includeWindowsOuterloop + value: ${{ or(endsWith(variables['Build.DefinitionName'], 'windows'), endsWith(variables['Build.DefinitionName'], 'outerloop')) }} + - name: includeLinuxOuterloop + value: ${{ or(endsWith(variables['Build.DefinitionName'], 'linux'), endsWith(variables['Build.DefinitionName'], 'outerloop')) }} + - name: includeOsxOuterloop + value: ${{ or(endsWith(variables['Build.DefinitionName'], 'osx'), endsWith(variables['Build.DefinitionName'], 'outerloop')) }} diff --git a/eng/pipelines/libraries/windows.yml b/eng/pipelines/libraries/windows.yml deleted file mode 100644 index c1825eaacad667..00000000000000 --- a/eng/pipelines/libraries/windows.yml +++ /dev/null @@ -1,162 +0,0 @@ -# Windows legs -parameters: - # Required: value to specify if the job is comming from an official build to run extra steps and sign binaries - # Default: false - isOfficialBuild: false - # Required: value to specify if the full test matrix should be tested - # Default: false - fullMatrix: false - # Optional: value to scope the tests. - # Default: empty - testScope: '' - -stages: -- stage: WindowsStage - displayName: Windows - dependsOn: [] - jobs: - - - template: corefx-base.yml - parameters: - isOfficialBuild: ${{ parameters.isOfficialBuild }} - testScope: ${{ parameters.testScope }} - targetOS: Windows_NT - jobs: - - # Legs with Helix testing - - job: WindowsTest - displayName: Build - strategy: - matrix: - # PR CI Matrix - ${{ if eq(parameters.fullMatrix, 'false') }}: - x64_Debug: - _BuildConfig: Debug - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(netcoreappWindowsQueues)+$(nanoQueues) - - x86_Release: - _BuildConfig: Release - _architecture: x86 - _framework: netcoreapp - _helixQueues: $(netcoreappWindowsQueues) - - NETFX_x86_Release: - _BuildConfig: Release - _architecture: x86 - _framework: netfx - _helixQueues: $(netFxQueues) - - # Full test matrix - ${{ if eq(parameters.fullMatrix, 'true') }}: - x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netcoreapp - _helixQueues: $(netcoreappWindowsQueues)+$(nanoQueues) - _publishTests: true - - x86_Release: - _BuildConfig: Release - _architecture: x86 - _framework: netcoreapp - _helixQueues: $(netcoreappWindowsQueues) - _publishTests: true - - NETFX_x86_Release: - _BuildConfig: Release - _architecture: x86 - _framework: netfx - _helixQueues: $(netFxQueues) - _skipPublishPackages: true # In NETFX leg we don't produce packages - - NETFX_x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: netfx - _helixQueues: $(netFxQueues) - _skipPublishPackages: true # In NETFX leg we don't produce packages - - pool: - name: Hosted VS2017 - - submitToHelix: true - buildExtraArguments: /p:RuntimeOS=win10 - - variables: - - nanoQueues: "`(Windows.Nano.1809.Amd64.Open`)windows.10.amd64.serverrs5.open@mcr.microsoft.com/dotnet-buildtools/prereqs:nanoserver-1809-helix-amd64-61052b7-20190723211353" - - netFxQueues: Windows.10.Amd64.Client19H1.Open - - - ${{ if eq(parameters.fullMatrix, 'false') }}: - - netcoreappWindowsQueues: Windows.7.Amd64.Open+Windows.81.Amd64.Open+Windows.10.Amd64.Server19H1.ES.Open - - - ${{ if eq(parameters.fullMatrix, 'true') }}: - - netcoreappWindowsQueues: Windows.7.Amd64.Open+Windows.81.Amd64.Open+Windows.10.Amd64.ServerRS5.Open+Windows.10.Amd64.Server19H1.Open - - # There is no point of running legs without outerloop tests, when in an outerloop build. - - ${{ if and(ne(parameters.testScope, 'outerloop'), ne(parameters.testScope, 'all')) }}: - # Packaging all configurations - - job: AllConfigurations - displayName: Packaging All Configurations - strategy: - matrix: - ${{ if eq(parameters.fullMatrix, 'false') }}: - x64_Debug: - _BuildConfig: Debug - _architecture: x64 - _framework: allConfigurations - _helixQueues: $(allConfigurationsQueues) - - ${{ if eq(parameters.fullMatrix, 'true') }}: - x64_Release: - _BuildConfig: Release - _architecture: x64 - _framework: allConfigurations - _helixQueues: $(allConfigurationsQueues) - - pool: - name: Hosted VS2017 - - submitToHelix: true - buildExtraArguments: /p:RuntimeOS=win10 - - variables: - - allConfigurationsQueues: Windows.10.Amd64.Server19H1.Open - - frameworkArg: -allConfigurations - customBuildSteps: - - script: $(buildScriptFileName).cmd - -build - -configuration $(_BuildConfig) - -ci - -buildtests - -allconfigurations - -arch $(_architecture) - /p:RuntimeOS=win10 - /p:ArchiveTests=true - $(_msbuildCommonParameters) - displayName: Build Packages and Tests - - # Legs without HELIX testing - - ${{ if eq(parameters.fullMatrix, 'true') }}: - - job: WindowsNoTest - displayName: Build - strategy: - matrix: - arm_Release: - _BuildConfig: Release - _architecture: arm - _framework: netcoreapp - - arm64_Release: - _BuildConfig: Release - _architecture: arm64 - _framework: netcoreapp - _publishTests: true - - pool: - name: Hosted VS2017 - - submitToHelix: false - buildExtraArguments: /p:RuntimeOS=win10 diff --git a/eng/referenceAssemblies.props b/eng/referenceAssemblies.props index ba1e667fb4e2dd..dbb4b62aabc571 100644 --- a/eng/referenceAssemblies.props +++ b/eng/referenceAssemblies.props @@ -3,13 +3,13 @@ true - $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', 'ref')) + $([MSBuild]::NormalizeDirectory('$(ArtifactsBinDir)', '$(MSBuildProjectName)')) - $([MSBuild]::NormalizeDirectory('$(ReferenceAssemblyOutputPath)', '$(MSBuildProjectName)')) + $([MSBuild]::NormalizeDirectory('$(ReferenceAssemblyOutputPath)', 'ref')) $(BaseOutputPath)$(Configuration) - $([MSBuild]::NormalizeDirectory('$(ArtifactsObjDir)', 'ref', '$(MSBuildProjectName)')) + $([MSBuild]::NormalizeDirectory('$(ArtifactsObjDir)', '$(MSBuildProjectName)', 'ref')) $(BaseIntermediateOutputPath)$(Configuration) diff --git a/src/libraries/publishTestAssets.proj b/src/libraries/publishTestAssets.proj deleted file mode 100644 index eae1362f1bc7c0..00000000000000 --- a/src/libraries/publishTestAssets.proj +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - $([MSBuild]::NormalizeDirectory('$(ArtifactsDir)', 'TestAssetsManifests')) - $(AssetManifestDir)$(AssetManifestFileName) - - - - - - - - - <_TestAssetVersion>$(PackageVersion)-$(VersionSuffix) - <_FileRelativePathBase>corefx-tests/$(_TestAssetVersion)/$(OSGroup).$(ArchGroup)/$(TargetGroup)/ - - - - <_ItemsToPush Remove="@(_ItemsToPush)" /> - <_ItemsToPush Include="$(FilesToPublishPattern)" /> - <_ItemsToPush> - $(_FileRelativePathBase)$([System.String]::Copy('%(RecursiveDir)%(Filename)%(Extension)').Replace('\' ,'/')) - - - - - - - - - <_ManifestToPush Remove="@(_ManifestToPush)" /> - <_ManifestToPush Include="$(AssetManifestFilePath)"> - $(_FileRelativePathBase)$(AssetManifestFileName) - - - - - - - - diff --git a/src/libraries/tests.proj b/src/libraries/tests.proj index c65ae3d5841aa6..c525db6c7bd1f2 100644 --- a/src/libraries/tests.proj +++ b/src/libraries/tests.proj @@ -10,8 +10,9 @@ - + +