merge (#7)
merge Co-authored-by: Pranav K <prkrishn@hotmail.com> Co-authored-by: null <dotnet-maestro-bot@microsoft.com> Co-authored-by: Justin Kotalik <jukotali@microsoft.com> Co-authored-by: Arthur Vickers <ajcvickers@hotmail.com> Co-authored-by: Nate McMaster <natemcmaster@users.noreply.github.com> Co-authored-by: Doug Bunting <6431421+dougbu@users.noreply.github.com> Co-authored-by: Balint Farkas <balint.farkas@windowslive.com> Co-authored-by: Mikael Mengistu <mikaelm12@users.noreply.github.com> Co-authored-by: Brennan <brecon@microsoft.com> Co-authored-by: Chris Ross <Tratcher@Outlook.com> Co-authored-by: Kahbazi <A.Kahbazi@gmail.com> Co-authored-by: Hao Kung <HaoK@users.noreply.github.com> Co-authored-by: Javier Calvarro Nelson <jacalvar@microsoft.com> Co-authored-by: David Fowler <davidfowl@gmail.com> Co-authored-by: Stephen Halter <halter73@gmail.com> Co-authored-by: Ryan Brandenburg <rybrande@microsoft.com> Co-authored-by: John Luo <johluo@microsoft.com> Co-authored-by: Steve Sanderson <SteveSandersonMS@users.noreply.github.com> Co-authored-by: Ajay Bhargav Baaskaran <ajaybhargavb@gmail.com> Co-authored-by: Andrew Stanton-Nurse <andrew@stanton-nurse.com> Co-authored-by: null <42748379+dotnet-maestro[bot]@users.noreply.github.com> Co-authored-by: Jacques Eloff <joeloff@users.noreply.github.com> Co-authored-by: Dylan Dmitri Gray <d.dylan.g@gmail.com> Co-authored-by: Ryan Nowak <rynowak@microsoft.com> Co-authored-by: Alessio Franceschelli <alessio@franceschelli.me> Co-authored-by: Loïc Sharma <sharma.loic@gmail.com> Co-authored-by: Arthur Irgashev <arthur.irgashev@gmail.com> Co-authored-by: Kevin Pilch <kevinpi@microsoft.com> Co-authored-by: dudu <dudu@cnblogs.com> Co-authored-by: Fabien Barbier <8518235+GoldenCrystal@users.noreply.github.com>
This commit is contained in:
commit
cefeb6ba00
|
|
@ -25,7 +25,7 @@ variables:
|
|||
- ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- name: _BuildArgs
|
||||
value: /p:TeamName=$(_TeamName)
|
||||
/p:OfficialBuildId=$(Build.BuildNumber)
|
||||
/p:OfficialBuildId=$(Build.BuildNumber)
|
||||
- ${{ if or(eq(variables['System.TeamProject'], 'public'), in(variables['Build.Reason'], 'PullRequest')) }}:
|
||||
- name: _BuildArgs
|
||||
value: ''
|
||||
|
|
@ -58,10 +58,12 @@ jobs:
|
|||
# if they have already been signed. This results in slower builds due to re-submitting the same .nupkg many times for signing.
|
||||
# The sign settings have been configured to
|
||||
|
||||
- script: ./eng/scripts/cibuild.cmd
|
||||
- script: ./build.cmd
|
||||
-ci
|
||||
-arch x64
|
||||
-BuildNative
|
||||
/p:DisableCodeSigning=true
|
||||
-pack
|
||||
-all
|
||||
-buildNative
|
||||
/bl:artifacts/log/build.x64.binlog
|
||||
$(_BuildArgs)
|
||||
displayName: Build x64
|
||||
|
|
@ -69,64 +71,46 @@ jobs:
|
|||
# This is going to actually build x86 native assets. See https://github.com/aspnet/AspNetCore/issues/7196
|
||||
|
||||
# Build the x86 shared framework
|
||||
# Set DisableSignCheck because we'll run sign check in an explicit step after installers build
|
||||
- script: ./eng/scripts/cibuild.cmd
|
||||
- script: ./build.cmd
|
||||
-ci
|
||||
-arch x86
|
||||
-NoRestore
|
||||
-BuildNative
|
||||
/t:BuildSharedFx
|
||||
-pack
|
||||
-all
|
||||
-buildNative
|
||||
-noBuildJava
|
||||
/p:OnlyPackPlatformSpecificPackages=true
|
||||
/p:DisableCodeSigning=true
|
||||
/bl:artifacts/log/build.x86.binlog
|
||||
$(_BuildArgs)
|
||||
displayName: Build x86
|
||||
|
||||
# This is in a separate build step with -forceCoreMsbuild to workaround MAX_PATH limitations - https://github.com/Microsoft/msbuild/issues/53
|
||||
- script: ./build.cmd
|
||||
- script: .\src\SiteExtensions\build.cmd
|
||||
-ci
|
||||
-sign
|
||||
-forceCoreMsbuild
|
||||
/p:DisableCodeSigning=true
|
||||
-projects ./src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj
|
||||
-pack
|
||||
-noBuildDeps
|
||||
$(_BuildArgs)
|
||||
displayName: Build SiteExtension
|
||||
|
||||
# Remove all task build output
|
||||
- script: rmdir /s /q build\tasks\bin
|
||||
displayName: Clear task build output
|
||||
|
||||
# This runs code-signing on all packages, zips, and jar files as defined in build/CodeSign.targets. If https://github.com/dotnet/arcade/issues/1957 is resolved,
|
||||
# consider running code-signing inline with the other previous steps.
|
||||
# Sign check is disabled because it is run in a separate step below, after installers are built.
|
||||
- script: ./build.cmd
|
||||
-ci
|
||||
-noBuild
|
||||
-noRestore
|
||||
-sign
|
||||
-NoRestore
|
||||
/t:CodeSign
|
||||
/p:SignType=$(_SignType)
|
||||
/p:DisableSignCheck=true
|
||||
/bl:artifacts/log/build.codesign.binlog
|
||||
$(_BuildArgs)
|
||||
displayName: Code sign packages
|
||||
|
||||
# Windows installers bundle both x86 and x64 assets
|
||||
- powershell: ./src/Installers/Windows/build.ps1
|
||||
-ci
|
||||
/p:SignType=$(_SignType)
|
||||
$(_BuildArgs)
|
||||
displayName: Build Installers
|
||||
|
||||
# Run sign check to verify everything was code signed.
|
||||
- script: ./build.cmd
|
||||
-ci
|
||||
-sign
|
||||
-NoRestore
|
||||
/t:SignCheck
|
||||
/p:SignType=$(_SignType)
|
||||
/bl:artifacts/log/build.signcheck.binlog
|
||||
$(_BuildArgs)
|
||||
displayName: Run sign check
|
||||
condition: and(succeeded(), eq(variables['_SignType'], 'real'))
|
||||
-ci
|
||||
-sign
|
||||
-buildInstallers
|
||||
/bl:artifacts/log/installers.msbuild.binlog
|
||||
$(_BuildArgs)
|
||||
displayName: Build Installers
|
||||
|
||||
artifacts:
|
||||
- name: Windows_Logs
|
||||
|
|
@ -150,12 +134,13 @@ jobs:
|
|||
jobName: Windows_arm_build
|
||||
jobDisplayName: "Build: Windows ARM"
|
||||
agentOs: Windows
|
||||
buildScript: ./eng/scripts/cibuild.cmd
|
||||
buildArgs: -arch arm
|
||||
-NoBuildNodeJS
|
||||
-NoBuildJava
|
||||
buildArgs:
|
||||
-arch arm
|
||||
-sign
|
||||
-pack
|
||||
-noBuildNodeJS
|
||||
-noBuildJava
|
||||
/p:OnlyPackPlatformSpecificPackages=true
|
||||
/p:SignType=$(_SignType)
|
||||
/bl:artifacts/log/build.win-arm.binlog
|
||||
$(_BuildArgs)
|
||||
installNodeJs: false
|
||||
|
|
@ -177,8 +162,10 @@ jobs:
|
|||
jobName: MacOs_x64_build
|
||||
jobDisplayName: "Build: macOS"
|
||||
agentOs: macOs
|
||||
buildScript: ./eng/scripts/cibuild.sh
|
||||
buildArgs: --no-build-nodejs
|
||||
buildArgs:
|
||||
--pack
|
||||
--all
|
||||
--no-build-nodejs
|
||||
--no-build-java
|
||||
-p:OnlyPackPlatformSpecificPackages=true
|
||||
-bl:artifacts/log/build.macos.binlog
|
||||
|
|
@ -206,24 +193,24 @@ jobs:
|
|||
agentOs: Linux
|
||||
installNodeJs: false
|
||||
steps:
|
||||
- script: ./eng/scripts/cibuild.sh
|
||||
- script: ./build.sh
|
||||
--ci
|
||||
--arch x64
|
||||
--pack
|
||||
--all
|
||||
--no-build-nodejs
|
||||
--no-build-java
|
||||
-p:OnlyPackPlatformSpecificPackages=true
|
||||
-bl:artifacts/log/build.linux-x64.binlog
|
||||
$(_BuildArgs)
|
||||
displayName: Run cibuild.sh
|
||||
displayName: Run build.sh
|
||||
- script: |
|
||||
rm -rf .dotnet/
|
||||
git clean -xfd src/
|
||||
git clean -xfd src/**/obj/
|
||||
./dockerbuild.sh bionic \
|
||||
--ci --pack --all --no-build-nodejs --no-build-java \
|
||||
--ci \
|
||||
--arch x64 \
|
||||
-e KOREBUILD_SKIP_INSTALL_NETFX=0 \
|
||||
--no-restore \
|
||||
--build-installers \
|
||||
--no-build-deps \
|
||||
-t:BuildSharedFx \
|
||||
-p:OnlyPackPlatformSpecificPackages=true \
|
||||
-p:BuildRuntimeArchive=false \
|
||||
-p:LinuxInstallerType=deb \
|
||||
|
|
@ -231,15 +218,12 @@ jobs:
|
|||
$(_BuildArgs)
|
||||
displayName: Build Debian installers
|
||||
- script: |
|
||||
rm -rf .dotnet/
|
||||
git clean -xfd src/
|
||||
git clean -xfd src/**/obj/
|
||||
./dockerbuild.sh rhel \
|
||||
--ci --pack --all --no-build-nodejs --no-build-java \
|
||||
--ci \
|
||||
--arch x64 \
|
||||
-e KOREBUILD_SKIP_INSTALL_NETFX=0 \
|
||||
--no-restore \
|
||||
--build-installers \
|
||||
--no-build-deps \
|
||||
-t:BuildSharedFx \
|
||||
-p:OnlyPackPlatformSpecificPackages=true \
|
||||
-p:BuildRuntimeArchive=false \
|
||||
-p:LinuxInstallerType=rpm \
|
||||
|
|
@ -266,8 +250,10 @@ jobs:
|
|||
jobName: Linux_arm_build
|
||||
jobDisplayName: "Build: Linux ARM"
|
||||
agentOs: Linux
|
||||
buildScript: ./eng/scripts/cibuild.sh
|
||||
buildArgs: --arch arm
|
||||
buildArgs:
|
||||
--arch arm
|
||||
--pack
|
||||
--all
|
||||
--no-build-nodejs
|
||||
--no-build-java
|
||||
-p:OnlyPackPlatformSpecificPackages=true
|
||||
|
|
@ -294,8 +280,10 @@ jobs:
|
|||
jobName: Linux_arm64_build
|
||||
jobDisplayName: "Build: Linux ARM64"
|
||||
agentOs: Linux
|
||||
buildScript: ./eng/scripts/cibuild.sh
|
||||
buildArgs: --arch arm64
|
||||
buildArgs:
|
||||
--arch arm64
|
||||
--all
|
||||
--pack
|
||||
--no-build-nodejs
|
||||
--no-build-java
|
||||
-p:OnlyPackPlatformSpecificPackages=true
|
||||
|
|
@ -323,12 +311,12 @@ jobs:
|
|||
jobDisplayName: "Build: Linux Musl x64"
|
||||
agentOs: Linux
|
||||
buildScript: ./dockerbuild.sh alpine
|
||||
buildArgs: --ci
|
||||
--pack
|
||||
--all
|
||||
-e KOREBUILD_SKIP_INSTALL_NETFX=0
|
||||
buildArgs:
|
||||
--ci
|
||||
--arch x64
|
||||
--os-name linux-musl
|
||||
--pack
|
||||
--all
|
||||
--no-build-nodejs
|
||||
--no-build-java
|
||||
-p:OnlyPackPlatformSpecificPackages=true
|
||||
|
|
@ -356,12 +344,12 @@ jobs:
|
|||
jobDisplayName: "Build: Linux Musl ARM64"
|
||||
agentOs: Linux
|
||||
buildScript: ./dockerbuild.sh ubuntu-alpine37
|
||||
buildArgs: --ci
|
||||
--pack
|
||||
--all
|
||||
-e KOREBUILD_SKIP_INSTALL_NETFX=0
|
||||
buildArgs:
|
||||
--ci
|
||||
--arch arm64
|
||||
--os-name linux-musl
|
||||
--pack
|
||||
--all
|
||||
--no-build-nodejs
|
||||
--no-build-java
|
||||
-p:OnlyPackPlatformSpecificPackages=true
|
||||
|
|
@ -390,8 +378,7 @@ jobs:
|
|||
jobDisplayName: "Test: Windows Server 2016 x64"
|
||||
agentOs: Windows
|
||||
isTestingJob: true
|
||||
buildScript: ./eng/scripts/cibuild.cmd
|
||||
buildArgs: -test -BuildNative "/p:SkipIISNewHandlerTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false /p:BuildSiteExtensions=false"
|
||||
buildArgs: -all -pack -test -BuildNative "/p:SkipIISNewHandlerTests=true /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISNewShimTests=true /p:RunTemplateTests=false"
|
||||
beforeBuild:
|
||||
- powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1"
|
||||
displayName: Setup IISExpress test certificates and schema
|
||||
|
|
@ -403,6 +390,9 @@ jobs:
|
|||
- name: Windows_Test_Logs
|
||||
path: artifacts/log/
|
||||
publishOnError: true
|
||||
- name: Windows_Test_Results
|
||||
path: artifacts/TestResults/
|
||||
publishOnError: true
|
||||
|
||||
- template: jobs/default-build.yml
|
||||
parameters:
|
||||
|
|
@ -411,15 +401,20 @@ jobs:
|
|||
jobDisplayName: "Test: Templates - Windows Server 2016 x64"
|
||||
agentOs: Windows
|
||||
isTestingJob: true
|
||||
buildScript: ./src/ProjectTemplates/build.cmd
|
||||
buildArgs: -ci -test -NoRestore -NoBuild -NoBuilddeps "/p:RunTemplateTests=true /p:BuildSiteExtensions=false"
|
||||
beforeBuild:
|
||||
- powershell: ./eng/scripts/cibuild.cmd
|
||||
steps:
|
||||
- script: ./build.cmd -ci -all -pack
|
||||
displayName: Build Repo
|
||||
- script: ./src/ProjectTemplates/build.cmd -ci -pack -NoRestore -NoBuilddeps "/p:RunTemplateTests=true /bl:artifacts/log/template.pack.binlog"
|
||||
displayName: Pack Templates
|
||||
- script: ./src/ProjectTemplates/build.cmd -ci -test -NoRestore -NoBuild -NoBuilddeps "/p:RunTemplateTests=true /bl:artifacts/log/template.test.binlog"
|
||||
displayName: Test Templates
|
||||
artifacts:
|
||||
- name: Windows_Test_Templates_Logs
|
||||
path: artifacts/log/
|
||||
publishOnError: true
|
||||
- name: Windows_Test_Templates_Results
|
||||
path: artifacts/TestResults/
|
||||
publishOnError: true
|
||||
|
||||
- template: jobs/default-build.yml
|
||||
parameters:
|
||||
|
|
@ -428,12 +423,15 @@ jobs:
|
|||
jobDisplayName: "Test: macOS 10.13"
|
||||
agentOs: macOs
|
||||
isTestingJob: true
|
||||
buildScript: ./eng/scripts/cibuild.sh
|
||||
buildArgs: --test
|
||||
buildArgs: --all --test "/p:RunTemplateTests=false"
|
||||
beforeBuild:
|
||||
- bash: "./eng/scripts/install-nginx-mac.sh"
|
||||
displayName: Installing Nginx
|
||||
afterBuild:
|
||||
- bash: ./build.sh --ci --pack --no-build --no-restore --no-build-deps "/bl:artifacts/log/packages.pack.binlog"
|
||||
displayName: Pack Packages (for Template tests)
|
||||
- bash: ./src/ProjectTemplates/build.sh --ci --pack --no-restore --no-build-deps "/bl:artifacts/log/template.pack.binlog"
|
||||
displayName: Pack Templates (for Template tests)
|
||||
- bash: ./build.sh --no-build --ci --test -p:RunFlakyTests=true
|
||||
displayName: Run Flaky Tests
|
||||
continueOnError: true
|
||||
|
|
@ -441,6 +439,9 @@ jobs:
|
|||
- name: MacOS_Test_Logs
|
||||
path: artifacts/log/
|
||||
publishOnError: true
|
||||
- name: MacOS_Test_Results
|
||||
path: artifacts/TestResults/
|
||||
publishOnError: true
|
||||
|
||||
- template: jobs/default-build.yml
|
||||
parameters:
|
||||
|
|
@ -449,14 +450,17 @@ jobs:
|
|||
jobDisplayName: "Test: Ubuntu 16.04 x64"
|
||||
agentOs: Linux
|
||||
isTestingJob: true
|
||||
buildScript: ./eng/scripts/cibuild.sh
|
||||
buildArgs: --test
|
||||
buildArgs: --all --test "/p:RunTemplateTests=false"
|
||||
beforeBuild:
|
||||
- bash: "./eng/scripts/install-nginx-linux.sh"
|
||||
displayName: Installing Nginx
|
||||
- bash: "echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p"
|
||||
displayName: Increase inotify limit
|
||||
afterBuild:
|
||||
- bash: ./build.sh --ci --pack --no-build --no-restore --no-build-deps "/bl:artifacts/log/packages.pack.binlog"
|
||||
displayName: Pack Packages (for Template tests)
|
||||
- bash: ./src/ProjectTemplates/build.sh --ci --pack --no-restore --no-build-deps "/bl:artifacts/log/template.pack.binlog"
|
||||
displayName: Pack Templates (for Template tests)
|
||||
- bash: ./build.sh --no-build --ci --test -p:RunFlakyTests=true
|
||||
displayName: Run Flaky Tests
|
||||
continueOnError: true
|
||||
|
|
@ -464,3 +468,6 @@ jobs:
|
|||
- name: Linux_Test_Logs
|
||||
path: artifacts/log/
|
||||
publishOnError: true
|
||||
- name: Linux_Test_Results
|
||||
path: artifacts/TestResults/
|
||||
publishOnError: true
|
||||
|
|
|
|||
|
|
@ -15,7 +15,9 @@ jobs:
|
|||
agentOs: Windows
|
||||
timeoutInMinutes: 240
|
||||
steps:
|
||||
- script: .\build.cmd -all -ci /p:BuildNative=true /t:Helix /p:IsHelixJob=true /bl:$env:BUILD_SOURCESDIRECTORY\artifacts\log\SendToHelix.binlog
|
||||
- script: .\restore.cmd -ci
|
||||
displayName: Restore
|
||||
- script: .\build.cmd -ci -NoRestore -test -projects eng\helix\helix.proj /p:IsHelixJob=true /p:BuildAllProjects=true /p:BuildNative=true -bl
|
||||
displayName: Run build.cmd helix target
|
||||
env:
|
||||
SYSTEM_ACCESSTOKEN: $(System.AccessToken) # We need to set this env var to publish helix results to Azure Dev Ops
|
||||
|
|
|
|||
|
|
@ -104,16 +104,12 @@ jobs:
|
|||
queue: BuildPool.Windows.10.Amd64.VS2019.Open
|
||||
${{ if eq(variables['System.TeamProject'], 'internal') }}:
|
||||
name: NetCoreInternal-Pool
|
||||
${{ if ne(parameters.isTestingJob, true) }}:
|
||||
# Visual Studio Build Tools
|
||||
queue: BuildPool.Windows.10.Amd64.VS2019.BT
|
||||
${{ if eq(parameters.isTestingJob, true) }}:
|
||||
# Visual Studio Enterprise - contains some stuff, like SQL Server and IIS Express, that we use for testing
|
||||
queue: BuildPool.Windows.10.Amd64.VS2019
|
||||
# Visual Studio Enterprise - contains some stuff, like SQL Server and IIS Express, that we use for testing
|
||||
queue: BuildPool.Windows.10.Amd64.VS2019
|
||||
variables:
|
||||
AgentOsName: ${{ parameters.agentOs }}
|
||||
ASPNETCORE_TEST_LOG_MAXPATH: "200" # Keep test log file name length low enough for artifact zipping
|
||||
DOTNET_HOME: $(Agent.BuildDirectory)/.dotnet
|
||||
DOTNET_HOME: $(Build.SourcesDirectory)/.dotnet
|
||||
BuildScript: ${{ parameters.buildScript }}
|
||||
BuildScriptArgs: ${{ parameters.buildArgs }}
|
||||
BuildConfiguration: ${{ parameters.configuration }}
|
||||
|
|
@ -150,7 +146,7 @@ jobs:
|
|||
displayName: Install JDK 11
|
||||
- ${{ if eq(parameters.isTestingJob, true) }}:
|
||||
- powershell: |
|
||||
Write-Host "##vso[task.setvariable variable=SeleniumProcessTrackingFolder]$(BuildDirectory)\obj\selenium\"
|
||||
Write-Host "##vso[task.setvariable variable=SeleniumProcessTrackingFolder]$(BuildDirectory)\artifacts\tmp\selenium\"
|
||||
./eng/scripts/InstallGoogleChrome.ps1
|
||||
displayName: Install Chrome
|
||||
- ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.agentOs, 'Windows'), eq(parameters.codeSign, 'true')) }}:
|
||||
|
|
@ -169,13 +165,13 @@ jobs:
|
|||
- ${{ if eq(parameters.steps, '')}}:
|
||||
- ${{ if eq(parameters.buildScript, '') }}:
|
||||
- ${{ if eq(parameters.agentOs, 'Windows') }}:
|
||||
- script: .\$(BuildDirectory)\build.cmd -ci /p:SignType=$(_SignType) /p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
|
||||
- script: .\$(BuildDirectory)\build.cmd -ci /p:DotNetSignType=$(_SignType) -Configuration $(BuildConfiguration) $(BuildScriptArgs)
|
||||
displayName: Run build.cmd
|
||||
- ${{ if ne(parameters.agentOs, 'Windows') }}:
|
||||
- script: ./$(BuildDirectory)/build.sh -ci -p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
|
||||
- script: ./$(BuildDirectory)/build.sh -ci -configuration $(BuildConfiguration) $(BuildScriptArgs)
|
||||
displayName: Run build.sh
|
||||
- ${{ if ne(parameters.buildScript, '') }}:
|
||||
- script: $(BuildScript) /p:Configuration=$(BuildConfiguration) $(BuildScriptArgs)
|
||||
- script: $(BuildScript) -Configuration $(BuildConfiguration) $(BuildScriptArgs)
|
||||
displayName: run $(BuildScript)
|
||||
|
||||
- ${{ parameters.afterBuild }}
|
||||
|
|
@ -208,33 +204,46 @@ jobs:
|
|||
artifactType: Container
|
||||
parallel: true
|
||||
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish test results
|
||||
condition: always()
|
||||
continueOnError: true
|
||||
inputs:
|
||||
testRunTitle: $(AgentOsName)-$(BuildConfiguration)
|
||||
testRunner: vstest
|
||||
testResultsFiles: '**/artifacts/**/*.trx'
|
||||
mergeTestResults: true
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish js test results
|
||||
condition: always()
|
||||
inputs:
|
||||
testRunner: junit
|
||||
testResultsFiles: '**/artifacts/log/**/*.junit.xml'
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish Java test results
|
||||
condition: always()
|
||||
inputs:
|
||||
testRunner: junit
|
||||
testResultsFiles: '**/TEST-com.microsoft.signalr*.xml'
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
- ${{ if eq(parameters.isTestingJob, true) }}:
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish test results
|
||||
condition: always()
|
||||
continueOnError: true
|
||||
inputs:
|
||||
testRunTitle: $(AgentOsName)-$(BuildConfiguration)
|
||||
testRunner: vstest
|
||||
testResultsFiles: '**/artifacts/**/*.trx'
|
||||
mergeTestResults: true
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish test results
|
||||
condition: always()
|
||||
continueOnError: true
|
||||
inputs:
|
||||
testRunTitle: $(AgentOsName)-$(BuildConfiguration)
|
||||
testRunner: xunit
|
||||
testResultsFiles: '**/artifacts/TestResults/**/*.xml'
|
||||
mergeTestResults: true
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish js test results
|
||||
condition: always()
|
||||
inputs:
|
||||
testRunner: junit
|
||||
testResultsFiles: '**/artifacts/log/**/*.junit.xml'
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
- task: PublishTestResults@2
|
||||
displayName: Publish Java test results
|
||||
condition: always()
|
||||
inputs:
|
||||
testRunner: junit
|
||||
testResultsFiles: '**/TEST-com.microsoft.signalr*.xml'
|
||||
buildConfiguration: $(BuildConfiguration)
|
||||
buildPlatform: $(AgentOsName)
|
||||
|
||||
|
||||
- ${{ if and(eq(variables['System.TeamProject'], 'internal'), eq(parameters.agentOs, 'Windows')) }}:
|
||||
- task: MicroBuildCleanup@1
|
||||
|
|
|
|||
|
|
@ -5,13 +5,10 @@ about: Suggest an idea for this project
|
|||
|
||||
### Is your feature request related to a problem? Please describe.
|
||||
A clear and concise description of what the problem is.
|
||||
Example. I'm am trying to do [...] but [...]
|
||||
Example: I am trying to do [...] but [...]
|
||||
|
||||
### Describe the solution you'd like
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
### Describe alternatives you've considered
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
A clear and concise description of what you want to happen. Include any alternative solutions you've considered.
|
||||
|
||||
### Additional context
|
||||
Add any other context or screenshots about the feature request here.
|
||||
|
|
|
|||
|
|
@ -1,4 +1,9 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
|
||||
<RepositoryUrl>https://github.com/aspnet/AspNetCore</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Defines project type conventions. -->
|
||||
<PropertyGroup>
|
||||
|
|
@ -18,10 +23,11 @@
|
|||
<IsShipping Condition="'$(IsSampleProject)' == 'true' or '$(IsTestAssetProject)' == 'true' or '$(IsBenchmarkProject)' == 'true' or '$(IsUnitTestProject)' == 'true'">false</IsShipping>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="eng\FlakyTests.BeforeArcade.props" />
|
||||
<Import Project="Sdk.props" Sdk="Microsoft.DotNet.Arcade.Sdk" />
|
||||
<Import Project="eng\FlakyTests.AfterArcade.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
|
||||
<Product>Microsoft ASP.NET Core</Product>
|
||||
<StrongNameKeyId>MicrosoftAspNetCore</StrongNameKeyId>
|
||||
|
||||
|
|
@ -51,22 +57,23 @@
|
|||
|
||||
<!-- Source code settings -->
|
||||
<PropertyGroup>
|
||||
<RepoRoot>$(MSBuildThisFileDirectory)</RepoRoot>
|
||||
<RepositoryUrl>https://github.com/aspnet/AspNetCore</RepositoryUrl>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<SharedSourceRoot>$(MSBuildThisFileDirectory)src\Shared\</SharedSourceRoot>
|
||||
<GoogleTestSubmoduleRoot>$(RepoRoot)src\submodules\googletest\</GoogleTestSubmoduleRoot>
|
||||
<!-- Embed source files that are not tracked by the source control manager in the PDB. -->
|
||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||
|
||||
<!-- These project types are disabled because the presence of a PackageReference causes issues for NuGet. -->
|
||||
<DisableSourceLink Condition="'$(MSBuildProjectExtension)' == '.debproj' OR '$(MSBuildProjectExtension)' == '.rpmproj'">true</DisableSourceLink>
|
||||
<!-- Disable source link on local builds for faster local builds. -->
|
||||
<EnableSourceLink Condition="'$(ContinuousIntegrationBuild)' != 'true' and '$(OfficialBuildId)' == ''">false</EnableSourceLink>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<SharedFxName>Microsoft.AspNetCore.App</SharedFxName>
|
||||
<SharedFxDescription>Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub ($(RepositoryUrl)). We happily accept issues and PRs.</SharedFxDescription>
|
||||
|
||||
<NETCoreAppFrameworkIdentifier>.NETCoreApp</NETCoreAppFrameworkIdentifier>
|
||||
<NETCoreAppFramework>netcoreapp$(AspNetCoreMajorMinorVersion)</NETCoreAppFramework>
|
||||
<AspNetCoreAppFrameworkBrandName>ASP.NET Core $(AspNetCoreMajorMinorVersion)</AspNetCoreAppFrameworkBrandName>
|
||||
|
||||
<TargetingPackName>Microsoft.AspNetCore.App.Ref</TargetingPackName>
|
||||
<RuntimeInstallerBaseName>aspnetcore-runtime</RuntimeInstallerBaseName>
|
||||
<TargetingPackInstallerBaseName>aspnetcore-targeting-pack</TargetingPackInstallerBaseName>
|
||||
|
|
@ -133,10 +140,9 @@
|
|||
<NetCoreTargetingPackRoot>$(LocalDotNetRoot)packs\</NetCoreTargetingPackRoot>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="build\tasks\RepoTasks.tasks" Condition="'$(MSBuildProjectName)' != 'RepoTasks' AND '$(DesignTimeBuild)' != 'true'" />
|
||||
<Import Project="eng\tools\RepoTasks\RepoTasks.tasks" Condition="'$(MSBuildProjectName)' != 'RepoTasks' AND '$(DesignTimeBuild)' != 'true'" />
|
||||
|
||||
<PropertyGroup>
|
||||
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
|
||||
<!--
|
||||
Disable deterministic source paths in test assets and samples.
|
||||
In order for the debugger to find source files when debugging a locally built binary the PDB must contain original, unmapped local paths
|
||||
|
|
|
|||
350
build.ps1
350
build.ps1
|
|
@ -24,6 +24,9 @@ Suppress re-compile projects. (Implies -NoRestore)
|
|||
.PARAMETER NoBuildDeps
|
||||
Do not build project-to-project references and only build the specified project.
|
||||
|
||||
.PARAMETER NoBuildRepoTasks
|
||||
Skip building eng/tools/RepoTasks/
|
||||
|
||||
.PARAMETER Pack
|
||||
Produce packages.
|
||||
|
||||
|
|
@ -33,6 +36,9 @@ Run tests.
|
|||
.PARAMETER Sign
|
||||
Run code signing.
|
||||
|
||||
.PARAMETER Configuration
|
||||
Debug or Release
|
||||
|
||||
.PARAMETER Architecture
|
||||
The CPU architecture to build for (x64, x86, arm). Default=x64
|
||||
|
||||
|
|
@ -62,6 +68,12 @@ You can also use -NoBuildJava to suppress this project type.
|
|||
Build Windows Installers. Required .NET 3.5 to be installed (WiX toolset requirement).
|
||||
You can also use -NoBuildInstallers to suppress this project type.
|
||||
|
||||
.PARAMETER BinaryLog
|
||||
Enable the binary logger
|
||||
|
||||
.PARAMETER Verbosity
|
||||
MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
|
||||
|
||||
.PARAMETER MSBuildArguments
|
||||
Additional MSBuild arguments to be passed through.
|
||||
|
||||
|
|
@ -73,7 +85,7 @@ Building both native and managed projects.
|
|||
.EXAMPLE
|
||||
Building a subfolder of code.
|
||||
|
||||
build.ps1 "$(pwd)/src/SomeFolder/**/*.csproj"
|
||||
build.ps1 -projects "$(pwd)/src/SomeFolder/**/*.csproj"
|
||||
|
||||
.EXAMPLE
|
||||
Running tests.
|
||||
|
|
@ -96,6 +108,10 @@ param(
|
|||
[switch]$Test, # Run tests
|
||||
[switch]$Sign, # Code sign
|
||||
|
||||
[Alias('c')]
|
||||
[ValidateSet('Debug', 'Release')]
|
||||
$Configuration,
|
||||
|
||||
[ValidateSet('x64', 'x86', 'arm')]
|
||||
$Architecture = 'x64',
|
||||
|
||||
|
|
@ -119,12 +135,18 @@ param(
|
|||
[switch]$NoBuildJava,
|
||||
[switch]$NoBuildInstallers,
|
||||
|
||||
[switch]$NoBuildRepoTasks,
|
||||
|
||||
# By default, Windows builds will use MSBuild.exe. Passing this will force the build to run on
|
||||
# dotnet.exe instead, which may cause issues if you invoke build on a project unsupported by
|
||||
# MSBuild for .NET Core
|
||||
[switch]$ForceCoreMsbuild,
|
||||
|
||||
# Diagnostics
|
||||
[Alias('bl')]
|
||||
[switch]$BinaryLog,
|
||||
[Alias('v')]
|
||||
[string]$Verbosity = 'minimal',
|
||||
[switch]$DumpProcesses, # Capture all running processes and dump them to a file.
|
||||
|
||||
# Other lifecycle targets
|
||||
|
|
@ -138,122 +160,16 @@ param(
|
|||
Set-StrictMode -Version 2
|
||||
$ErrorActionPreference = 'Stop'
|
||||
|
||||
#
|
||||
# Functions
|
||||
#
|
||||
|
||||
function Get-KoreBuild {
|
||||
|
||||
if (!(Test-Path $LockFile)) {
|
||||
Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $LockFile
|
||||
}
|
||||
|
||||
$version = Get-Content $LockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1
|
||||
if (!$version) {
|
||||
Write-Error "Failed to parse version from $LockFile. Expected a line that begins with 'version:'"
|
||||
}
|
||||
$version = $version.TrimStart('version:').Trim()
|
||||
$korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version)
|
||||
|
||||
if (!(Test-Path $korebuildPath)) {
|
||||
Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version"
|
||||
New-Item -ItemType Directory -Path $korebuildPath | Out-Null
|
||||
$remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip"
|
||||
|
||||
try {
|
||||
$tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip"
|
||||
Get-RemoteFile $remotePath $tmpfile
|
||||
if (Get-Command -Name 'Expand-Archive' -ErrorAction Ignore) {
|
||||
# Use built-in commands where possible as they are cross-plat compatible
|
||||
Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath
|
||||
}
|
||||
else {
|
||||
# Fallback to old approach for old installations of PowerShell
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore
|
||||
throw
|
||||
}
|
||||
finally {
|
||||
Remove-Item $tmpfile -ErrorAction Ignore
|
||||
}
|
||||
}
|
||||
|
||||
return $korebuildPath
|
||||
}
|
||||
|
||||
function Join-Paths([string]$path, [string[]]$childPaths) {
|
||||
$childPaths | ForEach-Object { $path = Join-Path $path $_ }
|
||||
return $path
|
||||
}
|
||||
|
||||
function Get-RemoteFile([string]$RemotePath, [string]$LocalPath) {
|
||||
if ($RemotePath -notlike 'http*') {
|
||||
Copy-Item $RemotePath $LocalPath
|
||||
return
|
||||
}
|
||||
|
||||
$retries = 10
|
||||
while ($retries -gt 0) {
|
||||
$retries -= 1
|
||||
try {
|
||||
$ProgressPreference = 'SilentlyContinue' # Workaround PowerShell/PowerShell#2138
|
||||
Invoke-WebRequest -UseBasicParsing -Uri $RemotePath -OutFile $LocalPath
|
||||
return
|
||||
}
|
||||
catch {
|
||||
Write-Verbose "Request failed. $retries retries remaining"
|
||||
}
|
||||
}
|
||||
|
||||
Write-Error "Download failed: '$RemotePath'."
|
||||
}
|
||||
|
||||
#
|
||||
# Main
|
||||
#
|
||||
|
||||
# Load configuration or set defaults
|
||||
|
||||
if ($Help) {
|
||||
Get-Help $PSCommandPath
|
||||
exit 1
|
||||
}
|
||||
|
||||
$Channel = 'master'
|
||||
$ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools'
|
||||
$ConfigFile = Join-Path $PSScriptRoot 'korebuild.json'
|
||||
$LockFile = Join-Path $PSScriptRoot 'korebuild-lock.txt'
|
||||
|
||||
if (Test-Path $ConfigFile) {
|
||||
try {
|
||||
$config = Get-Content -Raw -Encoding UTF8 -Path $ConfigFile | ConvertFrom-Json
|
||||
if ($config) {
|
||||
if (Get-Member -Name 'channel' -InputObject $config) { [string] $Channel = $config.channel }
|
||||
if (Get-Member -Name 'toolsSource' -InputObject $config) { [string] $ToolsSource = $config.toolsSource}
|
||||
}
|
||||
} catch {
|
||||
Write-Warning "$ConfigFile could not be read. Its settings will be ignored."
|
||||
Write-Warning $Error[0]
|
||||
}
|
||||
}
|
||||
|
||||
$DotNetHome = Join-Path $PSScriptRoot '.dotnet'
|
||||
$env:DOTNET_HOME = $DotNetHome
|
||||
|
||||
# Execute
|
||||
|
||||
if ($DumpProcesses -or $CI)
|
||||
{
|
||||
if ($DumpProcesses -or $CI) {
|
||||
# Dump running processes
|
||||
Start-Job -Name DumpProcesses -FilePath $PSScriptRoot\eng\scripts\dump_process.ps1 -ArgumentList $PSScriptRoot
|
||||
}
|
||||
|
||||
$korebuildPath = Get-KoreBuild
|
||||
|
||||
# Project selection
|
||||
if ($All) {
|
||||
$MSBuildArguments += '/p:BuildAllProjects=true'
|
||||
|
|
@ -263,7 +179,7 @@ elseif ($Projects) {
|
|||
{
|
||||
$Projects = Join-Path (Get-Location) $Projects
|
||||
}
|
||||
$MSBuildArguments += "/p:Projects=$Projects"
|
||||
$MSBuildArguments += "/p:ProjectToBuild=$Projects"
|
||||
}
|
||||
# When adding new sub-group build flags, add them to this check.
|
||||
elseif((-not $BuildNative) -and (-not $BuildManaged) -and (-not $BuildNodeJS) -and (-not $BuildInstallers) -and (-not $BuildJava)) {
|
||||
|
|
@ -299,98 +215,176 @@ $RunRestore = if ($NoRestore) { $false }
|
|||
else { $true }
|
||||
|
||||
# Target selection
|
||||
if ($RunRestore) {
|
||||
$MSBuildArguments += "/restore"
|
||||
$MSBuildArguments += "/p:Restore=$RunRestore"
|
||||
$MSBuildArguments += "/p:Build=$RunBuild"
|
||||
if (-not $RunBuild) {
|
||||
$MSBuildArguments += "/p:NoBuild=true"
|
||||
}
|
||||
|
||||
$MSBuildArguments += "/p:_RunBuild=$RunBuild"
|
||||
$MSBuildArguments += "/p:_RunPack=$Pack"
|
||||
$MSBuildArguments += "/p:_RunTests=$Test"
|
||||
$MSBuildArguments += "/p:_RunSign=$Sign"
|
||||
$MSBuildArguments += "/p:Pack=$Pack"
|
||||
$MSBuildArguments += "/p:Test=$Test"
|
||||
$MSBuildArguments += "/p:Sign=$Sign"
|
||||
|
||||
$MSBuildArguments += "/p:TargetArchitecture=$Architecture"
|
||||
$MSBuildArguments += "/p:TargetOsName=win"
|
||||
|
||||
if ($RunBuild -and ($All -or $BuildJava) -and -not $NoBuildJava) {
|
||||
$foundJdk = $false
|
||||
$javac = Get-Command javac -ErrorAction Ignore -CommandType Application
|
||||
$localJdkPath = "$PSScriptRoot\.tools\jdk\win-x64\"
|
||||
if (Test-Path "$localJdkPath\bin\javac.exe") {
|
||||
$foundJdk = $true
|
||||
Write-Host -f Magenta "Detected JDK in $localJdkPath (via local repo convention)"
|
||||
$env:JAVA_HOME = $localJdkPath
|
||||
}
|
||||
elseif ($env:JAVA_HOME) {
|
||||
if (-not (Test-Path "${env:JAVA_HOME}\bin\javac.exe")) {
|
||||
Write-Error "The environment variable JAVA_HOME was set, but ${env:JAVA_HOME}\bin\javac.exe does not exist. Remove JAVA_HOME or update it to the correct location for the JDK. See https://www.bing.com/search?q=java_home for details."
|
||||
}
|
||||
else {
|
||||
Write-Host -f Magenta "Detected JDK in ${env:JAVA_HOME} (via JAVA_HOME)"
|
||||
$foundJdk = $true
|
||||
}
|
||||
}
|
||||
elseif ($javac) {
|
||||
$foundJdk = $true
|
||||
$javaHome = Split-Path -Parent (Split-Path -Parent $javac.Path)
|
||||
$env:JAVA_HOME = $javaHome
|
||||
Write-Host -f Magenta "Detected JDK in $javaHome (via PATH)"
|
||||
if (-not $Configuration) {
|
||||
$Configuration = if ($CI) { 'Release' } else { 'Debug' }
|
||||
}
|
||||
$MSBuildArguments += "/p:Configuration=$Configuration"
|
||||
|
||||
$foundJdk = $false
|
||||
$javac = Get-Command javac -ErrorAction Ignore -CommandType Application
|
||||
$localJdkPath = "$PSScriptRoot\.tools\jdk\win-x64\"
|
||||
if (Test-Path "$localJdkPath\bin\javac.exe") {
|
||||
$foundJdk = $true
|
||||
Write-Host -f Magenta "Detected JDK in $localJdkPath (via local repo convention)"
|
||||
$env:JAVA_HOME = $localJdkPath
|
||||
}
|
||||
elseif ($env:JAVA_HOME) {
|
||||
if (-not (Test-Path "${env:JAVA_HOME}\bin\javac.exe")) {
|
||||
Write-Error "The environment variable JAVA_HOME was set, but ${env:JAVA_HOME}\bin\javac.exe does not exist. Remove JAVA_HOME or update it to the correct location for the JDK. See https://www.bing.com/search?q=java_home for details."
|
||||
}
|
||||
else {
|
||||
try {
|
||||
$jdkRegistryKeys = @(
|
||||
"HKLM:\SOFTWARE\JavaSoft\JDK", # for JDK 10+
|
||||
"HKLM:\SOFTWARE\JavaSoft\Java Development Kit" # fallback for JDK 8
|
||||
)
|
||||
$jdkRegistryKey = $jdkRegistryKeys | Where-Object { Test-Path $_ } | Select-Object -First 1
|
||||
if ($jdkRegistryKey) {
|
||||
$jdkVersion = (Get-Item $jdkRegistryKey | Get-ItemProperty -name CurrentVersion).CurrentVersion
|
||||
$javaHome = (Get-Item $jdkRegistryKey\$jdkVersion | Get-ItemProperty -Name JavaHome).JavaHome
|
||||
if (Test-Path "${javaHome}\bin\javac.exe") {
|
||||
$env:JAVA_HOME = $javaHome
|
||||
Write-Host -f Magenta "Detected JDK $jdkVersion in $env:JAVA_HOME (via registry)"
|
||||
$foundJdk = $true
|
||||
}
|
||||
Write-Host -f Magenta "Detected JDK in ${env:JAVA_HOME} (via JAVA_HOME)"
|
||||
$foundJdk = $true
|
||||
}
|
||||
}
|
||||
elseif ($javac) {
|
||||
$foundJdk = $true
|
||||
$javaHome = Split-Path -Parent (Split-Path -Parent $javac.Path)
|
||||
$env:JAVA_HOME = $javaHome
|
||||
Write-Host -f Magenta "Detected JDK in $javaHome (via PATH)"
|
||||
}
|
||||
else {
|
||||
try {
|
||||
$jdkRegistryKeys = @(
|
||||
"HKLM:\SOFTWARE\JavaSoft\JDK", # for JDK 10+
|
||||
"HKLM:\SOFTWARE\JavaSoft\Java Development Kit" # fallback for JDK 8
|
||||
)
|
||||
$jdkRegistryKey = $jdkRegistryKeys | Where-Object { Test-Path $_ } | Select-Object -First 1
|
||||
if ($jdkRegistryKey) {
|
||||
$jdkVersion = (Get-Item $jdkRegistryKey | Get-ItemProperty -name CurrentVersion).CurrentVersion
|
||||
$javaHome = (Get-Item $jdkRegistryKey\$jdkVersion | Get-ItemProperty -Name JavaHome).JavaHome
|
||||
if (Test-Path "${javaHome}\bin\javac.exe") {
|
||||
$env:JAVA_HOME = $javaHome
|
||||
Write-Host -f Magenta "Detected JDK $jdkVersion in $env:JAVA_HOME (via registry)"
|
||||
$foundJdk = $true
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Verbose "Failed to detect Java: $_"
|
||||
}
|
||||
}
|
||||
|
||||
if ($env:PATH -notlike "*${env:JAVA_HOME}*") {
|
||||
$env:PATH = "$(Join-Path $env:JAVA_HOME bin);${env:PATH}"
|
||||
}
|
||||
|
||||
if (-not $foundJdk) {
|
||||
Write-Error "Could not find the JDK. Either run $PSScriptRoot\eng\scripts\InstallJdk.ps1 to install for this repo, or install the JDK globally on your machine (see $PSScriptRoot\docs\BuildFromSource.md for details)."
|
||||
catch {
|
||||
Write-Verbose "Failed to detect Java: $_"
|
||||
}
|
||||
}
|
||||
|
||||
Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1')
|
||||
if ($env:PATH -notlike "*${env:JAVA_HOME}*") {
|
||||
$env:PATH = "$(Join-Path $env:JAVA_HOME bin);${env:PATH}"
|
||||
}
|
||||
|
||||
if (-not $foundJdk -and $RunBuild -and ($All -or $BuildJava) -and -not $NoBuildJava) {
|
||||
Write-Error "Could not find the JDK. Either run $PSScriptRoot\eng\scripts\InstallJdk.ps1 to install for this repo, or install the JDK globally on your machine (see $PSScriptRoot\docs\BuildFromSource.md for details)."
|
||||
}
|
||||
|
||||
# Initialize global variables need to be set before the import of Arcade is imported
|
||||
$restore = $RunRestore
|
||||
|
||||
# Disable node reuse - Workaround perpetual issues in node reuse and custom task assemblies
|
||||
$nodeReuse = $false
|
||||
$env:MSBUILDDISABLENODEREUSE=1
|
||||
|
||||
# Our build often has warnings that we can't fix, like "MSB3026: Could not copy" due to race
|
||||
# conditions in building C++
|
||||
# Fixing this is tracked by https://github.com/aspnet/AspNetCore-Internal/issues/601
|
||||
$warnAsError = $false
|
||||
|
||||
if ($ForceCoreMsbuild) {
|
||||
$msbuildEngine = 'dotnet'
|
||||
}
|
||||
|
||||
# Workaround Arcade check which asserts BinaryLog is true on CI.
|
||||
# We always use binlogs on CI, but we customize the name of the log file
|
||||
$tmpBinaryLog = $BinaryLog
|
||||
if ($CI) {
|
||||
$BinaryLog = $true
|
||||
}
|
||||
|
||||
# tools.ps1 corrupts global state, so reset these values in case they carried over from a previous build
|
||||
rm variable:global:_BuildTool -ea Ignore
|
||||
rm variable:global:_DotNetInstallDir -ea Ignore
|
||||
rm variable:global:_ToolsetBuildProj -ea Ignore
|
||||
rm variable:global:_MSBuildExe -ea Ignore
|
||||
|
||||
# Import Arcade
|
||||
. "$PSScriptRoot/eng/common/tools.ps1"
|
||||
|
||||
if ($tmpBinaryLog) {
|
||||
$MSBuildArguments += "/bl:$LogDir/Build.binlog"
|
||||
}
|
||||
|
||||
# Capture MSBuild crash logs
|
||||
$env:MSBUILDDEBUGPATH = $LogDir
|
||||
|
||||
$local:exit_code = $null
|
||||
try {
|
||||
$env:KOREBUILD_KEEPGLOBALJSON = 1
|
||||
$env:KOREBUILD_DISABLE_DOTNET_ARCH = 1
|
||||
Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $PSScriptRoot -ConfigFile $ConfigFile -CI:$CI
|
||||
if ($ForceCoreMsbuild) {
|
||||
$global:KoreBuildSettings.MSBuildType = 'core'
|
||||
# Import custom tools configuration, if present in the repo.
|
||||
# Note: Import in global scope so that the script set top-level variables without qualification.
|
||||
$configureToolsetScript = Join-Path $EngRoot "configure-toolset.ps1"
|
||||
if (Test-Path $configureToolsetScript) {
|
||||
. $configureToolsetScript
|
||||
}
|
||||
Invoke-KoreBuildCommand 'default-build' @MSBuildArguments
|
||||
|
||||
# Set this global property so Arcade will always initialize the toolset. The error message you get when you build on a clean machine
|
||||
# with -norestore is not obvious about what to do to fix it. As initialization takes very little time, we think always initializing
|
||||
# the toolset is a better default behavior.
|
||||
$tmpRestore = $restore
|
||||
$restore = $true
|
||||
|
||||
$toolsetBuildProj = InitializeToolset
|
||||
|
||||
$restore = $tmpRestore
|
||||
|
||||
if ($ci) {
|
||||
$global:VerbosePreference = 'Continue'
|
||||
}
|
||||
|
||||
if (-not $NoBuildRepoTasks) {
|
||||
MSBuild $toolsetBuildProj `
|
||||
/p:RepoRoot=$RepoRoot `
|
||||
/p:Projects=$EngRoot\tools\RepoTasks\RepoTasks.csproj `
|
||||
/p:Configuration=Release `
|
||||
/p:Restore=$RunRestore `
|
||||
/p:Build=true `
|
||||
/clp:NoSummary
|
||||
}
|
||||
|
||||
MSBuild $toolsetBuildProj `
|
||||
/p:RepoRoot=$RepoRoot `
|
||||
@MSBuildArguments
|
||||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTaskError -Message $_
|
||||
$exit_code = 1
|
||||
}
|
||||
finally {
|
||||
Remove-Module 'KoreBuild' -ErrorAction Ignore
|
||||
Remove-Item env:DOTNET_HOME
|
||||
Remove-Item env:KOREBUILD_KEEPGLOBALJSON
|
||||
if (! $exit_code) {
|
||||
$exit_code = $LASTEXITCODE
|
||||
}
|
||||
|
||||
if ($DumpProcesses -or $CI)
|
||||
{
|
||||
# tools.ps1 corrupts global state, so reset these values so they don't carry between invocations of build.ps1
|
||||
rm variable:global:_BuildTool -ea Ignore
|
||||
rm variable:global:_DotNetInstallDir -ea Ignore
|
||||
rm variable:global:_ToolsetBuildProj -ea Ignore
|
||||
rm variable:global:_MSBuildExe -ea Ignore
|
||||
|
||||
if ($DumpProcesses -or $ci) {
|
||||
Stop-Job -Name DumpProcesses
|
||||
Remove-Job -Name DumpProcesses
|
||||
}
|
||||
|
||||
if ($CI) {
|
||||
if ($ci) {
|
||||
& "$PSScriptRoot/eng/scripts/KillProcesses.ps1"
|
||||
}
|
||||
|
||||
Write-Host "build.ps1 completed"
|
||||
}
|
||||
|
||||
ExitWithExitCode $exit_code
|
||||
|
|
|
|||
321
build.sh
321
build.sh
|
|
@ -9,29 +9,26 @@ set -euo pipefail
|
|||
RESET="\033[0m"
|
||||
RED="\033[0;31m"
|
||||
YELLOW="\033[0;33m"
|
||||
MAGENTA="\033[0;95m"
|
||||
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
||||
verbose=false
|
||||
update=false
|
||||
reinstall=false
|
||||
lockfile_path="$DIR/korebuild-lock.txt"
|
||||
config_file="$DIR/korebuild.json"
|
||||
channel='master'
|
||||
tools_source='https://aspnetcore.blob.core.windows.net/buildtools'
|
||||
target_os_name=''
|
||||
ci=false
|
||||
use_default_binary_log=false
|
||||
verbosity='minimal'
|
||||
run_restore=''
|
||||
run_build=true
|
||||
run_pack=false
|
||||
run_tests=false
|
||||
build_all=false
|
||||
build_deps=true
|
||||
build_repo_tasks=true
|
||||
build_managed=''
|
||||
build_native=''
|
||||
build_nodejs=''
|
||||
build_java=''
|
||||
build_installers=''
|
||||
build_projects=''
|
||||
target_arch='x64'
|
||||
configuration=''
|
||||
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
target_os_name='osx'
|
||||
|
|
@ -48,29 +45,33 @@ __usage() {
|
|||
echo "Usage: $(basename "${BASH_SOURCE[0]}") [options] [[--] <Arguments>...]
|
||||
|
||||
Arguments:
|
||||
<Arguments>... Arguments passed to the command. Variable number of arguments allowed.
|
||||
<Arguments>... Arguments passed to the command. Variable number of arguments allowed.
|
||||
|
||||
Options:
|
||||
--arch The CPU architecture to build for (x64, arm, arm64). Default=$target_arch
|
||||
--os-name The base runtime identifier to build for (linux, osx, linux-musl). Default=$target_os_name
|
||||
--configuration|-c The build configuration (Debug, Release). Default=Debug
|
||||
--arch The CPU architecture to build for (x64, arm, arm64). Default=$target_arch
|
||||
--os-name The base runtime identifier to build for (linux, osx, linux-musl). Default=$target_os_name
|
||||
|
||||
--[no-]restore Run restore.
|
||||
--[no-]build Compile projects. (Implies --no-restore)
|
||||
--[no-]pack Produce packages.
|
||||
--[no-]test Run tests.
|
||||
--[no-]restore Run restore.
|
||||
--[no-]build Compile projects. (Implies --no-restore)
|
||||
--[no-]pack Produce packages.
|
||||
--[no-]test Run tests.
|
||||
|
||||
--projects A list of projects to build. (Must be an absolute path.)
|
||||
Globbing patterns are supported, such as \"$(pwd)/**/*.csproj\".
|
||||
--no-build-deps Do not build project-to-project references and only build the specified project.
|
||||
--projects A list of projects to build. (Must be an absolute path.)
|
||||
Globbing patterns are supported, such as \"$(pwd)/**/*.csproj\".
|
||||
--no-build-deps Do not build project-to-project references and only build the specified project.
|
||||
--no-build-repo-tasks Suppress building RepoTasks.
|
||||
|
||||
--all Build all project types.
|
||||
--[no-]build-native Build native projects (C, C++).
|
||||
--[no-]build-managed Build managed projects (C#, F#, VB).
|
||||
--[no-]build-nodejs Build NodeJS projects (TypeScript, JS).
|
||||
--[no-]build-java Build Java projects.
|
||||
--all Build all project types.
|
||||
--[no-]build-native Build native projects (C, C++).
|
||||
--[no-]build-managed Build managed projects (C#, F#, VB).
|
||||
--[no-]build-nodejs Build NodeJS projects (TypeScript, JS).
|
||||
--[no-]build-java Build Java projects.
|
||||
--[no-]build-installers Build Java projects.
|
||||
|
||||
--ci Apply CI specific settings and environment variables.
|
||||
--verbose Show verbose output.
|
||||
--ci Apply CI specific settings and environment variables.
|
||||
--binarylog|-bl Use a binary logger
|
||||
--verbosity|-v MSBuild verbosity: q[uiet], m[inimal], n[ormal], d[etailed], and diag[nostic]
|
||||
|
||||
Description:
|
||||
This build script installs required tools and runs an MSBuild command on this repository
|
||||
|
|
@ -83,41 +84,6 @@ Description:
|
|||
fi
|
||||
}
|
||||
|
||||
get_korebuild() {
|
||||
local version
|
||||
if [ ! -f "$lockfile_path" ]; then
|
||||
__get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lockfile_path"
|
||||
fi
|
||||
version="$(grep 'version:*' -m 1 "$lockfile_path")"
|
||||
if [[ "$version" == '' ]]; then
|
||||
__error "Failed to parse version from $lockfile_path. Expected a line that begins with 'version:'"
|
||||
return 1
|
||||
fi
|
||||
version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
|
||||
local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version"
|
||||
|
||||
{
|
||||
if [ ! -d "$korebuild_path" ]; then
|
||||
mkdir -p "$korebuild_path"
|
||||
local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip"
|
||||
tmpfile="$(mktemp)"
|
||||
echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}"
|
||||
if __get_remote_file "$remote_path" "$tmpfile"; then
|
||||
unzip -q -d "$korebuild_path" "$tmpfile"
|
||||
fi
|
||||
rm "$tmpfile" || true
|
||||
fi
|
||||
|
||||
source "$korebuild_path/KoreBuild.sh"
|
||||
} || {
|
||||
if [ -d "$korebuild_path" ]; then
|
||||
echo "Cleaning up after failed installation"
|
||||
rm -rf "$korebuild_path" || true
|
||||
fi
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
__error() {
|
||||
echo -e "${RED}error: $*${RESET}" 1>&2
|
||||
}
|
||||
|
|
@ -126,124 +92,112 @@ __warn() {
|
|||
echo -e "${YELLOW}warning: $*${RESET}"
|
||||
}
|
||||
|
||||
__machine_has() {
|
||||
hash "$1" > /dev/null 2>&1
|
||||
return $?
|
||||
}
|
||||
|
||||
__get_remote_file() {
|
||||
local remote_path=$1
|
||||
local local_path=$2
|
||||
|
||||
if [[ "$remote_path" != 'http'* ]]; then
|
||||
cp "$remote_path" "$local_path"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local failed=false
|
||||
if __machine_has wget; then
|
||||
wget --tries 10 --quiet -O "$local_path" "$remote_path" || failed=true
|
||||
else
|
||||
failed=true
|
||||
fi
|
||||
|
||||
if [ "$failed" = true ] && __machine_has curl; then
|
||||
failed=false
|
||||
curl --retry 10 -sSL -f --create-dirs -o "$local_path" "$remote_path" || failed=true
|
||||
fi
|
||||
|
||||
if [ "$failed" = true ]; then
|
||||
__error "Download failed: $remote_path" 1>&2
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# main
|
||||
#
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-\?|-h|--help)
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
case "$opt" in
|
||||
-\?|-h|-help)
|
||||
__usage --no-exit
|
||||
exit 0
|
||||
;;
|
||||
--arch)
|
||||
-configuration|-c)
|
||||
shift
|
||||
configuration="${1:-}"
|
||||
[ -z "$configuration" ] && __error "Missing value for parameter --configuration" && __usage
|
||||
;;
|
||||
-arch)
|
||||
shift
|
||||
target_arch="${1:-}"
|
||||
[ -z "$target_arch" ] && __error "Missing value for parameter --arch" && __usage
|
||||
;;
|
||||
--os-name)
|
||||
-os-name|-osname)
|
||||
shift
|
||||
target_os_name="${1:-}"
|
||||
[ -z "$target_os_name" ] && __error "Missing value for parameter --os-name" && __usage
|
||||
;;
|
||||
--restore|-[Rr]estore)
|
||||
-restore|-r)
|
||||
run_restore=true
|
||||
;;
|
||||
--no-restore)
|
||||
-no-restore|-norestore)
|
||||
run_restore=false
|
||||
;;
|
||||
--build|-[Bb]build)
|
||||
-build|-b)
|
||||
run_build=true
|
||||
;;
|
||||
--no-build)
|
||||
-no-build|-nobuild)
|
||||
run_build=false
|
||||
# --no-build implies --no-restore
|
||||
[ -z "$run_restore" ] && run_restore=false
|
||||
;;
|
||||
--no-build-deps)
|
||||
-no-build-deps|-nobuilddeps)
|
||||
build_deps=false
|
||||
;;
|
||||
--pack|-[Pp]ack)
|
||||
-pack)
|
||||
run_pack=true
|
||||
;;
|
||||
--no-pack)
|
||||
-no-pack|-nopack)
|
||||
run_pack=false
|
||||
;;
|
||||
--test|-[Tt]est)
|
||||
-test|-t)
|
||||
run_tests=true
|
||||
;;
|
||||
--no-test)
|
||||
-no-test|-notest)
|
||||
run_tests=false
|
||||
;;
|
||||
--projects|-[Pp]rojects)
|
||||
-projects)
|
||||
shift
|
||||
build_projects="${1:-}"
|
||||
[ -z "$build_projects" ] && __error "Missing value for parameter --projects" && __usage
|
||||
;;
|
||||
--all|-[Aa]ll)
|
||||
-all)
|
||||
build_all=true
|
||||
;;
|
||||
--build-managed|-BuildManaged)
|
||||
-build-managed|-buildmanaged)
|
||||
build_managed=true
|
||||
;;
|
||||
--no-build-managed|-NoBuildManaged)
|
||||
-no-build-managed|-nobuildmanaged)
|
||||
build_managed=false
|
||||
;;
|
||||
--build-nodejs|-BuildNodeJs)
|
||||
-build-nodejs|-buildnodejs)
|
||||
build_nodejs=true
|
||||
;;
|
||||
--no-build-nodejs|-NoBuildNodeJs)
|
||||
-no-build-nodejs|-nobuildnodejs)
|
||||
build_nodejs=false
|
||||
;;
|
||||
--build-java|-BuildJava)
|
||||
-build-java|-buildjava)
|
||||
build_java=true
|
||||
;;
|
||||
--no-build-java|-NoBuildJava)
|
||||
-no-build-java|-nobuildjava)
|
||||
build_java=false
|
||||
;;
|
||||
--build-native|-BuildNative)
|
||||
-build-native|-buildnative)
|
||||
build_native=true
|
||||
;;
|
||||
--no-build-native|-NoBuildNative)
|
||||
-no-build-native|-nobuildnative)
|
||||
build_native=false
|
||||
;;
|
||||
--ci|-[Cc][Ii])
|
||||
-build-installers|-buildinstallers)
|
||||
build_installers=true
|
||||
;;
|
||||
-no-build-installers|-nobuildinstallers)
|
||||
build_installers=false
|
||||
;;
|
||||
-no-build-repo-tasks|-nobuildrepotasks)
|
||||
build_repo_tasks=false
|
||||
;;
|
||||
-ci)
|
||||
ci=true
|
||||
;;
|
||||
--verbose|-[Vv]erbose)
|
||||
verbose=true
|
||||
-binarylog|-bl)
|
||||
use_default_binary_log=true
|
||||
;;
|
||||
-verbosity|-v)
|
||||
shift
|
||||
[ -z "${1:-}" ] && __error "Missing value for parameter --verbosity" && __usage
|
||||
verbosity="${1:-}"
|
||||
;;
|
||||
*)
|
||||
msbuild_args[${#msbuild_args[*]}]="$1"
|
||||
|
|
@ -252,54 +206,14 @@ while [[ $# -gt 0 ]]; do
|
|||
shift
|
||||
done
|
||||
|
||||
if ! __machine_has unzip; then
|
||||
__error 'Missing required command: unzip'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! __machine_has curl && ! __machine_has wget; then
|
||||
__error 'Missing required command. Either wget or curl is required.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f "$config_file" ]; then
|
||||
if __machine_has jq ; then
|
||||
if jq '.' "$config_file" >/dev/null ; then
|
||||
config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")"
|
||||
config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")"
|
||||
else
|
||||
__error "$config_file is invalid JSON. Its settings will be ignored."
|
||||
exit 1
|
||||
fi
|
||||
elif __machine_has python ; then
|
||||
if python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then
|
||||
config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")"
|
||||
config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")"
|
||||
else
|
||||
__error "$config_file is invalid JSON. Its settings will be ignored."
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
__error 'Missing required command: jq or python. Could not parse the JSON file. Its settings will be ignored.'
|
||||
exit 1
|
||||
fi
|
||||
|
||||
[ ! -z "${config_channel:-}" ] && channel="$config_channel"
|
||||
[ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source"
|
||||
fi
|
||||
|
||||
export DOTNET_HOME="$DIR/.dotnet"
|
||||
|
||||
get_korebuild
|
||||
|
||||
if [ "$build_all" = true ]; then
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:BuildAllProjects=true"
|
||||
elif [ ! -z "$build_projects" ]; then
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:Projects=$build_projects"
|
||||
elif [ -z "$build_managed" ] && [ -z "$build_nodejs" ] && [ -z "$build_java" ] && [ -z "$build_native" ]; then
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:ProjectToBuild=$build_projects"
|
||||
elif [ -z "$build_managed" ] && [ -z "$build_nodejs" ] && [ -z "$build_java" ] && [ -z "$build_native" ] && [ -z "$build_installers" ]; then
|
||||
# This goal of this is to pick a sensible default for `build.sh` with zero arguments.
|
||||
# We believe the most common thing our contributors will work on is C#, so if no other build group was picked, build the C# projects.
|
||||
__warn "No default group of projects was specified, so building the 'managed' subset of projects. Run ``build.sh -help`` for more details."
|
||||
__warn "No default group of projects was specified, so building the 'managed' subset of projects. Run ``build.sh --help`` for more details."
|
||||
build_managed=true
|
||||
fi
|
||||
|
||||
|
|
@ -312,24 +226,91 @@ fi
|
|||
[ ! -z "$build_native" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildNative=$build_native"
|
||||
[ ! -z "$build_nodejs" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildNodeJS=$build_nodejs"
|
||||
[ ! -z "$build_managed" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildManaged=$build_managed"
|
||||
[ ! -z "$build_installers" ] && msbuild_args[${#msbuild_args[*]}]="-p:BuildInstallers=$build_installers"
|
||||
|
||||
# Run restore by default unless --no-restore or --no-build was specified.
|
||||
[ -z "$run_restore" ] && run_restore=true
|
||||
|
||||
[ "$run_restore" = true ] && msbuild_args[${#msbuild_args[*]}]="-restore"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:_RunBuild=$run_build"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:_RunPack=$run_pack"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:_RunTests=$run_tests"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:Restore=$run_restore"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:Build=$run_build"
|
||||
if [ "$run_build" = false ]; then
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:NoBuild=true"
|
||||
fi
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:Pack=$run_pack"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:Test=$run_tests"
|
||||
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:TargetArchitecture=$target_arch"
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:TargetOsName=$target_os_name"
|
||||
|
||||
# Disable downloading ref assemblies as a tarball. Use netfx refs from the Microsoft.NETFramework.ReferenceAssemblies NuGet package instead.
|
||||
[ -z "${KOREBUILD_SKIP_INSTALL_NETFX:-}" ] && KOREBUILD_SKIP_INSTALL_NETFX=1
|
||||
if [ -z "$configuration" ]; then
|
||||
if [ "$ci" = true ]; then
|
||||
configuration='Release'
|
||||
else
|
||||
configuration='Debug'
|
||||
fi
|
||||
fi
|
||||
msbuild_args[${#msbuild_args[*]}]="-p:Configuration=$configuration"
|
||||
|
||||
export KOREBUILD_KEEPGLOBALJSON=1
|
||||
set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$DIR" "$config_file" "$ci"
|
||||
# Initialize global variables need to be set before the import of Arcade is imported
|
||||
restore=$run_restore
|
||||
|
||||
# Disable node reuse - Workaround perpetual issues in node reuse and custom task assemblies
|
||||
nodeReuse=false
|
||||
export MSBUILDDISABLENODEREUSE=1
|
||||
|
||||
# Our build often has warnings that we can't fix
|
||||
# Fixing this is tracked by https://github.com/aspnet/AspNetCore-Internal/issues/601
|
||||
warn_as_error=false
|
||||
|
||||
# Workaround Arcade check which asserts BinaryLog is true on CI.
|
||||
# We always use binlogs on CI, but we customize the name of the log file
|
||||
if [ "$ci" = true ]; then
|
||||
binary_log=true
|
||||
fi
|
||||
|
||||
# increase file descriptor limit on macOS
|
||||
if [ "$(uname)" = "Darwin" ]; then
|
||||
ulimit -n 10000
|
||||
fi
|
||||
|
||||
# Import Arcade
|
||||
. "$DIR/eng/common/tools.sh"
|
||||
|
||||
if [ "$use_default_binary_log" = true ]; then
|
||||
msbuild_args[${#msbuild_args[*]}]="-bl:\"$log_dir/Build.binlog\""
|
||||
fi
|
||||
|
||||
# Capture MSBuild crash logs
|
||||
export MSBUILDDEBUGPATH="$log_dir"
|
||||
|
||||
# Import custom tools configuration, if present in the repo.
|
||||
configure_toolset_script="$eng_root/configure-toolset.sh"
|
||||
if [[ -a "$configure_toolset_script" ]]; then
|
||||
. "$configure_toolset_script"
|
||||
fi
|
||||
|
||||
# Set this global property so Arcade will always initialize the toolset. The error message you get when you build on a clean machine
|
||||
# with -norestore is not obvious about what to do to fix it. As initialization takes very little time, we think always initializing
|
||||
# the toolset is a better default behavior.
|
||||
_tmp_restore=$restore
|
||||
restore=true
|
||||
|
||||
InitializeToolset
|
||||
|
||||
restore=$_tmp_restore=
|
||||
|
||||
if [ "$build_repo_tasks" = true ]; then
|
||||
MSBuild $_InitializeToolset \
|
||||
-p:RepoRoot="$repo_root" \
|
||||
-p:Projects="$DIR/eng/tools/RepoTasks/RepoTasks.csproj" \
|
||||
-p:Configuration=Release \
|
||||
-p:Restore=$run_restore \
|
||||
-p:Build=true \
|
||||
-clp:NoSummary
|
||||
fi
|
||||
|
||||
# This incantation avoids unbound variable issues if msbuild_args is empty
|
||||
# https://stackoverflow.com/questions/7577052/bash-empty-array-expansion-with-set-u
|
||||
invoke_korebuild_command 'default-build' ${msbuild_args[@]+"${msbuild_args[@]}"}
|
||||
MSBuild $_InitializeToolset -p:RepoRoot="$repo_root" ${msbuild_args[@]+"${msbuild_args[@]}"}
|
||||
|
||||
ExitWithExitCode 0
|
||||
|
|
|
|||
|
|
@ -1,25 +0,0 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<AzureIntegrationProjectRoot>$(MSBuildThisFileDirectory)..\src\AzureIntegration\</AzureIntegrationProjectRoot>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target Name="BuildAzureIntegration">
|
||||
<PropertyGroup>
|
||||
<AzureIntegrationProjProperties>
|
||||
RepoRoot=$(AzureIntegrationProjectRoot);
|
||||
Configuration=$(Configuration);
|
||||
</AzureIntegrationProjProperties>
|
||||
</PropertyGroup>
|
||||
|
||||
<MSBuild Projects="$(MSBuildProjectFullPath)"
|
||||
Targets="$(AzureIntegrationProjectTargets)"
|
||||
Properties="$(AzureIntegrationProjProperties)" />
|
||||
|
||||
<ItemGroup>
|
||||
<AzureIntegrationArtifacts Include="$(AzureIntegrationProjectRoot)artifacts\build\*" />
|
||||
</ItemGroup>
|
||||
|
||||
<Copy SourceFiles="@(AzureIntegrationArtifacts)" DestinationFolder="$(ArtifactsShippingPackagesDir)" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
<Project>
|
||||
|
||||
<ItemGroup>
|
||||
<!--
|
||||
Use the PublicKeyToken of .NET assemblies to determine with authenticode cert to use.
|
||||
'None' is required to ensure code signing does not attempt to re-sign them or submit
|
||||
to ESPR for strong-naming signing. We don't delay sign, so we only need to authenticode sign.
|
||||
See https://github.com/dotnet/arcade/issues/1911 for context.
|
||||
-->
|
||||
<!-- The AspNetCore strong name. -->
|
||||
<AssemblyToSign Include="None" PublicKeyToken="adb9793829ddae60" CertificateName="Microsoft400" />
|
||||
<!-- The MsSharedLib72 strong name. -->
|
||||
<AssemblyToSign Include="None" PublicKeyToken="31bf3856ad364e35" CertificateName="Microsoft400" />
|
||||
<!-- The MsftStrongName strong name. -->
|
||||
<AssemblyToSign Include="None" PublicKeyToken="b03f5f7f11d50a3a" CertificateName="Microsoft400" />
|
||||
<!-- The MsftStrongName2 strong name. -->
|
||||
<AssemblyToSign Include="None" PublicKeyToken="b77a5c561934e089" CertificateName="Microsoft400" />
|
||||
<!-- The MsftOpenStrongName strong name. -->
|
||||
<AssemblyToSign Include="None" PublicKeyToken="cc7b13ffcd2ddd51" CertificateName="Microsoft400" />
|
||||
|
||||
<!-- Native .dll's. These don't have a public key token, but are from Microsoft and should be signed. -->
|
||||
<FileNamesToSign Include="aspnetcore.dll" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="aspnetcorev2_inprocess.dll" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="aspnetcorev2_outofprocess.dll" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="aspnetcorev2.dll" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="blazor-devserver.exe" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="dotnet-dev-certs.exe" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="dotnet-sql-cache.exe" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="dotnet-user-secrets.exe" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="dotnet-watch.exe" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="Microsoft.AspNetCore.Blazor.Build.exe" CertificateName="Microsoft400" />
|
||||
<FileNamesToSign Include="sni.dll" CertificateName="Microsoft400" />
|
||||
|
||||
<!-- Third-party components which should be signed. -->
|
||||
<FileNamesToSign Include="Newtonsoft.Json.dll" CertificateName="3PartySHA2" />
|
||||
<FileNamesToSign Include="AngleSharp.dll" CertificateName="3PartySHA2" />
|
||||
<FileNamesToSign Include="Mono.Cecil.dll" CertificateName="3PartySHA2" />
|
||||
<FileNamesToSign Include="Mono.Cecil.Mdb.dll" CertificateName="3PartySHA2" />
|
||||
<FileNamesToSign Include="Mono.Cecil.Pdb.dll" CertificateName="3PartySHA2" />
|
||||
<FileNamesToSign Include="Mono.Cecil.Rocks.dll" CertificateName="3PartySHA2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Label="Code sign exclusions">
|
||||
<!-- We don't need to code sign .js files because they are not used in Windows Script Host. -->
|
||||
<FileExtensionsToSign Include=".js" CertificateName="None" />
|
||||
<!-- We don't produce font files. We rebundle some for using the web brower, so they do not need to be signed. -->
|
||||
<FileExtensionsToSign Include=".otf" CertificateName="None" />
|
||||
<FileExtensionsToSign Include=".ttf" CertificateName="None" />
|
||||
<!-- This is a text file which doesn't need to be code signed, even though some .mof files can be signed. -->
|
||||
<FileNamesToSign Include="ancm.mof" CertificateName="None" />
|
||||
<!-- Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it. -->
|
||||
<FileNamesToSign Include="apphost.exe" CertificateName="None" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
<Project>
|
||||
|
||||
<PropertyGroup>
|
||||
<CodeSignDependsOn>$(CodeSignDependsOn);CollectFileSignInfo</CodeSignDependsOn>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- Configures signcheck to inspect well-known folders for signed content. -->
|
||||
<SignCheckDirectory Include="$(ArtifactsPackagesDir.TrimEnd('\'))" />
|
||||
<SignCheckDirectory Include="$(InstallersOutputPath.TrimEnd('\'))" />
|
||||
<SignCheckDirectory Include="$(VisualStudioSetupOutputPath.TrimEnd('\'))" />
|
||||
<!-- KoreBuild by default scans everything in artifacts/, but this causes problems because we put unsigned content in artifacts/obj/ and bin/ which can be ignored. -->
|
||||
<SignCheckDirectory Remove="$(ArtifactsDir)" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="CollectFileSignInfo">
|
||||
<PropertyGroup>
|
||||
<BaseRedistNetCorePath>$(ArtifactsDir)obj\RedistSharedFx.Layout\$(Configuration)\</BaseRedistNetCorePath>
|
||||
<RedistNetCorePath>$(BaseRedistNetCorePath)$(TargetRuntimeIdentifier)\</RedistNetCorePath>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<FilesToSign Include="$(ArtifactsShippingPackagesDir)*.jar" Certificate="MicrosoftJARSHA2" />
|
||||
<FilesToSign Include="$(ArtifactsShippingPackagesDir)*.nupkg" Exclude="$(ArtifactsShippingPackagesDir)*.symbols.nupkg" Certificate="NuGet" />
|
||||
<FilesToSign Include="$(ArtifactsNonShippingPackagesDir)*.nupkg" Exclude="$(ArtifactsNonShippingPackagesDir)*.symbols.nupkg" Certificate="NuGet" />
|
||||
<FilesToSign Include="$(VisualStudioSetupOutputPath)*.vsix" Certificate="VsixSHA2" />
|
||||
<!-- "None" means don't sign the .zip file itself, but still scan the contents of the .zip for signable files. -->
|
||||
<FilesToSign Include="$(InstallersOutputPath)*.zip" Certificate="None" />
|
||||
|
||||
<!--
|
||||
These files should already be signed by the .NET Core team. They have to be listed again here because we recreate a redistributable which includes the Microsoft.NETCore.App runtime.
|
||||
List all combinations of Windows RID's because CI may build multiple combinations of artitectures on the same machine.
|
||||
This uses globs because some of the file names change on every build of .NET Core, like sos_amd64_$(fileversion).dll.
|
||||
-->
|
||||
<FilesToExcludeFromSigning Include="$(BaseRedistNetCorePath)win-x64\shared\Microsoft.NETCore.App\**\*.dll" />
|
||||
<FilesToExcludeFromSigning Include="$(BaseRedistNetCorePath)win-x86\shared\Microsoft.NETCore.App\**\*.dll" />
|
||||
<FilesToExcludeFromSigning Include="$(BaseRedistNetCorePath)win-arm\shared\Microsoft.NETCore.App\**\*.dll" />
|
||||
<FilesToExcludeFromSigning Include="$(BaseRedistNetCorePath)win-x64\host\**\*.dll" />
|
||||
<FilesToExcludeFromSigning Include="$(BaseRedistNetCorePath)win-x86\host\**\*.dll" />
|
||||
<FilesToExcludeFromSigning Include="$(BaseRedistNetCorePath)win-arm\host\**\*.dll" />
|
||||
<FilesToExcludeFromSigning Include="$(RedistNetCorePath)dotnet.exe" />
|
||||
<FilesToExcludeFromSigning Include="hostpolicy.dll" />
|
||||
<FilesToExcludeFromSigning Include="hostfxr.dll" />
|
||||
</ItemGroup>
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<BuildSharedFxDependsOn>_BuildSharedFxProjects;RemoveSharedFrameworkOnlyRefsFromNuspec</BuildSharedFxDependsOn>
|
||||
<BuildSharedFxDependsOn Condition="'$(TestOnly)' != 'true'">$(BuildSharedFxDependsOn);CodeSign</BuildSharedFxDependsOn>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<FxProjectToBuild Condition=" '$(TargetRuntimeIdentifier)' == 'linux-x64' AND '$(LinuxInstallerType)' == 'deb' " Include="$(RepoRoot)src\Installers\Debian\**\*.*proj" />
|
||||
<FxProjectToBuild Condition=" '$(TargetRuntimeIdentifier)' == 'linux-x64' AND '$(LinuxInstallerType)' == 'rpm' " Include="$(RepoRoot)src\Installers\Rpm\**\*.*proj" />
|
||||
|
||||
<FxProjectToBuild Condition=" '$(BuildSiteExtensions)' == 'true' " Include="$(RepoRoot)src\SiteExtensions\Runtime\Microsoft.AspNetCore.Runtime.SiteExtension.pkgproj" />
|
||||
<FxProjectToBuild Condition=" '$(BuildSiteExtensions)' == 'true' " Include="$(RepoRoot)src\SiteExtensions\LoggingBranch\LB.csproj" />
|
||||
|
||||
<FxProjectToBuild Condition=" '$(TargetRuntimeIdentifier)' == 'win-x86' " Include="$(RepoRoot)src\Framework\src\Microsoft.AspNetCore.App.Runtime.csproj" />
|
||||
<FxProjectToBuild Condition=" '$(TargetRuntimeIdentifier)' == 'win-x86' " Include="$(RepoRoot)src\Servers\IIS\AspNetCoreModuleV2\Symbols\Microsoft.AspNetCore.ANCMSymbols.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<Target Name="BuildSharedFx" DependsOnTargets="$(BuildSharedFxDependsOn)" />
|
||||
|
||||
<Target Name="_BuildSharedFxProjects" Condition="@(FxProjectToBuild->Count()) != 0">
|
||||
|
||||
<PropertyGroup>
|
||||
<_RestoreGraphProjectInput>@(FxProjectToBuild)</_RestoreGraphProjectInput>
|
||||
</PropertyGroup>
|
||||
|
||||
<MSBuild Projects="$(NuGetRestoreTargets)"
|
||||
Targets="Restore"
|
||||
Properties="$(BuildProperties);RestoreGraphProjectInput=$(_RestoreGraphProjectInput);_DummyTarget=Restore" />
|
||||
|
||||
<MSBuild Projects="@(FxProjectToBuild)"
|
||||
Properties="$(BuildProperties)"
|
||||
BuildInParallel="true" />
|
||||
<!-- BuildInParallel="false" because dotnet store runs during site extension build and is failing if packages are being currently generated -->
|
||||
<MSBuild Projects="@(FxProjectToBuild)"
|
||||
Targets="Pack"
|
||||
Properties="$(BuildProperties);NoBuild=true"
|
||||
BuildInParallel="false"
|
||||
SkipNonexistentTargets="true" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
|
|
@ -1,158 +0,0 @@
|
|||
<Project>
|
||||
<Import Project="AzureIntegration.targets" />
|
||||
<Import Project="SharedFx.targets" />
|
||||
<Import Project="CodeSign.targets" />
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- Reset the default korebuild lifecycle. -->
|
||||
<BuildDependsOn>Prepare</BuildDependsOn>
|
||||
<!-- Map bootstrapper flags to KoreBuild targets -->
|
||||
<BuildDependsOn Condition=" '$(_RunBuild)' == 'true' ">$(BuildDependsOn);Compile</BuildDependsOn>
|
||||
<BuildDependsOn Condition=" '$(_RunPack)' == 'true' ">$(BuildDependsOn);Package</BuildDependsOn>
|
||||
<BuildDependsOn Condition=" '$(_RunTests)' == 'true' ">$(BuildDependsOn);Test;Verify</BuildDependsOn>
|
||||
<SkipTests Condition=" '$(_RunTests)' != 'true' ">true</SkipTests>
|
||||
<DisableCodeSigning Condition=" '$(_RunSign)' != 'true' OR '$(OS)' != 'Windows_NT' ">true</DisableCodeSigning>
|
||||
|
||||
<CleanDependsOn>$(CleanDependsOn);CleanArtifacts</CleanDependsOn>
|
||||
|
||||
<RestoreDependsOn>$(RestoreDependsOn);InstallDotNet;RestoreProjects</RestoreDependsOn>
|
||||
|
||||
<CompileDependsOn />
|
||||
<CompileDependsOn>$(CompileDependsOn);BuildProjects</CompileDependsOn>
|
||||
|
||||
<PackageDependsOn>$(PackageDependsOn);PackProjects</PackageDependsOn>
|
||||
<PackageDependsOn Condition=" '$(BuildAllProjects)' == 'true' ">$(PackageDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec;BuildSharedFx</PackageDependsOn>
|
||||
|
||||
<TestDependsOn />
|
||||
<TestDependsOn Condition=" '$(_RunBuild)' == 'true' ">$(TestDependsOn);Compile</TestDependsOn>
|
||||
<TestDependsOn>$(TestDependsOn);TestProjects</TestDependsOn>
|
||||
|
||||
<BuildDependsOn Condition="'$(CI)' == 'true'">$(BuildDependsOn);GenerateBuildAssetManifest</BuildDependsOn>
|
||||
|
||||
<!-- Package modification must happen before code signing. -->
|
||||
<CodeSignDependsOn>$(CodeSignDependsOn);RemoveSharedFrameworkOnlyRefsFromNuspec</CodeSignDependsOn>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target Name="ShowProjectClosure" DependsOnTargets="ResolveProjects">
|
||||
<MSBuild Targets="_CustomCollectProjectReference"
|
||||
BuildInParallel="true"
|
||||
SkipNonexistentTargets="true"
|
||||
Projects="@(ProjectToBuild)"
|
||||
Properties="DesignTimeBuild=true"
|
||||
RebaseOutputs="True">
|
||||
<Output TaskParameter="TargetOutputs" ItemName="_ReferenceProject" />
|
||||
</MSBuild>
|
||||
<RemoveDuplicates Inputs="@(_ReferenceProject->'%(FullPath)')">
|
||||
<Output TaskParameter="Filtered" ItemName="ReferencedProjects" />
|
||||
</RemoveDuplicates>
|
||||
<Message Importance="High" Text="Projects referenced:" />
|
||||
<Message Importance="High" Text=" - %(ReferencedProjects.Identity)" />
|
||||
|
||||
<WriteLinesToFile Lines="@(ReferencedProjects)" File="$(ProjectsReferencedOutFile)" Overwrite="true" Condition="'$(ProjectsReferencedOutFile)' != ''" />
|
||||
</Target>
|
||||
|
||||
<Target Name="GenerateProjectList" DependsOnTargets="ResolveProjects">
|
||||
<MSBuild Projects="@(ProjectToBuild)"
|
||||
Targets="GetReferencesProvided"
|
||||
BuildInParallel="true"
|
||||
SkipNonexistentTargets="true"
|
||||
SkipNonexistentProjects="true" >
|
||||
|
||||
<Output TaskParameter="TargetOutputs" ItemName="_ProjectReferenceProvider"/>
|
||||
</MSBuild>
|
||||
|
||||
<ItemGroup>
|
||||
<_SharedFrameworkAndPackageRef Include="@(_ProjectReferenceProvider->WithMetadataValue('IsAspNetCoreApp','true')->WithMetadataValue('IsShippingPackage', 'true')->Distinct())" />
|
||||
<_SharedFrameworkRef Include="@(_ProjectReferenceProvider->WithMetadataValue('IsAspNetCoreApp','true')->WithMetadataValue('IsShippingPackage', 'false')->Distinct())" />
|
||||
<_ProjectReferenceProviderWithRefAssembly Include="@(_ProjectReferenceProvider->HasMetadata('ReferenceAssemblyProjectFileRelativePath'))" />
|
||||
<_ProjectReferenceProvider Remove="@(_ProjectReferenceProviderWithRefAssembly)" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<ProjectListFile>$(MSBuildThisFileDirectory)..\eng\ProjectReferences.props</ProjectListFile>
|
||||
<ProjectListContent><![CDATA[<!--
|
||||
This file is automatically generated. Run `./eng/scripts/GenerateProjectList.ps1` to update.
|
||||
|
||||
This file contains a map of assembly names to the projects that build them.
|
||||
-->
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
@(_ProjectReferenceProvider->'<ProjectReferenceProvider Include="%(Identity)" ProjectPath="%24(RepoRoot)%(ProjectFileRelativePath)" />', '%0A ')
|
||||
@(_ProjectReferenceProviderWithRefAssembly->'<ProjectReferenceProvider Include="%(Identity)" ProjectPath="%24(RepoRoot)%(ProjectFileRelativePath)" RefProjectPath="%24(RepoRoot)%(ReferenceAssemblyProjectFileRelativePath)" />', '%0A ')
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
]]></ProjectListContent>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Workaround https://github.com/Microsoft/msbuild/issues/1024 -->
|
||||
<WriteLinesToFile Condition="'$(OS)' == 'Windows_NT'"
|
||||
File="$(ProjectListFile)" Lines="$([MSBuild]::Escape($(ProjectListContent)))" Overwrite="true" />
|
||||
<Exec Condition="'$(OS)' != 'Windows_NT'"
|
||||
Command="echo '$(ProjectListContent.Replace('\t','\\t'))' > $(ProjectListFile)" />
|
||||
|
||||
<PropertyGroup>
|
||||
<SharedFxDepList>$(MSBuildThisFileDirectory)..\eng\SharedFramework.Local.props</SharedFxDepList>
|
||||
<SharedFxDepListContent>
|
||||
<![CDATA[
|
||||
<!--
|
||||
This file is automatically generated. Run `./eng/scripts/GenerateProjectList.ps1` to update.
|
||||
|
||||
This file contains a complete list of the assemblies which are part of the shared framework.
|
||||
|
||||
This project is generated using the <IsAspNetCoreApp> and <IsShippingPackage> properties from each .csproj in this repository.
|
||||
-->
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
<!-- These assemblies are available as both a NuGet package and in the shared framework -->
|
||||
@(_SharedFrameworkAndPackageRef->'<AspNetCoreAppReferenceAndPackage Include="%(Identity)" />', '%0A ')
|
||||
|
||||
<!-- These assemblies are only in the shared framework -->
|
||||
@(_SharedFrameworkRef->'<AspNetCoreAppReference Include="%(Identity)" />', '%0A ')
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
]]>
|
||||
</SharedFxDepListContent>
|
||||
</PropertyGroup>
|
||||
|
||||
<WriteLinesToFile File="$(SharedFxDepList)" Lines="$(SharedFxDepListContent)" Overwrite="true" />
|
||||
</Target>
|
||||
|
||||
<Target Name="GenerateReferenceSources">
|
||||
<MSBuild
|
||||
Projects="@(ProjectToBuild)"
|
||||
Targets="GenerateReferenceSource"
|
||||
SkipNonexistentTargets="true"
|
||||
SkipNonexistentProjects="true" />
|
||||
</Target>
|
||||
|
||||
<!-- This is temporary until we can use FrameworkReference to build our own packages. -->
|
||||
<Target Name="RemoveSharedFrameworkOnlyRefsFromNuspec">
|
||||
<ItemGroup>
|
||||
<_BuildOutput Include="$(ArtifactsShippingPackagesDir)*.nupkg"
|
||||
Exclude="$(ArtifactsShippingPackagesDir)*.symbols.nupkg" />
|
||||
</ItemGroup>
|
||||
|
||||
<RepoTasks.RemoveSharedFrameworkDependencies Condition="@(_BuildOutput->Count()) != 0"
|
||||
Files="@(_BuildOutput)"
|
||||
FrameworkOnlyPackages="@(AspNetCoreAppReference)"
|
||||
SharedFrameworkTargetFramework="netcoreapp$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)" />
|
||||
</Target>
|
||||
|
||||
<Target Name="GenerateBuildAssetManifest">
|
||||
<!-- Generate build manifests. These manifests are used by Maestro and the Build Asset Registry to flow dependencies to other repos. -->
|
||||
<MSBuild Projects="$(MSBuildThisFileDirectory)Maestro\Maestro.csproj"
|
||||
Targets="Restore"
|
||||
Properties="$(BuildProperties);__DummyTarget=Restore" />
|
||||
|
||||
<MSBuild Projects="$(MSBuildThisFileDirectory)Maestro\Maestro.csproj"
|
||||
Targets="GenerateBuildAssetManifest"
|
||||
Properties="$(BuildProperties);__DummyTarget=GenerateBuildAssetManifest" />
|
||||
</Target>
|
||||
|
||||
<Target Name="Helix">
|
||||
<MSBuild Projects="$(MSBuildThisFileDirectory)..\eng\helix\helix.proj"
|
||||
Targets="Test"
|
||||
Properties="$(BuildProperties);$(SolutionProperties);"
|
||||
ContinueOnError="ErrorAndStop" />
|
||||
</Target>
|
||||
</Project>
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
<Project>
|
||||
|
||||
<ItemGroup>
|
||||
<DotNetCoreRuntime Include="$(MicrosoftNETCoreAppRuntimeVersion)"
|
||||
Feed="$(DotNetAssetRootUrl)"
|
||||
FeedCredential="$(DotNetAssetRootAccessTokenSuffix)" />
|
||||
|
||||
<DotNetCoreRuntime Condition="'$(OS)' == 'Windows_NT'"
|
||||
Include="$(MicrosoftNETCoreAppRuntimeVersion)"
|
||||
Arch="x86"
|
||||
Feed="$(DotNetAssetRootUrl)"
|
||||
FeedCredential="$(DotNetAssetRootAccessTokenSuffix)" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -1,47 +0,0 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace Microsoft.DotNet.Build.Tasks
|
||||
{
|
||||
internal static class FileUtilities
|
||||
{
|
||||
public static Version GetFileVersion(string sourcePath)
|
||||
{
|
||||
var fvi = FileVersionInfo.GetVersionInfo(sourcePath);
|
||||
|
||||
return fvi != null
|
||||
? new Version(fvi.FileMajorPart, fvi.FileMinorPart, fvi.FileBuildPart, fvi.FilePrivatePart)
|
||||
: null;
|
||||
}
|
||||
|
||||
private static readonly HashSet<string> _assemblyExtensions = new HashSet<string>(new[] { ".dll", ".exe", ".winmd" }, StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public static Version TryGetAssemblyVersion(string sourcePath)
|
||||
{
|
||||
var extension = Path.GetExtension(sourcePath);
|
||||
|
||||
return _assemblyExtensions.Contains(extension)
|
||||
? GetAssemblyVersion(sourcePath)
|
||||
: null;
|
||||
}
|
||||
|
||||
private static Version GetAssemblyVersion(string sourcePath)
|
||||
{
|
||||
try
|
||||
{
|
||||
return AssemblyName.GetAssemblyName(sourcePath)?.Version;
|
||||
}
|
||||
catch (BadImageFormatException)
|
||||
{
|
||||
// If an .dll file cannot be read, it may be a native .dll which would not have an assembly version.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Import Project="$(RepoTasksSdkPath)\Sdk.props" Condition="'$(RepoTasksSdkPath)' != '' "/>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework Condition="'$(MSBuildRuntimeType)' == 'Core' ">netcoreapp3.0</TargetFramework>
|
||||
<TargetFramework Condition="'$(MSBuildRuntimeType)' != 'Core' ">net472</TargetFramework>
|
||||
<DefineConstants Condition="'$(BuildInstallers)' == 'true' AND '$(TargetOsName)' == 'win'">$(DefineConstants);BUILD_MSI_TASKS</DefineConstants>
|
||||
<Optimize>false</Optimize>
|
||||
<DebugType>embedded</DebugType>
|
||||
<DisablePackageReferenceRestrictions>true</DisablePackageReferenceRestrictions>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="NuGet.Build.Tasks" Version="5.1.0-rtm.5921" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="2.1.0" />
|
||||
<PackageReference Include="Yarn.MSBuild" Version="1.15.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(BuildInstallers)' == 'true' AND '$(TargetOsName)' == 'win'">
|
||||
<PackageReference Include="Wix" Version="3.11.1" />
|
||||
|
||||
<Reference Include="Microsoft.Deployment.WindowsInstaller">
|
||||
<HintPath>$(WiXSdkPath)\Microsoft.Deployment.WindowsInstaller.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Deployment.WindowsInstaller.Package">
|
||||
<HintPath>$(WiXSdkPath)\Microsoft.Deployment.WindowsInstaller.Package.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(RepoTasksSdkPath)\Sdk.targets" Condition="'$(RepoTasksSdkPath)' != '' "/>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Update="Newtonsoft.Json" PrivateAssets="" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<_RepoTaskAssembly>$(MSBuildThisFileDirectory)bin\publish\RepoTasks.dll</_RepoTaskAssembly>
|
||||
</PropertyGroup>
|
||||
|
||||
<UsingTask TaskName="RepoTasks.GenerateGuid" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
<UsingTask TaskName="RepoTasks.GetMsiProperty" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
<UsingTask TaskName="RepoTasks.GenerateSharedFrameworkDepsFile" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
<UsingTask TaskName="RepoTasks.RemoveSharedFrameworkDependencies" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
</Project>
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 16
|
||||
VisualStudioVersion = 16.0.0.0
|
||||
MinimumVisualStudioVersion = 16.0.0.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RepoTasks", "RepoTasks.csproj", "{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Release|x64.Build.0 = Release|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{A114791F-35B7-4E5B-8E5B-9A91E0B6E4AE}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
@ -29,7 +29,7 @@ __usage() {
|
|||
echo " -e, --env <NAME=VAL> Additional environment variables to add to the build container"
|
||||
echo ""
|
||||
echo "Description:"
|
||||
echo " This will run build.sh inside the dockerfile as defined in build/docker/\$image.Dockerfile."
|
||||
echo " This will run build.sh inside the dockerfile as defined in eng/docker/\$image.Dockerfile."
|
||||
|
||||
if [[ "${1:-}" != '--no-exit' ]]; then
|
||||
exit 2
|
||||
|
|
@ -101,7 +101,7 @@ if [ ! -z "$commit_hash" ]; then
|
|||
build_args[${#build_args[*]}]="-p:SourceRevisionId=$commit_hash"
|
||||
fi
|
||||
|
||||
dockerfile="$DIR/build/docker/$image.Dockerfile"
|
||||
dockerfile="$DIR/eng/docker/$image.Dockerfile"
|
||||
tagname="aspnetcore-build-$image"
|
||||
|
||||
# Use docker pull with retries to pre-pull the image need by the dockerfile
|
||||
|
|
@ -130,8 +130,7 @@ docker build "$(dirname "$dockerfile")" \
|
|||
docker run \
|
||||
--rm \
|
||||
-t \
|
||||
-e CI \
|
||||
-e TEAMCITY_VERSION \
|
||||
-e TF_BUILD \
|
||||
-e BUILD_NUMBER \
|
||||
-e BUILD_BUILDNUMBER \
|
||||
-e BUILD_REPOSITORY_URI \
|
||||
|
|
|
|||
|
|
@ -95,10 +95,6 @@ The cause of this problem is that the solution you are using does not include th
|
|||
```
|
||||
dotnet sln add C:\src\AspNetCore\src\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj
|
||||
```
|
||||
Or you can use this script to automatically traverse the project reference graph, which then invokes `dotnet sln` for you: [eng/scripts/AddAllProjectRefsToSolution.ps1](/eng/scripts/AddAllProjectRefsToSolution.ps1).
|
||||
```
|
||||
./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir src/Mvc/
|
||||
```
|
||||
|
||||
## Building with Visual Studio Code
|
||||
|
||||
|
|
|
|||
|
|
@ -13,13 +13,13 @@ To run Helix tests for one particular test project:
|
|||
|
||||
```
|
||||
cd src/MyCode/test
|
||||
dotnet build /t:Helix
|
||||
dotnet msbuild /t:Helix
|
||||
```
|
||||
|
||||
To run tests for the entire repo, run:
|
||||
|
||||
```
|
||||
.\build.cmd /t:Helix
|
||||
.\eng\scripts\TestHelix.ps1
|
||||
```
|
||||
|
||||
This will restore, and then publish all of the test projects including some bootstrapping scripts that will install the correct dotnet runtime/sdk before running the test assemblies on the helix machine, and upload the job to helix, it won't wait for the jobs to complete, but you can go to https://mc.dot.net/#/user/$(your user name)/builds.
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
<Project>
|
||||
|
||||
<Import Project="tools\RepoTasks\RepoTasks.tasks" />
|
||||
<Import Project="SharedFramework.External.props" />
|
||||
<Import Project="SharedFramework.Local.props" />
|
||||
|
||||
<!-- This is temporary until we can use FrameworkReference to build our own packages. -->
|
||||
<Target Name="RemoveSharedFrameworkOnlyRefsFromNuspec" AfterTargets="Pack">
|
||||
<ItemGroup>
|
||||
<_BuildOutput Include="$(ArtifactsShippingPackagesDir)*.nupkg"
|
||||
Exclude="$(ArtifactsShippingPackagesDir)*.symbols.nupkg" />
|
||||
</ItemGroup>
|
||||
|
||||
<RepoTasks.RemoveSharedFrameworkDependencies Condition="@(_BuildOutput->Count()) != 0"
|
||||
Files="@(_BuildOutput)"
|
||||
FrameworkOnlyPackages="@(AspNetCoreAppReference)"
|
||||
SharedFrameworkTargetFramework="netcoreapp$(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion)" />
|
||||
</Target>
|
||||
|
||||
<Target Name="GenerateBuildAssetManifest" AfterTargets="Pack" Condition="'$(ContinuousIntegrationBuild)' == 'true'">
|
||||
<!-- Generate build manifests. These manifests are used by Maestro and the Build Asset Registry to flow dependencies to other repos. -->
|
||||
<MSBuild Projects="$(MSBuildThisFileDirectory)tools\Maestro\Maestro.csproj"
|
||||
Targets="Restore"
|
||||
Properties="__DummyTarget=Restore" />
|
||||
|
||||
<MSBuild Projects="$(MSBuildThisFileDirectory)tools\Maestro\Maestro.csproj"
|
||||
Targets="GenerateBuildAssetManifest"
|
||||
Properties="__DummyTarget=GenerateBuildAssetManifest" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
|
|
@ -10,31 +10,6 @@
|
|||
<BuildJava>true</BuildJava>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- This repo does not have solutions to build -->
|
||||
<DisableDefaultTargets>true</DisableDefaultTargets>
|
||||
<DisableDefaultItems>true</DisableDefaultItems>
|
||||
<BuildSolutions>false</BuildSolutions>
|
||||
<BuildSiteExtensions Condition="('$(TargetRuntimeIdentifier)' == 'win-x64' OR '$(TargetRuntimeIdentifier)' == 'win-x86') AND '$(BuildSiteExtensions)' == ''">true</BuildSiteExtensions>
|
||||
|
||||
<OverridePackageOutputPath>false</OverridePackageOutputPath>
|
||||
|
||||
<ArtifactsPackagesDir>$(ArtifactsDir)packages\$(Configuration)\</ArtifactsPackagesDir>
|
||||
<ArtifactsShippingPackagesDir>$(ArtifactsPackagesDir)Shipping\</ArtifactsShippingPackagesDir>
|
||||
<ArtifactsNonShippingPackagesDir>$(ArtifactsPackagesDir)NonShipping\</ArtifactsNonShippingPackagesDir>
|
||||
<InstallersOutputPath>$(ArtifactsDir)installers\$(Configuration)\</InstallersOutputPath>
|
||||
<VisualStudioSetupOutputPath>$(ArtifactsDir)VSSetup\$(Configuration)\</VisualStudioSetupOutputPath>
|
||||
<LogOutputDir>$(ArtifactsDir)log\</LogOutputDir>
|
||||
|
||||
<SignCheckExclusionsFile>$(RepoRoot)eng\signcheck.exclusions.txt</SignCheckExclusionsFile>
|
||||
|
||||
<!-- Disable the check which asserts that all managed .NET binaries we distribute are strong-named signed. Workaround for https://github.com/aspnet/AspNetCore-Internal/issues/1501 -->
|
||||
<DisableSignCheckStrongName>true</DisableSignCheckStrongName>
|
||||
|
||||
<SharedSourcesFolder>$(RepoRoot)src\Shared\</SharedSourcesFolder>
|
||||
<BuildIisNativeProjects Condition="'$(TargetOsName)' == 'win' AND ('$(TargetArchitecture)' == 'x86' OR '$(TargetArchitecture)' == 'x64')">true</BuildIisNativeProjects>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- These projects are always excluded, even when -projects is specified on command line. -->
|
||||
<ItemGroup>
|
||||
|
||||
|
|
@ -73,9 +48,9 @@
|
|||
|
||||
<Choose>
|
||||
<!-- Project selection can be overridden on the command line by passing in -projects -->
|
||||
<When Condition="'$(Projects)' != ''">
|
||||
<When Condition="'$(ProjectToBuild)' != ''">
|
||||
<ItemGroup>
|
||||
<ProjectToBuild Include="$(Projects)" Exclude="@(ProjectToExclude);$(RepoRoot)**\bin\**\*;$(RepoRoot)**\obj\**\*">
|
||||
<ProjectToBuild Include="$(ProjectToBuild)" Exclude="@(ProjectToExclude);$(RepoRoot)**\bin\**\*;$(RepoRoot)**\obj\**\*">
|
||||
<RestoreInParallel Condition="'%(Extension)' == '.npmproj'">false</RestoreInParallel>
|
||||
</ProjectToBuild>
|
||||
</ItemGroup>
|
||||
|
|
@ -108,9 +83,14 @@
|
|||
<ProjectToBuild Include="$(RepoRoot)src\Installers\Windows\WindowsHostingBundle\WindowsHostingBundle.wixproj" AdditionalProperties="Platform=x86" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectToBuild Include="$(RepoRoot)src\Servers\**\*.pkgproj" Condition=" '$(_RunPack)' == 'true' OR '$(BuildAllProjects)' == 'true' "/>
|
||||
<ItemGroup Condition="'$(BuildInstallers)' == 'true' AND '$(TargetRuntimeIdentifier)' == 'linux-x64'">
|
||||
<ProjectToBuild Condition=" '$(LinuxInstallerType)' == 'deb' "
|
||||
Include="$(RepoRoot)src\Installers\Debian\**\*.*proj" />
|
||||
<ProjectToBuild Condition=" '$(LinuxInstallerType)' == 'rpm' "
|
||||
Include="$(RepoRoot)src\Installers\Rpm\**\*.*proj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<NativeProjects Condition=" '$(TargetOsName)' == 'win' AND ('$(TargetArchitecture)' == 'x86' OR '$(TargetArchitecture)' == 'x64') "
|
||||
Include="$(RepoRoot)src\**\*.vcxproj" Exclude="@(ProjectToExclude)">
|
||||
<!-- Required to prevent triggering double-builds. See src\Servers\IIS\ResolveIisReferences.targets for details. -->
|
||||
|
|
@ -181,10 +161,4 @@
|
|||
</ItemGroup>
|
||||
</Otherwise>
|
||||
</Choose>
|
||||
|
||||
<Import Project="..\eng\Versions.props" />
|
||||
<Import Project="..\eng\SharedFramework.Local.props" />
|
||||
<Import Project="..\eng\SharedFramework.External.props" />
|
||||
<Import Project="runtimes.props" />
|
||||
<Import Project="CodeSign.props" />
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
<Project>
|
||||
|
||||
<PropertyGroup>
|
||||
<BuildManaged>true</BuildManaged>
|
||||
<RepoRoot>$([MSBuild]::NormalizeDirectory('$(MSBuildThisFileDirectory)', '..'))</RepoRoot>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="Build.props" />
|
||||
|
||||
<Target Name="GenerateProjectList">
|
||||
<Message Importance="High" Text="Analyzing @(ProjectToBuild->Count()) projects" />
|
||||
|
||||
<MSBuild Projects="@(ProjectToBuild)"
|
||||
Targets="GetReferencesProvided"
|
||||
BuildInParallel="true"
|
||||
SkipNonexistentTargets="true"
|
||||
SkipNonexistentProjects="true" >
|
||||
|
||||
<Output TaskParameter="TargetOutputs" ItemName="_ProjectReferenceProvider"/>
|
||||
</MSBuild>
|
||||
|
||||
<ItemGroup>
|
||||
<_SharedFrameworkAndPackageRef Include="@(_ProjectReferenceProvider->WithMetadataValue('IsAspNetCoreApp','true')->WithMetadataValue('IsShippingPackage', 'true')->Distinct())" />
|
||||
<_SharedFrameworkRef Include="@(_ProjectReferenceProvider->WithMetadataValue('IsAspNetCoreApp','true')->WithMetadataValue('IsShippingPackage', 'false')->Distinct())" />
|
||||
<_ProjectReferenceProviderWithRefAssembly Include="@(_ProjectReferenceProvider->HasMetadata('ReferenceAssemblyProjectFileRelativePath'))" />
|
||||
<_ProjectReferenceProvider Remove="@(_ProjectReferenceProviderWithRefAssembly)" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<ProjectListFile>$(MSBuildThisFileDirectory)ProjectReferences.props</ProjectListFile>
|
||||
<ProjectListContent><![CDATA[<!--
|
||||
This file is automatically generated. Run `./eng/scripts/GenerateProjectList.ps1` to update.
|
||||
|
||||
This file contains a map of assembly names to the projects that build them.
|
||||
-->
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
@(_ProjectReferenceProvider->'<ProjectReferenceProvider Include="%(Identity)" ProjectPath="%24(RepoRoot)%(ProjectFileRelativePath)" />', '%0A ')
|
||||
@(_ProjectReferenceProviderWithRefAssembly->'<ProjectReferenceProvider Include="%(Identity)" ProjectPath="%24(RepoRoot)%(ProjectFileRelativePath)" RefProjectPath="%24(RepoRoot)%(ReferenceAssemblyProjectFileRelativePath)" />', '%0A ')
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
]]></ProjectListContent>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Workaround https://github.com/Microsoft/msbuild/issues/1024 -->
|
||||
<WriteLinesToFile Condition="'$(OS)' == 'Windows_NT'"
|
||||
File="$(ProjectListFile)" Lines="$([MSBuild]::Escape($(ProjectListContent)))" Overwrite="true" />
|
||||
<Exec Condition="'$(OS)' != 'Windows_NT'"
|
||||
Command="echo '$(ProjectListContent.Replace('\t','\\t'))' > $(ProjectListFile)" />
|
||||
<Message Importance="High" Text="Generated $(ProjectListFile)" />
|
||||
|
||||
<PropertyGroup>
|
||||
<SharedFxDepList>$(MSBuildThisFileDirectory)SharedFramework.Local.props</SharedFxDepList>
|
||||
<SharedFxDepListContent>
|
||||
<![CDATA[
|
||||
<!--
|
||||
This file is automatically generated. Run `./eng/scripts/GenerateProjectList.ps1` to update.
|
||||
|
||||
This file contains a complete list of the assemblies which are part of the shared framework.
|
||||
|
||||
This project is generated using the <IsAspNetCoreApp> and <IsShippingPackage> properties from each .csproj in this repository.
|
||||
-->
|
||||
<Project>
|
||||
<ItemGroup>
|
||||
<!-- These assemblies are available as both a NuGet package and in the shared framework -->
|
||||
@(_SharedFrameworkAndPackageRef->'<AspNetCoreAppReferenceAndPackage Include="%(Identity)" />', '%0A ')
|
||||
|
||||
<!-- These assemblies are only in the shared framework -->
|
||||
@(_SharedFrameworkRef->'<AspNetCoreAppReference Include="%(Identity)" />', '%0A ')
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
]]>
|
||||
</SharedFxDepListContent>
|
||||
</PropertyGroup>
|
||||
|
||||
<WriteLinesToFile File="$(SharedFxDepList)" Lines="$(SharedFxDepListContent)" Overwrite="true" />
|
||||
<Message Importance="High" Text="Generated $(SharedFxDepList)" />
|
||||
</Target>
|
||||
|
||||
<Target Name="GenerateReferenceSources">
|
||||
<MSBuild
|
||||
Projects="@(ProjectToBuild)"
|
||||
Targets="GenerateReferenceSource"
|
||||
SkipNonexistentTargets="true"
|
||||
SkipNonexistentProjects="true" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
|
|
@ -6,13 +6,13 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<!-- Azure Pipelines Flakiness -->
|
||||
<PropertyGroup Condition="'$(AGENT_OS)' != ''">
|
||||
<PropertyGroup Condition="'$(TF_BUILD)' != ''">
|
||||
<_FlakyRunAdditionalArgs>$(_FlakyRunAdditionalArgs) -trait "Flaky:AzP:All=true" -trait "Flaky:AzP:OS:$(AGENT_OS)=true"</_FlakyRunAdditionalArgs>
|
||||
<_NonFlakyRunAdditionalArgs>$(_NonFlakyRunAdditionalArgs) -notrait "Flaky:AzP:All=true" -notrait "Flaky:AzP:OS:$(AGENT_OS)=true"</_NonFlakyRunAdditionalArgs>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TestRunnerAdditionalArguments Condition="'$(RunFlakyTests)' == ''">$(_NonFlakyRunAdditionalArgs)</TestRunnerAdditionalArguments>
|
||||
<TestRunnerAdditionalArguments Condition="'$(RunFlakyTests)' == 'true'">$(_FlakyRunAdditionalArgs)</TestRunnerAdditionalArguments>
|
||||
<TestRunnerAdditionalArguments Condition="'$(RunFlakyTests)' == ''">$(_NonFlakyRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
|
||||
<TestRunnerAdditionalArguments Condition="'$(RunFlakyTests)' == 'true'">$(_FlakyRunAdditionalArgs) $(TestRunnerAdditionalArguments)</TestRunnerAdditionalArguments>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -1,41 +0,0 @@
|
|||
{
|
||||
"adx": {
|
||||
"rules": [
|
||||
"AdxVerificationCompositeRule"
|
||||
],
|
||||
"packages": {
|
||||
"dotnet-watch": {
|
||||
"packageTypes": [
|
||||
"DotnetTool"
|
||||
]
|
||||
},
|
||||
"dotnet-sql-cache": {
|
||||
"packageTypes": [
|
||||
"DotnetTool"
|
||||
]
|
||||
},
|
||||
"dotnet-user-secrets": {
|
||||
"packageTypes": [
|
||||
"DotnetTool"
|
||||
]
|
||||
},
|
||||
"dotnet-dev-certs": {
|
||||
"packageTypes": [
|
||||
"DotnetTool"
|
||||
]
|
||||
},
|
||||
"Microsoft.AspNetCore.DeveloperCertificates.XPlat": {
|
||||
"Exclusions": {
|
||||
"DOC_MISSING": {
|
||||
"lib/netcoreapp3.0/Microsoft.AspNetCore.DeveloperCertificates.XPlat.dll": "Docs not required to shipoob package"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Default": {
|
||||
"rules": [
|
||||
"DefaultCompositeRule"
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -91,6 +91,9 @@
|
|||
This references are part of Microsoft.NETCore.App, so are listed here as references to be used during compilation only.
|
||||
-->
|
||||
<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0' or '$(TargetFramework)' == 'netstandard2.1'">
|
||||
<_CompilationOnlyReference Include="Microsoft.Win32.Registry" />
|
||||
<_CompilationOnlyReference Include="System.Security.Cryptography.Cng" />
|
||||
<_CompilationOnlyReference Include="System.Security.Principal.Windows" />
|
||||
<_CompilationOnlyReference Include="System.Buffers" />
|
||||
<_CompilationOnlyReference Include="System.ComponentModel.Annotations" />
|
||||
<_CompilationOnlyReference Include="System.Runtime.CompilerServices.Unsafe" />
|
||||
|
|
|
|||
|
|
@ -8,8 +8,15 @@
|
|||
<Project>
|
||||
<ItemGroup>
|
||||
<!-- These assemblies are available as both a NuGet package and in the shared framework -->
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.DataProtection.Abstractions" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Cryptography.Internal" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.DataProtection" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.DataProtection.Extensions" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Features" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Metadata" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.Extensions.Identity.Core" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.Extensions.Identity.Stores" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Connections.Abstractions" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Authorization" />
|
||||
<AspNetCoreAppReferenceAndPackage Include="Microsoft.AspNetCore.Http.Connections.Common" />
|
||||
|
|
@ -20,11 +27,6 @@
|
|||
|
||||
<!-- These assemblies are only in the shared framework -->
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.DataProtection.Abstractions" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Cryptography.Internal" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.DataProtection" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.DataProtection.Extensions" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Antiforgery" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Hosting.Abstractions" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Hosting" />
|
||||
|
|
@ -40,8 +42,6 @@
|
|||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.WebUtilities" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Html.Abstractions" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Identity" />
|
||||
<AspNetCoreAppReference Include="Microsoft.Extensions.Identity.Core" />
|
||||
<AspNetCoreAppReference Include="Microsoft.Extensions.Identity.Stores" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.HttpSys" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.IISIntegration" />
|
||||
<AspNetCoreAppReference Include="Microsoft.AspNetCore.Server.IIS" />
|
||||
|
|
|
|||
|
|
@ -0,0 +1,99 @@
|
|||
<Project>
|
||||
|
||||
<!-- See https://github.com/dotnet/arcade/blob/master/Documentation/CorePackages/Signing.md for details. -->
|
||||
|
||||
<ItemGroup>
|
||||
<!-- Reset Arcade's defaults. -->
|
||||
<ItemsToSign Remove="@(ItemsToSign)" />
|
||||
<StrongNameSignInfo Remove="@(StrongNameSignInfo)" />
|
||||
<FileExtensionSignInfo Remove="@(FileExtensionSignInfo)" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Label="Signing config">
|
||||
<ItemsToSign Include="$(ArtifactsPackagesDir)**\*.nupkg" Exclude="$(ArtifactsPackagesDir)**\*symbols.nupkg" />
|
||||
<ItemsToSign Include="$(VisualStudioSetupOutputPath)**\*.vsix" />
|
||||
<ItemsToSign Include="$(ArtifactsPackagesDir)**\*.jar" />
|
||||
<ItemsToSign Include="$(ArtifactsDir)installers\$(Configuration)\**\*.zip" />
|
||||
|
||||
<!--
|
||||
Map file extensions to a code-sign cert.
|
||||
"None" means don't sign the file itself, but still scan the contents for signable files.
|
||||
-->
|
||||
<FileExtensionSignInfo Include=".jar" CertificateName="MicrosoftJARSHA2" />
|
||||
<FileExtensionSignInfo Include=".ps1;.psd1;.psm1;.psc1" CertificateName="Microsoft400" />
|
||||
<FileExtensionSignInfo Include=".nupkg" CertificateName="NuGet" />
|
||||
<FileExtensionSignInfo Include=".vsix" CertificateName="VsixSHA2" />
|
||||
<FileExtensionSignInfo Include=".zip" CertificateName="None" />
|
||||
|
||||
<!--
|
||||
Use the PublicKeyToken of .NET assemblies to determine with authenticode cert to use.
|
||||
'None' is required to ensure code signing does not attempt to re-sign them or submit
|
||||
to ESPR for strong-naming signing. We don't delay sign, so we only need to authenticode sign.
|
||||
See https://github.com/dotnet/arcade/issues/1911 for context.
|
||||
-->
|
||||
<!-- The AspNetCore strong name. -->
|
||||
<StrongNameSignInfo Include="None" PublicKeyToken="adb9793829ddae60" CertificateName="Microsoft400" />
|
||||
<!-- The MsSharedLib72 strong name. -->
|
||||
<StrongNameSignInfo Include="None" PublicKeyToken="31bf3856ad364e35" CertificateName="Microsoft400" />
|
||||
<!-- The MsftStrongName strong name. -->
|
||||
<StrongNameSignInfo Include="None" PublicKeyToken="b03f5f7f11d50a3a" CertificateName="Microsoft400" />
|
||||
<!-- The MsftStrongName2 strong name. -->
|
||||
<StrongNameSignInfo Include="None" PublicKeyToken="b77a5c561934e089" CertificateName="Microsoft400" />
|
||||
<!-- The MsftOpenStrongName strong name. -->
|
||||
<StrongNameSignInfo Include="None" PublicKeyToken="cc7b13ffcd2ddd51" CertificateName="Microsoft400" />
|
||||
|
||||
<!-- Native .dll's. These don't have a public key token, but are from Microsoft and should be signed. -->
|
||||
<FileSignInfo Include="aspnetcore.dll" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="aspnetcorev2_inprocess.dll" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="aspnetcorev2_outofprocess.dll" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="aspnetcorev2.dll" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="blazor-devserver.exe" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="dotnet-dev-certs.exe" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="dotnet-sql-cache.exe" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="dotnet-user-secrets.exe" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="dotnet-watch.exe" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="Microsoft.AspNetCore.Blazor.Build.exe" CertificateName="Microsoft400" />
|
||||
<FileSignInfo Include="sni.dll" CertificateName="Microsoft400" />
|
||||
|
||||
<!-- Third-party components which should be signed. -->
|
||||
<FileSignInfo Include="Newtonsoft.Json.dll" CertificateName="3PartySHA2" />
|
||||
<FileSignInfo Include="AngleSharp.dll" CertificateName="3PartySHA2" />
|
||||
<FileSignInfo Include="Mono.Cecil.dll" CertificateName="3PartySHA2" />
|
||||
<FileSignInfo Include="Mono.Cecil.Mdb.dll" CertificateName="3PartySHA2" />
|
||||
<FileSignInfo Include="Mono.Cecil.Pdb.dll" CertificateName="3PartySHA2" />
|
||||
<FileSignInfo Include="Mono.Cecil.Rocks.dll" CertificateName="3PartySHA2" />
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetRuntimeIdentifier Condition="'$(TargetRuntimeIdentifier)' == ''">$(TargetOsName)-$(TargetArchitecture)</TargetRuntimeIdentifier>
|
||||
<BaseRedistNetCorePath>$(ArtifactsObjDir)RedistSharedFx.Layout\$(Configuration)\</BaseRedistNetCorePath>
|
||||
<RedistNetCorePath>$(BaseRedistNetCorePath)$(TargetRuntimeIdentifier)\</RedistNetCorePath>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup Label="Code sign exclusions">
|
||||
<!-- We don't need to code sign .js files because they are not used in Windows Script Host. -->
|
||||
<FileExtensionSignInfo Include=".js" CertificateName="None" />
|
||||
<!-- We don't produce font files. We rebundle some for using the web brower, so they do not need to be signed. -->
|
||||
<FileExtensionSignInfo Include=".otf" CertificateName="None" />
|
||||
<FileExtensionSignInfo Include=".ttf" CertificateName="None" />
|
||||
<!-- This is a text file which doesn't need to be code signed, even though some .mof files can be signed. -->
|
||||
<FileSignInfo Include="ancm.mof" CertificateName="None" />
|
||||
<!-- Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it. -->
|
||||
<FileSignInfo Include="apphost.exe" CertificateName="None" />
|
||||
|
||||
<!--
|
||||
These files should already be signed by the .NET Core team. They have to be listed again here because we recreate a redistributable which includes the Microsoft.NETCore.App runtime.
|
||||
List all combinations of Windows RID's because CI may build multiple combinations of artitectures on the same machine.
|
||||
This uses globs because some of the file names change on every build of .NET Core, like sos_amd64_$(fileversion).dll.
|
||||
-->
|
||||
<_DotNetFilesToExclude Include="$(BaseRedistNetCorePath)win-x64\shared\Microsoft.NETCore.App\**\*.dll" CertificateName="None" />
|
||||
<_DotNetFilesToExclude Include="$(BaseRedistNetCorePath)win-x86\shared\Microsoft.NETCore.App\**\*.dll" CertificateName="None" />
|
||||
<_DotNetFilesToExclude Include="$(BaseRedistNetCorePath)win-arm\shared\Microsoft.NETCore.App\**\*.dll" CertificateName="None" />
|
||||
<_DotNetFilesToExclude Include="$(BaseRedistNetCorePath)win-x64\host\**\*.dll" CertificateName="None" />
|
||||
<_DotNetFilesToExclude Include="$(BaseRedistNetCorePath)win-x86\host\**\*.dll" CertificateName="None" />
|
||||
<_DotNetFilesToExclude Include="$(BaseRedistNetCorePath)win-arm\host\**\*.dll" CertificateName="None" />
|
||||
<_DotNetFilesToExclude Include="$(RedistNetCorePath)dotnet.exe" CertificateName="None" />
|
||||
<FileSignInfo Include="@(_DotNetFilesToExclude->'%(FileName)%(Extension)'->Distinct())" CertificateName="None" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
<Project>
|
||||
<ItemGroup>
|
||||
<!--
|
||||
This is here to workaround flakiness in the NuGet SDK resolver in MSBuild.
|
||||
Arcade will run a pre-restore for these packages. This works more consistently than the SDK resolution which uses global.json.
|
||||
Without this here, we see regular failures with 'error MSB4236: The SDK 'Yarn.MSBuild' specified could not be found.'
|
||||
Since this project is evaluated before .npmproj files are loaded, this should cause the package to end
|
||||
up in the NuGet cache ahead of time.
|
||||
-->
|
||||
<PackageReference Include="Yarn.MSBuild" Version="1.15.2" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -9,25 +9,25 @@
|
|||
-->
|
||||
<Dependencies>
|
||||
<ProductDependencies>
|
||||
<Dependency Name="Microsoft.AspNetCore.Blazor.Mono" Version="0.10.0-preview7.19310.1">
|
||||
<Dependency Name="Microsoft.AspNetCore.Blazor.Mono" Version="0.10.0-preview7.19323.1">
|
||||
<Uri>https://github.com/aspnet/Blazor</Uri>
|
||||
<Sha>fc20643ca2493c56180e4f5a00946116a3b6afdc</Sha>
|
||||
<Sha>8df334032840bda9221fe281890e88fb1de06845</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview7.19316.1">
|
||||
<Dependency Name="Microsoft.AspNetCore.Razor.Language" Version="3.0.0-preview7.19321.2">
|
||||
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
|
||||
<Sha>271045bfd76b339ab1c8b2555507ad727b068aa3</Sha>
|
||||
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview7.19316.1">
|
||||
<Dependency Name="Microsoft.AspNetCore.Mvc.Razor.Extensions" Version="3.0.0-preview7.19321.2">
|
||||
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
|
||||
<Sha>271045bfd76b339ab1c8b2555507ad727b068aa3</Sha>
|
||||
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview7.19316.1">
|
||||
<Dependency Name="Microsoft.CodeAnalysis.Razor" Version="3.0.0-preview7.19321.2">
|
||||
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
|
||||
<Sha>271045bfd76b339ab1c8b2555507ad727b068aa3</Sha>
|
||||
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview7.19316.1">
|
||||
<Dependency Name="Microsoft.NET.Sdk.Razor" Version="3.0.0-preview7.19321.2">
|
||||
<Uri>https://github.com/aspnet/AspNetCore-Tooling</Uri>
|
||||
<Sha>271045bfd76b339ab1c8b2555507ad727b068aa3</Sha>
|
||||
<Sha>5e7c4e5e382a7e486d9416b711fcd65bae25808b</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="dotnet-ef" Version="3.0.0-preview7.19313.2">
|
||||
<Uri>https://github.com/aspnet/EntityFrameworkCore</Uri>
|
||||
|
|
@ -404,17 +404,17 @@
|
|||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||
<Sha>42b3a303ba27594637de04c78aaf9f1c7af6e303</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19302.2">
|
||||
<Dependency Name="Microsoft.DotNet.GenAPI" Version="1.0.0-beta.19323.4">
|
||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||
<Sha>e6a5d5f970bb872451c6310ae34eda31041fb552</Sha>
|
||||
<Sha>9946534da4f73e6242ca105f6798ab58119c9ab0</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="1.0.0-beta.19302.2">
|
||||
<Dependency Name="Microsoft.DotNet.Arcade.Sdk" Version="1.0.0-beta.19323.4">
|
||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||
<Sha>e6a5d5f970bb872451c6310ae34eda31041fb552</Sha>
|
||||
<Sha>9946534da4f73e6242ca105f6798ab58119c9ab0</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="2.0.0-beta.19302.2">
|
||||
<Dependency Name="Microsoft.DotNet.Helix.Sdk" Version="2.0.0-beta.19323.4">
|
||||
<Uri>https://github.com/dotnet/arcade</Uri>
|
||||
<Sha>e6a5d5f970bb872451c6310ae34eda31041fb552</Sha>
|
||||
<Sha>9946534da4f73e6242ca105f6798ab58119c9ab0</Sha>
|
||||
</Dependency>
|
||||
<Dependency Name="Microsoft.AspNetCore.Testing" Version="3.0.0-preview7.19312.4" CoherentParentDependency="Microsoft.EntityFrameworkCore">
|
||||
<Uri>https://github.com/aspnet/Extensions</Uri>
|
||||
|
|
|
|||
|
|
@ -52,7 +52,7 @@
|
|||
-->
|
||||
<PropertyGroup Label="Automated">
|
||||
<!-- Packages from dotnet/arcade -->
|
||||
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19302.2</MicrosoftDotNetGenAPIPackageVersion>
|
||||
<MicrosoftDotNetGenAPIPackageVersion>1.0.0-beta.19323.4</MicrosoftDotNetGenAPIPackageVersion>
|
||||
<!-- Packages from dotnet/core-setup -->
|
||||
<MicrosoftExtensionsDependencyModelPackageVersion>3.0.0-preview7-27812-08</MicrosoftExtensionsDependencyModelPackageVersion>
|
||||
<MicrosoftNETCoreAppRefPackageVersion>3.0.0-preview7-27812-08</MicrosoftNETCoreAppRefPackageVersion>
|
||||
|
|
@ -82,7 +82,7 @@
|
|||
<!-- Only listed explicitly to workaround https://github.com/dotnet/cli/issues/10528 -->
|
||||
<MicrosoftNETCorePlatformsPackageVersion>3.0.0-preview7.19312.3</MicrosoftNETCorePlatformsPackageVersion>
|
||||
<!-- Packages from aspnet/Blazor -->
|
||||
<MicrosoftAspNetCoreBlazorMonoPackageVersion>0.10.0-preview7.19310.1</MicrosoftAspNetCoreBlazorMonoPackageVersion>
|
||||
<MicrosoftAspNetCoreBlazorMonoPackageVersion>0.10.0-preview7.19323.1</MicrosoftAspNetCoreBlazorMonoPackageVersion>
|
||||
<!-- Packages from aspnet/Extensions -->
|
||||
<InternalAspNetCoreAnalyzersPackageVersion>3.0.0-preview7.19312.4</InternalAspNetCoreAnalyzersPackageVersion>
|
||||
<MicrosoftAspNetCoreAnalyzerTestingPackageVersion>3.0.0-preview7.19312.4</MicrosoftAspNetCoreAnalyzerTestingPackageVersion>
|
||||
|
|
@ -154,10 +154,10 @@
|
|||
<MicrosoftEntityFrameworkCoreToolsPackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCoreToolsPackageVersion>
|
||||
<MicrosoftEntityFrameworkCorePackageVersion>3.0.0-preview7.19313.2</MicrosoftEntityFrameworkCorePackageVersion>
|
||||
<!-- Packages from aspnet/AspNetCore-Tooling -->
|
||||
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19316.1</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
|
||||
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview7.19316.1</MicrosoftAspNetCoreRazorLanguagePackageVersion>
|
||||
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview7.19316.1</MicrosoftCodeAnalysisRazorPackageVersion>
|
||||
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview7.19316.1</MicrosoftNETSdkRazorPackageVersion>
|
||||
<MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>3.0.0-preview7.19321.2</MicrosoftAspNetCoreMvcRazorExtensionsPackageVersion>
|
||||
<MicrosoftAspNetCoreRazorLanguagePackageVersion>3.0.0-preview7.19321.2</MicrosoftAspNetCoreRazorLanguagePackageVersion>
|
||||
<MicrosoftCodeAnalysisRazorPackageVersion>3.0.0-preview7.19321.2</MicrosoftCodeAnalysisRazorPackageVersion>
|
||||
<MicrosoftNETSdkRazorPackageVersion>3.0.0-preview7.19321.2</MicrosoftNETSdkRazorPackageVersion>
|
||||
</PropertyGroup>
|
||||
<!--
|
||||
|
||||
|
|
|
|||
|
|
@ -1,18 +1,5 @@
|
|||
<!-- Use this file to workaround issues. List the issue tracking the item to fix so we can remove the workaround when the issue is resolved. -->
|
||||
<Project>
|
||||
<!-- Workaround https://github.com/Microsoft/msbuild/issues/4150 -->
|
||||
<!-- Evaluate this import here so we can override WixTargetsPath before wix.targets is imported -->
|
||||
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.wixproj'">
|
||||
<MSBuildProjectExtensionsPath>$(BaseIntermediateOutputPath)</MSBuildProjectExtensionsPath>
|
||||
<MSBuildProjectExtensionsPath Condition="'$(MSBuildProjectExtensionsPath)' == ''">$(MSBuildProjectDir)\obj\</MSBuildProjectExtensionsPath>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(MSBuildProjectExtensionsPath)$(MSBuildProjectFile).*.props" Condition=" '$(MSBuildProjectExtension)' == '.wixproj' " />
|
||||
<PropertyGroup Condition="'$(MSBuildProjectExtension)' == '.wixproj'">
|
||||
<!-- Suppress double-import in eng/targets/Wix.Common.props -->
|
||||
<_ProjectExtensionsWereImported>true</_ProjectExtensionsWereImported>
|
||||
<WixTargetsPath>$(WixInstallPath)\wix2010.targets</WixTargetsPath>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- Reset this to the Microsoft.NET.Sdk default to workaround Arcade's defaults, which sets IsPackable=false by default. -->
|
||||
<IsPackable />
|
||||
|
|
@ -44,4 +31,16 @@
|
|||
<PropertyGroup>
|
||||
<PublishWindowsPdb>false</PublishWindowsPdb>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<!-- Xunit output is piped into a file anyways, so color codes aren't useful. -->
|
||||
<TestRunnerAdditionalArguments>$(TestRunnerAdditionalArguments) -nocolor</TestRunnerAdditionalArguments>
|
||||
</PropertyGroup>
|
||||
|
||||
<!-- Workaround https://github.com/dotnet/roslyn/issues/27975 -->
|
||||
<PropertyGroup>
|
||||
<!-- We use the compiler toolset that comes from NuGet Packages rather than the SDK built-in.
|
||||
This one sets UseSharedCompilation to false by default. -->
|
||||
<UseSharedCompilation>true</UseSharedCompilation>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,11 @@
|
|||
@{
|
||||
IncludeRules=@('PSAvoidUsingCmdletAliases',
|
||||
'PSAvoidUsingWMICmdlet',
|
||||
'PSAvoidUsingPositionalParameters',
|
||||
'PSAvoidUsingInvokeExpression',
|
||||
'PSUseDeclaredVarsMoreThanAssignments',
|
||||
'PSUseCmdletCorrectly',
|
||||
'PSStandardDSCFunctionsInResource',
|
||||
'PSUseIdenticalMandatoryParametersForDSC',
|
||||
'PSUseIdenticalParametersForDSC')
|
||||
}
|
||||
|
|
@ -134,7 +134,7 @@ try {
|
|||
}
|
||||
catch {
|
||||
Write-Host $_.ScriptStackTrace
|
||||
Write-PipelineTaskError -Message $_
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -157,15 +157,15 @@ fetch_tizen_pkgs()
|
|||
Inform "Initialize arm base"
|
||||
fetch_tizen_pkgs_init standard base
|
||||
Inform "fetch common packages"
|
||||
fetch_tizen_pkgs armv7l gcc glibc glibc-devel libicu libicu-devel
|
||||
fetch_tizen_pkgs armv7l gcc glibc glibc-devel libicu libicu-devel libatomic
|
||||
fetch_tizen_pkgs noarch linux-glibc-devel
|
||||
Inform "fetch coreclr packages"
|
||||
fetch_tizen_pkgs armv7l lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel tizen-release lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu
|
||||
fetch_tizen_pkgs armv7l lldb lldb-devel libgcc libstdc++ libstdc++-devel libunwind libunwind-devel lttng-ust-devel lttng-ust userspace-rcu-devel userspace-rcu
|
||||
Inform "fetch corefx packages"
|
||||
fetch_tizen_pkgs armv7l libcom_err libcom_err-devel zlib zlib-devel libopenssl libopenssl-devel krb5 krb5-devel libcurl libcurl-devel
|
||||
|
||||
Inform "Initialize standard unified"
|
||||
fetch_tizen_pkgs_init standard unified
|
||||
Inform "fetch corefx packages"
|
||||
fetch_tizen_pkgs armv7l gssdp gssdp-devel
|
||||
fetch_tizen_pkgs armv7l gssdp gssdp-devel tizen-release
|
||||
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ if [ -z "$__RootfsDir" ] && [ ! -z "$ROOTFS_DIR" ]; then
|
|||
fi
|
||||
|
||||
if [ -z "$__RootfsDir" ]; then
|
||||
__RootfsDir="$__CrossDir/rootfs/$__BuildArch"
|
||||
__RootfsDir="$__CrossDir/../../../.tools/rootfs/$__BuildArch"
|
||||
fi
|
||||
|
||||
if [ -d "$__RootfsDir" ]; then
|
||||
|
|
@ -203,6 +203,7 @@ if [[ "$__LinuxCodeName" == "alpine" ]]; then
|
|||
-X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/main \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/v$__AlpineVersion/community \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/edge/testing \
|
||||
-X http://dl-cdn.alpinelinux.org/alpine/edge/main \
|
||||
-U --allow-untrusted --root $__RootfsDir --arch $__AlpineArch --initdb \
|
||||
add $__AlpinePackages
|
||||
rm -r $__ApkToolsDir
|
||||
|
|
|
|||
|
|
@ -11,10 +11,10 @@ function InstallDarcCli ($darcVersion) {
|
|||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = Invoke-Expression "& `"$dotnet`" tool list -g"
|
||||
$toolList = & "$dotnet" tool list -g
|
||||
|
||||
if ($toolList -like "*$darcCliPackageName*") {
|
||||
Invoke-Expression "& `"$dotnet`" tool uninstall $darcCliPackageName -g"
|
||||
& "$dotnet" tool uninstall $darcCliPackageName -g
|
||||
}
|
||||
|
||||
# If the user didn't explicitly specify the darc version,
|
||||
|
|
@ -22,12 +22,12 @@ function InstallDarcCli ($darcVersion) {
|
|||
if (-not $darcVersion) {
|
||||
$darcVersion = $(Invoke-WebRequest -Uri $versionEndpoint -UseBasicParsing).Content
|
||||
}
|
||||
|
||||
|
||||
$arcadeServicesSource = 'https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json'
|
||||
|
||||
Write-Host "Installing Darc CLI version $darcVersion..."
|
||||
Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed."
|
||||
Invoke-Expression "& `"$dotnet`" tool install $darcCliPackageName --version $darcVersion --add-source '$arcadeServicesSource' -v $verbosity -g"
|
||||
& "$dotnet" tool install $darcCliPackageName --version $darcVersion --add-source "$arcadeServicesSource" -v $verbosity -g
|
||||
}
|
||||
|
||||
InstallDarcCli $darcVersion
|
||||
|
|
|
|||
|
|
@ -25,7 +25,7 @@ function CheckExitCode ([string]$stage)
|
|||
|
||||
try {
|
||||
Push-Location $PSScriptRoot
|
||||
|
||||
|
||||
Write-Host "Installing darc..."
|
||||
. .\darc-init.ps1 -darcVersion $darcVersion
|
||||
CheckExitCode "Running darc-init"
|
||||
|
|
@ -40,9 +40,9 @@ try {
|
|||
|
||||
$darcExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$darcExe = Resolve-Path "$darcExe\darc.exe"
|
||||
|
||||
|
||||
Create-Directory $outputFolder
|
||||
|
||||
|
||||
# Generate 3 graph descriptions:
|
||||
# 1. Flat with coherency information
|
||||
# 2. Graphviz (dot) file
|
||||
|
|
@ -51,26 +51,26 @@ try {
|
|||
$graphVizImageFilePath = "$outputFolder\graph.png"
|
||||
$normalGraphFilePath = "$outputFolder\graph-full.txt"
|
||||
$flatGraphFilePath = "$outputFolder\graph-flat.txt"
|
||||
$baseOptions = "get-dependency-graph --github-pat $gitHubPat --azdev-pat $azdoPat --password $barToken"
|
||||
|
||||
$baseOptions = @( "--github-pat", "$gitHubPat", "--azdev-pat", "$azdoPat", "--password", "$barToken" )
|
||||
|
||||
if ($includeToolset) {
|
||||
Write-Host "Toolsets will be included in the graph..."
|
||||
$baseOptions += " --include-toolset"
|
||||
$baseOptions += @( "--include-toolset" )
|
||||
}
|
||||
|
||||
Write-Host "Generating standard dependency graph..."
|
||||
Invoke-Expression "& `"$darcExe`" $baseOptions --output-file $normalGraphFilePath"
|
||||
& "$darcExe" get-dependency-graph @baseOptions --output-file $normalGraphFilePath
|
||||
CheckExitCode "Generating normal dependency graph"
|
||||
|
||||
Write-Host "Generating flat dependency graph and graphviz file..."
|
||||
Invoke-Expression "& `"$darcExe`" $baseOptions --flat --coherency --graphviz $graphVizFilePath --output-file $flatGraphFilePath"
|
||||
& "$darcExe" get-dependency-graph @baseOptions --flat --coherency --graphviz $graphVizFilePath --output-file $flatGraphFilePath
|
||||
CheckExitCode "Generating flat and graphviz dependency graph"
|
||||
|
||||
Write-Host "Generating graph image $graphVizFilePath"
|
||||
$dotFilePath = Join-Path $installBin "graphviz\$graphvizVersion\release\bin\dot.exe"
|
||||
Invoke-Expression "& `"$dotFilePath`" -Tpng -o'$graphVizImageFilePath' `"$graphVizFilePath`""
|
||||
& "$dotFilePath" -Tpng -o"$graphVizImageFilePath" "$graphVizFilePath"
|
||||
CheckExitCode "Generating graphviz image"
|
||||
|
||||
|
||||
Write-Host "'$graphVizFilePath', '$flatGraphFilePath', '$normalGraphFilePath' and '$graphVizImageFilePath' created!"
|
||||
}
|
||||
catch {
|
||||
|
|
|
|||
|
|
@ -79,28 +79,27 @@ try {
|
|||
$NativeTools.PSObject.Properties | ForEach-Object {
|
||||
$ToolName = $_.Name
|
||||
$ToolVersion = $_.Value
|
||||
$LocalInstallerCommand = $InstallerPath
|
||||
$LocalInstallerCommand += " -ToolName $ToolName"
|
||||
$LocalInstallerCommand += " -InstallPath $InstallBin"
|
||||
$LocalInstallerCommand += " -BaseUri $BaseUri"
|
||||
$LocalInstallerCommand += " -CommonLibraryDirectory $EngCommonBaseDir"
|
||||
$LocalInstallerCommand += " -Version $ToolVersion"
|
||||
$LocalInstallerArguments = @{ ToolName = "$ToolName" }
|
||||
$LocalInstallerArguments += @{ InstallPath = "$InstallBin" }
|
||||
$LocalInstallerArguments += @{ BaseUri = "$BaseUri" }
|
||||
$LocalInstallerArguments += @{ CommonLibraryDirectory = "$EngCommonBaseDir" }
|
||||
$LocalInstallerArguments += @{ Version = "$ToolVersion" }
|
||||
|
||||
if ($Verbose) {
|
||||
$LocalInstallerCommand += " -Verbose"
|
||||
$LocalInstallerArguments += @{ Verbose = $True }
|
||||
}
|
||||
if (Get-Variable 'Force' -ErrorAction 'SilentlyContinue') {
|
||||
if($Force) {
|
||||
$LocalInstallerCommand += " -Force"
|
||||
$LocalInstallerArguments += @{ Force = $True }
|
||||
}
|
||||
}
|
||||
if ($Clean) {
|
||||
$LocalInstallerCommand += " -Clean"
|
||||
$LocalInstallerArguments += @{ Clean = $True }
|
||||
}
|
||||
|
||||
Write-Verbose "Installing $ToolName version $ToolVersion"
|
||||
Write-Verbose "Executing '$LocalInstallerCommand'"
|
||||
Invoke-Expression "$LocalInstallerCommand"
|
||||
Write-Verbose "Executing '$InstallerPath $LocalInstallerArguments'"
|
||||
& $InstallerPath @LocalInstallerArguments
|
||||
if ($LASTEXITCODE -Ne "0") {
|
||||
$errMsg = "$ToolName installation failed"
|
||||
if ((Get-Variable 'DoNotAbortNativeToolsInstallationOnFailure' -ErrorAction 'SilentlyContinue') -and $DoNotAbortNativeToolsInstallationOnFailure) {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,135 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $Operation,
|
||||
[string] $AuthToken,
|
||||
[string] $CommitSha,
|
||||
[string] $RepoName,
|
||||
[switch] $IsFeedPrivate
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
. $PSScriptRoot\tools.ps1
|
||||
|
||||
# Sets VSS_NUGET_EXTERNAL_FEED_ENDPOINTS based on the "darc-int-*" feeds defined in NuGet.config. This is needed
|
||||
# in build agents by CredProvider to authenticate the restore requests to internal feeds as specified in
|
||||
# https://github.com/microsoft/artifacts-credprovider/blob/0f53327cd12fd893d8627d7b08a2171bf5852a41/README.md#environment-variables. This should ONLY be called from identified
|
||||
# internal builds
|
||||
function SetupCredProvider {
|
||||
param(
|
||||
[string] $AuthToken
|
||||
)
|
||||
|
||||
# Install the Cred Provider NuGet plugin
|
||||
Write-Host "Setting up Cred Provider NuGet plugin in the agent..."
|
||||
Write-Host "Getting 'installcredprovider.ps1' from 'https://github.com/microsoft/artifacts-credprovider'..."
|
||||
|
||||
$url = 'https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1'
|
||||
|
||||
Write-Host "Writing the contents of 'installcredprovider.ps1' locally..."
|
||||
Invoke-WebRequest $url -OutFile installcredprovider.ps1
|
||||
|
||||
Write-Host "Installing plugin..."
|
||||
.\installcredprovider.ps1 -Force
|
||||
|
||||
Write-Host "Deleting local copy of 'installcredprovider.ps1'..."
|
||||
Remove-Item .\installcredprovider.ps1
|
||||
|
||||
if (-Not("$env:USERPROFILE\.nuget\plugins\netcore")) {
|
||||
Write-Host "CredProvider plugin was not installed correctly!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
Write-Host "CredProvider plugin was installed correctly!"
|
||||
}
|
||||
|
||||
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
|
||||
# feeds successfully
|
||||
|
||||
$nugetConfigPath = "$RepoRoot\NuGet.config"
|
||||
|
||||
if (-Not (Test-Path -Path $nugetConfigPath)) {
|
||||
Write-Host "NuGet.config file not found in repo's root!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$endpoints = New-Object System.Collections.ArrayList
|
||||
$nugetConfigPackageSources = Select-Xml -Path $nugetConfigPath -XPath "//packageSources/add[contains(@key, 'darc-int-')]/@value" | foreach{$_.Node.Value}
|
||||
|
||||
if (($nugetConfigPackageSources | Measure-Object).Count -gt 0 ) {
|
||||
foreach ($stableRestoreResource in $nugetConfigPackageSources) {
|
||||
$trimmedResource = ([string]$stableRestoreResource).Trim()
|
||||
[void]$endpoints.Add(@{endpoint="$trimmedResource"; password="$AuthToken"})
|
||||
}
|
||||
}
|
||||
|
||||
if (($endpoints | Measure-Object).Count -gt 0) {
|
||||
# Create the JSON object. It should look like '{"endpointCredentials": [{"endpoint":"http://example.index.json", "username":"optional", "password":"accesstoken"}]}'
|
||||
$endpointCredentials = @{endpointCredentials=$endpoints} | ConvertTo-Json -Compress
|
||||
|
||||
# Create the environment variables the AzDo way
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $endpointCredentials -Properties @{
|
||||
'variable' = 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS'
|
||||
'issecret' = 'false'
|
||||
}
|
||||
|
||||
# We don't want sessions cached since we will be updating the endpoints quite frequently
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data 'False' -Properties @{
|
||||
'variable' = 'NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED'
|
||||
'issecret' = 'false'
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Write-Host "No internal endpoints found in NuGet.config"
|
||||
}
|
||||
}
|
||||
|
||||
#Workaround for https://github.com/microsoft/msbuild/issues/4430
|
||||
function InstallDotNetSdkAndRestoreArcade {
|
||||
$dotnetTempDir = "$RepoRoot\dotnet"
|
||||
$dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*)
|
||||
$dotnet = "$dotnetTempDir\dotnet.exe"
|
||||
$restoreProjPath = "$PSScriptRoot\restore.proj"
|
||||
|
||||
Write-Host "Installing dotnet SDK version $dotnetSdkVersion to restore Arcade SDK..."
|
||||
InstallDotNetSdk "$dotnetTempDir" "$dotnetSdkVersion"
|
||||
|
||||
'<Project Sdk="Microsoft.DotNet.Arcade.Sdk"/>' | Out-File "$restoreProjPath"
|
||||
|
||||
& $dotnet restore $restoreProjPath
|
||||
|
||||
Write-Host "Arcade SDK restored!"
|
||||
|
||||
if (Test-Path -Path $restoreProjPath) {
|
||||
Remove-Item $restoreProjPath
|
||||
}
|
||||
|
||||
if (Test-Path -Path $dotnetTempDir) {
|
||||
Remove-Item $dotnetTempDir -Recurse
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Push-Location $PSScriptRoot
|
||||
|
||||
if ($Operation -like "setup") {
|
||||
SetupCredProvider $AuthToken
|
||||
}
|
||||
elseif ($Operation -like "install-restore") {
|
||||
InstallDotNetSdkAndRestoreArcade
|
||||
}
|
||||
else {
|
||||
Write-Host "Unknown operation '$Operation'!"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
}
|
||||
|
|
@ -0,0 +1,142 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -e
|
||||
|
||||
# Sets VSS_NUGET_EXTERNAL_FEED_ENDPOINTS based on the "darc-int-*" feeds defined in NuGet.config. This is needed
|
||||
# in build agents by CredProvider to authenticate the restore requests to internal feeds as specified in
|
||||
# https://github.com/microsoft/artifacts-credprovider/blob/0f53327cd12fd893d8627d7b08a2171bf5852a41/README.md#environment-variables.
|
||||
# This should ONLY be called from identified internal builds
|
||||
function SetupCredProvider {
|
||||
local authToken=$1
|
||||
|
||||
# Install the Cred Provider NuGet plugin
|
||||
echo "Setting up Cred Provider NuGet plugin in the agent..."...
|
||||
echo "Getting 'installcredprovider.ps1' from 'https://github.com/microsoft/artifacts-credprovider'..."
|
||||
|
||||
local url="https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh"
|
||||
|
||||
echo "Writing the contents of 'installcredprovider.ps1' locally..."
|
||||
local installcredproviderPath="installcredprovider.sh"
|
||||
if command -v curl > /dev/null; then
|
||||
curl $url > "$installcredproviderPath"
|
||||
else
|
||||
wget -q -O "$installcredproviderPath" "$url"
|
||||
fi
|
||||
|
||||
echo "Installing plugin..."
|
||||
. "$installcredproviderPath"
|
||||
|
||||
echo "Deleting local copy of 'installcredprovider.sh'..."
|
||||
rm installcredprovider.sh
|
||||
|
||||
if [ ! -d "$HOME/.nuget/plugins" ]; then
|
||||
echo "CredProvider plugin was not installed correctly!"
|
||||
ExitWithExitCode 1
|
||||
else
|
||||
echo "CredProvider plugin was installed correctly!"
|
||||
fi
|
||||
|
||||
# Then, we set the 'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' environment variable to restore from the stable
|
||||
# feeds successfully
|
||||
|
||||
local nugetConfigPath="$repo_root/NuGet.config"
|
||||
|
||||
if [ ! "$nugetConfigPath" ]; then
|
||||
echo "NuGet.config file not found in repo's root!"
|
||||
ExitWithExitCode 1
|
||||
fi
|
||||
|
||||
local endpoints='['
|
||||
local nugetConfigPackageValues=`cat "$nugetConfigPath" | grep "key=\"darc-int-"`
|
||||
local pattern="value=\"(.*)\""
|
||||
|
||||
for value in $nugetConfigPackageValues
|
||||
do
|
||||
if [[ $value =~ $pattern ]]; then
|
||||
local endpoint="${BASH_REMATCH[1]}"
|
||||
endpoints+="{\"endpoint\": \"$endpoint\", \"password\": \"$authToken\"},"
|
||||
fi
|
||||
done
|
||||
|
||||
endpoints=${endpoints%?}
|
||||
endpoints+=']'
|
||||
|
||||
if [ ${#endpoints} -gt 2 ]; then
|
||||
# Create the JSON object. It should look like '{"endpointCredentials": [{"endpoint":"http://example.index.json", "username":"optional", "password":"accesstoken"}]}'
|
||||
local endpointCredentials="{\"endpointCredentials\": "$endpoints"}"
|
||||
|
||||
echo "##vso[task.setvariable variable=VSS_NUGET_EXTERNAL_FEED_ENDPOINTS]$endpointCredentials"
|
||||
echo "##vso[task.setvariable variable=NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED]False"
|
||||
else
|
||||
echo "No internal endpoints found in NuGet.config"
|
||||
fi
|
||||
}
|
||||
|
||||
# Workaround for https://github.com/microsoft/msbuild/issues/4430
|
||||
function InstallDotNetSdkAndRestoreArcade {
|
||||
local dotnetTempDir="$repo_root/dotnet"
|
||||
local dotnetSdkVersion="2.1.507" # After experimentation we know this version works when restoring the SDK (compared to 3.0.*)
|
||||
local restoreProjPath="$repo_root/eng/common/restore.proj"
|
||||
|
||||
echo "Installing dotnet SDK version $dotnetSdkVersion to restore Arcade SDK..."
|
||||
echo "<Project Sdk=\"Microsoft.DotNet.Arcade.Sdk\"/>" > "$restoreProjPath"
|
||||
|
||||
InstallDotNetSdk "$dotnetTempDir" "$dotnetSdkVersion"
|
||||
|
||||
local res=`$dotnetTempDir/dotnet restore $restoreProjPath`
|
||||
echo "Arcade SDK restored!"
|
||||
|
||||
# Cleanup
|
||||
if [ "$restoreProjPath" ]; then
|
||||
rm "$restoreProjPath"
|
||||
fi
|
||||
|
||||
if [ "$dotnetTempDir" ]; then
|
||||
rm -r $dotnetTempDir
|
||||
fi
|
||||
}
|
||||
|
||||
source="${BASH_SOURCE[0]}"
|
||||
operation=''
|
||||
authToken=''
|
||||
repoName=''
|
||||
|
||||
while [[ $# > 0 ]]; do
|
||||
opt="$(echo "$1" | awk '{print tolower($0)}')"
|
||||
case "$opt" in
|
||||
--operation)
|
||||
operation=$2
|
||||
shift
|
||||
;;
|
||||
--authtoken)
|
||||
authToken=$2
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
echo "Invalid argument: $1"
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
while [[ -h "$source" ]]; do
|
||||
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
|
||||
source="$(readlink "$source")"
|
||||
# if $source was a relative symlink, we need to resolve it relative to the path where the
|
||||
# symlink file was located
|
||||
[[ $source != /* ]] && source="$scriptroot/$source"
|
||||
done
|
||||
scriptroot="$( cd -P "$( dirname "$source" )" && pwd )"
|
||||
|
||||
. "$scriptroot/tools.sh"
|
||||
|
||||
if [ "$operation" = "setup" ]; then
|
||||
SetupCredProvider $authToken
|
||||
elif [ "$operation" = "install-restore" ]; then
|
||||
InstallDotNetSdkAndRestoreArcade
|
||||
else
|
||||
echo "Unknown operation '$operation'!"
|
||||
fi
|
||||
|
|
@ -209,7 +209,7 @@ function New-ScriptShim {
|
|||
Remove-Item (Join-Path $ShimDirectory "$ShimName.exe")
|
||||
}
|
||||
|
||||
Invoke-Expression "$ShimDirectory\WinShimmer\winshimmer.exe $ShimName $ToolFilePath $ShimDirectory"
|
||||
& "$ShimDirectory\WinShimmer\winshimmer.exe" $ShimName $ToolFilePath $ShimDirectory
|
||||
return $True
|
||||
}
|
||||
catch {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
# Source for this file was taken from https://github.com/microsoft/azure-pipelines-task-lib/blob/11c9439d4af17e6475d9fe058e6b2e03914d17e6/powershell/VstsTaskSdk/LoggingCommandFunctions.ps1
|
||||
# Source for this file was taken from https://github.com/microsoft/azure-pipelines-task-lib/blob/11c9439d4af17e6475d9fe058e6b2e03914d17e6/powershell/VstsTaskSdk/LoggingCommandFunctions.ps1 and modified.
|
||||
|
||||
# NOTE: You should not be calling these method directly as they are likely to change. Instead you should be calling the Write-Pipeline* functions defined in tools.ps1
|
||||
|
||||
|
|
@ -12,6 +12,93 @@ $script:loggingCommandEscapeMappings = @( # TODO: WHAT ABOUT "="? WHAT ABOUT "%"
|
|||
# TODO: BUG: Escape % ???
|
||||
# TODO: Add test to verify don't need to escape "=".
|
||||
|
||||
function Write-PipelineTelemetryError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Category,
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
$PSBoundParameters.Remove("Category") | Out-Null
|
||||
|
||||
$Message = "(NETCORE_ENGINEERING_TELEMETRY=$Category) $Message"
|
||||
$PSBoundParameters.Remove("Message") | Out-Null
|
||||
$PSBoundParameters.Add("Message", $Message)
|
||||
|
||||
Write-PipelineTaskError @PSBoundParameters
|
||||
}
|
||||
|
||||
function Write-PipelineTaskError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if(!$ci) {
|
||||
if($Type -eq 'error') {
|
||||
Write-Host $Message -ForegroundColor Red
|
||||
return
|
||||
}
|
||||
elseif ($Type -eq 'warning') {
|
||||
Write-Host $Message -ForegroundColor Yellow
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if(($Type -ne 'error') -and ($Type -ne 'warning')) {
|
||||
Write-Host $Message
|
||||
return
|
||||
}
|
||||
if(-not $PSBoundParameters.ContainsKey('Type')) {
|
||||
$PSBoundParameters.Add('Type', 'error')
|
||||
}
|
||||
Write-LogIssue @PSBoundParameters
|
||||
}
|
||||
|
||||
function Write-PipelineSetVariable {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Name,
|
||||
[string]$Value,
|
||||
[switch]$Secret,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if($ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{
|
||||
'variable' = $Name
|
||||
'isSecret' = $Secret
|
||||
'isOutput' = 'true'
|
||||
} -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
function Write-PipelinePrependPath {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]$Path,
|
||||
[switch]$AsOutput)
|
||||
if($ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
<########################################
|
||||
# Private functions.
|
||||
########################################>
|
||||
|
|
@ -0,0 +1,102 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
function Write-PipelineTelemetryError {
|
||||
local telemetry_category=''
|
||||
local function_args=()
|
||||
local message=''
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
case "$opt" in
|
||||
-category|-c)
|
||||
telemetry_category=$2
|
||||
shift
|
||||
;;
|
||||
-*)
|
||||
function_args+=("$1 $2")
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
message=$*
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
if [[ "$ci" != true ]]; then
|
||||
echo "$message" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
message="(NETCORE_ENGINEERING_TELEMETRY=$telemetry_category) $message"
|
||||
function_args+=("$message")
|
||||
|
||||
Write-PipelineTaskError $function_args
|
||||
}
|
||||
|
||||
function Write-PipelineTaskError {
|
||||
if [[ "$ci" != true ]]; then
|
||||
echo "$@" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
message_type="error"
|
||||
sourcepath=''
|
||||
linenumber=''
|
||||
columnnumber=''
|
||||
error_code=''
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
case "$opt" in
|
||||
-type|-t)
|
||||
message_type=$2
|
||||
shift
|
||||
;;
|
||||
-sourcepath|-s)
|
||||
sourcepath=$2
|
||||
shift
|
||||
;;
|
||||
-linenumber|-ln)
|
||||
linenumber=$2
|
||||
shift
|
||||
;;
|
||||
-columnnumber|-cn)
|
||||
columnnumber=$2
|
||||
shift
|
||||
;;
|
||||
-errcode|-e)
|
||||
error_code=$2
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
message="##vso[task.logissue"
|
||||
|
||||
message="$message type=$message_type"
|
||||
|
||||
if [ -n "$sourcepath" ]; then
|
||||
message="$message;sourcepath=$sourcepath"
|
||||
fi
|
||||
|
||||
if [ -n "$linenumber" ]; then
|
||||
message="$message;linenumber=$linenumber"
|
||||
fi
|
||||
|
||||
if [ -n "$columnnumber" ]; then
|
||||
message="$message;columnnumber=$columnnumber"
|
||||
fi
|
||||
|
||||
if [ -n "$error_code" ]; then
|
||||
message="$message;code=$error_code"
|
||||
fi
|
||||
|
||||
message="$message]$*"
|
||||
echo "$message"
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
param (
|
||||
$dotnetsymbolVersion = $null
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
$verbosity = "minimal"
|
||||
|
||||
function Installdotnetsymbol ($dotnetsymbolVersion) {
|
||||
$dotnetsymbolPackageName = "dotnet-symbol"
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list --global
|
||||
|
||||
if (($toolList -like "*$dotnetsymbolPackageName*") -and ($toolList -like "*$dotnetsymbolVersion*")) {
|
||||
Write-Host "dotnet-symbol version $dotnetsymbolVersion is already installed."
|
||||
}
|
||||
else {
|
||||
Write-Host "Installing dotnet-symbol version $dotnetsymbolVersion..."
|
||||
Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed."
|
||||
& "$dotnet" tool install $dotnetsymbolPackageName --version $dotnetsymbolVersion --verbosity $verbosity --global
|
||||
}
|
||||
}
|
||||
|
||||
Installdotnetsymbol $dotnetsymbolVersion
|
||||
|
|
@ -0,0 +1,29 @@
|
|||
param (
|
||||
$sourcelinkCliVersion = $null
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
$verbosity = "minimal"
|
||||
|
||||
function InstallSourcelinkCli ($sourcelinkCliVersion) {
|
||||
$sourcelinkCliPackageName = "sourcelink"
|
||||
|
||||
$dotnetRoot = InitializeDotNetCli -install:$true
|
||||
$dotnet = "$dotnetRoot\dotnet.exe"
|
||||
$toolList = & "$dotnet" tool list --global
|
||||
|
||||
if (($toolList -like "*$sourcelinkCliPackageName*") -and ($toolList -like "*$sourcelinkCliVersion*")) {
|
||||
Write-Host "SourceLink CLI version $sourcelinkCliVersion is already installed."
|
||||
}
|
||||
else {
|
||||
Write-Host "Installing SourceLink CLI version $sourcelinkCliVersion..."
|
||||
Write-Host "You may need to restart your command window if this is the first dotnet tool you have installed."
|
||||
& "$dotnet" tool install $sourcelinkCliPackageName --version $sourcelinkCliVersion --verbosity $verbosity --global
|
||||
}
|
||||
}
|
||||
|
||||
InstallSourcelinkCli $sourcelinkCliVersion
|
||||
|
|
@ -0,0 +1,224 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where Symbols.NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$true)][string] $GHRepoName, # GitHub name of the repo including the Org. E.g., dotnet/arcade
|
||||
[Parameter(Mandatory=$true)][string] $GHCommit, # GitHub commit SHA used to build the packages
|
||||
[Parameter(Mandatory=$true)][string] $SourcelinkCliVersion # Version of SourceLink CLI to use
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
# Cache/HashMap (File -> Exist flag) used to consult whether a file exist
|
||||
# in the repository at a specific commit point. This is populated by inserting
|
||||
# all files present in the repo at a specific commit point.
|
||||
$global:RepoFiles = @{}
|
||||
|
||||
$ValidatePackage = {
|
||||
param(
|
||||
[string] $PackagePath # Full path to a Symbols.NuGet package
|
||||
)
|
||||
|
||||
. $using:PSScriptRoot\..\tools.ps1
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-PipelineTaskError "Input file does not exist: $PackagePath"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for SourceLink information
|
||||
# For now we'll only care about Portable & Embedded PDBs
|
||||
$RelevantExtensions = @(".dll", ".exe", ".pdb")
|
||||
|
||||
Write-Host -NoNewLine "Validating" ([System.IO.Path]::GetFileName($PackagePath)) "... "
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$ExtractPath = Join-Path -Path $using:ExtractPath -ChildPath $PackageId
|
||||
$FailedFiles = 0
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
[System.IO.Directory]::CreateDirectory($ExtractPath);
|
||||
|
||||
try {
|
||||
$zip = [System.IO.Compression.ZipFile]::OpenRead($PackagePath)
|
||||
|
||||
$zip.Entries |
|
||||
Where-Object {$RelevantExtensions -contains [System.IO.Path]::GetExtension($_.Name)} |
|
||||
ForEach-Object {
|
||||
$FileName = $_.FullName
|
||||
$Extension = [System.IO.Path]::GetExtension($_.Name)
|
||||
$FakeName = -Join((New-Guid), $Extension)
|
||||
$TargetFile = Join-Path -Path $ExtractPath -ChildPath $FakeName
|
||||
|
||||
# We ignore resource DLLs
|
||||
if ($FileName.EndsWith(".resources.dll")) {
|
||||
return
|
||||
}
|
||||
|
||||
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, $TargetFile, $true)
|
||||
|
||||
$ValidateFile = {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $RealPath,
|
||||
[ref] $FailedFiles
|
||||
)
|
||||
|
||||
$sourcelinkExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$sourcelinkExe = Resolve-Path "$sourcelinkExe\sourcelink.exe"
|
||||
$SourceLinkInfos = & $sourcelinkExe print-urls $FullPath | Out-String
|
||||
|
||||
if ($LASTEXITCODE -eq 0 -and -not ([string]::IsNullOrEmpty($SourceLinkInfos))) {
|
||||
$NumFailedLinks = 0
|
||||
|
||||
# We only care about Http addresses
|
||||
$Matches = (Select-String '(http[s]?)(:\/\/)([^\s,]+)' -Input $SourceLinkInfos -AllMatches).Matches
|
||||
|
||||
if ($Matches.Count -ne 0) {
|
||||
$Matches.Value |
|
||||
ForEach-Object {
|
||||
$Link = $_
|
||||
$CommitUrl = "https://raw.githubusercontent.com/${using:GHRepoName}/${using:GHCommit}/"
|
||||
|
||||
$FilePath = $Link.Replace($CommitUrl, "")
|
||||
$Status = 200
|
||||
$Cache = $using:RepoFiles
|
||||
|
||||
if ( !($Cache.ContainsKey($FilePath)) ) {
|
||||
try {
|
||||
$Uri = $Link -as [System.URI]
|
||||
|
||||
# Only GitHub links are valid
|
||||
if ($Uri.AbsoluteURI -ne $null -and ($Uri.Host -match "github" -or $Uri.Host -match "githubusercontent")) {
|
||||
$Status = (Invoke-WebRequest -Uri $Link -UseBasicParsing -Method HEAD -TimeoutSec 5).StatusCode
|
||||
}
|
||||
else {
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
catch {
|
||||
write-host $_
|
||||
$Status = 0
|
||||
}
|
||||
}
|
||||
|
||||
if ($Status -ne 200) {
|
||||
if ($NumFailedLinks -eq 0) {
|
||||
if ($FailedFiles.Value -eq 0) {
|
||||
Write-Host
|
||||
}
|
||||
|
||||
Write-Host "`tFile $RealPath has broken links:"
|
||||
}
|
||||
|
||||
Write-Host "`t`tFailed to retrieve $Link"
|
||||
|
||||
$NumFailedLinks++
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($NumFailedLinks -ne 0) {
|
||||
$FailedFiles.value++
|
||||
$global:LASTEXITCODE = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&$ValidateFile $TargetFile $FileName ([ref]$FailedFiles)
|
||||
}
|
||||
}
|
||||
catch {
|
||||
|
||||
}
|
||||
finally {
|
||||
$zip.Dispose()
|
||||
}
|
||||
|
||||
if ($FailedFiles -eq 0) {
|
||||
Write-Host "Passed."
|
||||
}
|
||||
else {
|
||||
Write-PipelineTaskError "$PackagePath has broken SourceLink links."
|
||||
}
|
||||
}
|
||||
|
||||
function ValidateSourceLinkLinks {
|
||||
if (!($GHRepoName -Match "^[^\s\/]+/[^\s\/]+$")) {
|
||||
if (!($GHRepoName -Match "^[^\s-]+-[^\s]+$")) {
|
||||
Write-PipelineTaskError "GHRepoName should be in the format <org>/<repo> or <org>-<repo>"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
else {
|
||||
$GHRepoName = $GHRepoName -replace '^([^\s-]+)-([^\s]+)$', '$1/$2';
|
||||
}
|
||||
}
|
||||
|
||||
if (!($GHCommit -Match "^[0-9a-fA-F]{40}$")) {
|
||||
Write-PipelineTaskError "GHCommit should be a 40 chars hexadecimal string"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$RepoTreeURL = -Join("http://api.github.com/repos/", $GHRepoName, "/git/trees/", $GHCommit, "?recursive=1")
|
||||
$CodeExtensions = @(".cs", ".vb", ".fs", ".fsi", ".fsx", ".fsscript")
|
||||
|
||||
try {
|
||||
# Retrieve the list of files in the repo at that particular commit point and store them in the RepoFiles hash
|
||||
$Data = Invoke-WebRequest $RepoTreeURL -UseBasicParsing | ConvertFrom-Json | Select-Object -ExpandProperty tree
|
||||
|
||||
foreach ($file in $Data) {
|
||||
$Extension = [System.IO.Path]::GetExtension($file.path)
|
||||
|
||||
if ($CodeExtensions.Contains($Extension)) {
|
||||
$RepoFiles[$file.path] = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
catch {
|
||||
Write-PipelineTaskError "Problems downloading the list of files from the repo. Url used: $RepoTreeURL"
|
||||
Write-Host $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
# Process each NuGet package in parallel
|
||||
$Jobs = @()
|
||||
Get-ChildItem "$InputPath\*.symbols.nupkg" |
|
||||
ForEach-Object {
|
||||
$Jobs += Start-Job -ScriptBlock $ValidatePackage -ArgumentList $_.FullName
|
||||
}
|
||||
|
||||
foreach ($Job in $Jobs) {
|
||||
Wait-Job -Id $Job.Id | Receive-Job
|
||||
}
|
||||
}
|
||||
|
||||
function CheckExitCode ([string]$stage) {
|
||||
$exitCode = $LASTEXITCODE
|
||||
if ($exitCode -ne 0) {
|
||||
Write-PipelineTaskError "Something failed while '$stage'. Check for errors above. Exiting now..."
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Installing SourceLink CLI..."
|
||||
Get-Location
|
||||
. $PSScriptRoot\sourcelink-cli-init.ps1 -sourcelinkCliVersion $SourcelinkCliVersion
|
||||
CheckExitCode "Running sourcelink-cli-init"
|
||||
|
||||
Measure-Command { ValidateSourceLinkLinks }
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
@ -0,0 +1,186 @@
|
|||
param(
|
||||
[Parameter(Mandatory=$true)][string] $InputPath, # Full path to directory where NuGet packages to be checked are stored
|
||||
[Parameter(Mandatory=$true)][string] $ExtractPath, # Full path to directory where the packages will be extracted during validation
|
||||
[Parameter(Mandatory=$true)][string] $DotnetSymbolVersion # Version of dotnet symbol to use
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
|
||||
. $PSScriptRoot\..\tools.ps1
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
|
||||
function FirstMatchingSymbolDescriptionOrDefault {
|
||||
param(
|
||||
[string] $FullPath, # Full path to the module that has to be checked
|
||||
[string] $TargetServerParam, # Parameter to pass to `Symbol Tool` indicating the server to lookup for symbols
|
||||
[string] $SymbolsPath
|
||||
)
|
||||
|
||||
$FileName = [System.IO.Path]::GetFileName($FullPath)
|
||||
$Extension = [System.IO.Path]::GetExtension($FullPath)
|
||||
|
||||
# Those below are potential symbol files that the `dotnet symbol` might
|
||||
# return. Which one will be returned depend on the type of file we are
|
||||
# checking and which type of file was uploaded.
|
||||
|
||||
# The file itself is returned
|
||||
$SymbolPath = $SymbolsPath + "\" + $FileName
|
||||
|
||||
# PDB file for the module
|
||||
$PdbPath = $SymbolPath.Replace($Extension, ".pdb")
|
||||
|
||||
# PDB file for R2R module (created by crossgen)
|
||||
$NGenPdb = $SymbolPath.Replace($Extension, ".ni.pdb")
|
||||
|
||||
# DBG file for a .so library
|
||||
$SODbg = $SymbolPath.Replace($Extension, ".so.dbg")
|
||||
|
||||
# DWARF file for a .dylib
|
||||
$DylibDwarf = $SymbolPath.Replace($Extension, ".dylib.dwarf")
|
||||
|
||||
$dotnetsymbolExe = "$env:USERPROFILE\.dotnet\tools"
|
||||
$dotnetsymbolExe = Resolve-Path "$dotnetsymbolExe\dotnet-symbol.exe"
|
||||
|
||||
& $dotnetsymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null
|
||||
|
||||
if (Test-Path $PdbPath) {
|
||||
return "PDB"
|
||||
}
|
||||
elseif (Test-Path $NGenPdb) {
|
||||
return "NGen PDB"
|
||||
}
|
||||
elseif (Test-Path $SODbg) {
|
||||
return "DBG for SO"
|
||||
}
|
||||
elseif (Test-Path $DylibDwarf) {
|
||||
return "Dwarf for Dylib"
|
||||
}
|
||||
elseif (Test-Path $SymbolPath) {
|
||||
return "Module"
|
||||
}
|
||||
else {
|
||||
return $null
|
||||
}
|
||||
}
|
||||
|
||||
function CountMissingSymbols {
|
||||
param(
|
||||
[string] $PackagePath # Path to a NuGet package
|
||||
)
|
||||
|
||||
# Ensure input file exist
|
||||
if (!(Test-Path $PackagePath)) {
|
||||
Write-PipelineTaskError "Input file does not exist: $PackagePath"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
# Extensions for which we'll look for symbols
|
||||
$RelevantExtensions = @(".dll", ".exe", ".so", ".dylib")
|
||||
|
||||
# How many files are missing symbol information
|
||||
$MissingSymbols = 0
|
||||
|
||||
$PackageId = [System.IO.Path]::GetFileNameWithoutExtension($PackagePath)
|
||||
$PackageGuid = New-Guid
|
||||
$ExtractPath = Join-Path -Path $ExtractPath -ChildPath $PackageGuid
|
||||
$SymbolsPath = Join-Path -Path $ExtractPath -ChildPath "Symbols"
|
||||
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($PackagePath, $ExtractPath)
|
||||
|
||||
Get-ChildItem -Recurse $ExtractPath |
|
||||
Where-Object {$RelevantExtensions -contains $_.Extension} |
|
||||
ForEach-Object {
|
||||
if ($_.FullName -Match "\\ref\\") {
|
||||
Write-Host "`t Ignoring reference assembly file" $_.FullName
|
||||
return
|
||||
}
|
||||
|
||||
$SymbolsOnMSDL = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--microsoft-symbol-server" $SymbolsPath
|
||||
$SymbolsOnSymWeb = FirstMatchingSymbolDescriptionOrDefault $_.FullName "--internal-server" $SymbolsPath
|
||||
|
||||
Write-Host -NoNewLine "`t Checking file" $_.FullName "... "
|
||||
|
||||
if ($SymbolsOnMSDL -ne $null -and $SymbolsOnSymWeb -ne $null) {
|
||||
Write-Host "Symbols found on MSDL (" $SymbolsOnMSDL ") and SymWeb (" $SymbolsOnSymWeb ")"
|
||||
}
|
||||
else {
|
||||
$MissingSymbols++
|
||||
|
||||
if ($SymbolsOnMSDL -eq $null -and $SymbolsOnSymWeb -eq $null) {
|
||||
Write-Host "No symbols found on MSDL or SymWeb!"
|
||||
}
|
||||
else {
|
||||
if ($SymbolsOnMSDL -eq $null) {
|
||||
Write-Host "No symbols found on MSDL!"
|
||||
}
|
||||
else {
|
||||
Write-Host "No symbols found on SymWeb!"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Pop-Location
|
||||
|
||||
return $MissingSymbols
|
||||
}
|
||||
|
||||
function CheckSymbolsAvailable {
|
||||
if (Test-Path $ExtractPath) {
|
||||
Remove-Item $ExtractPath -Force -Recurse -ErrorAction SilentlyContinue
|
||||
}
|
||||
|
||||
Get-ChildItem "$InputPath\*.nupkg" |
|
||||
ForEach-Object {
|
||||
$FileName = $_.Name
|
||||
|
||||
# These packages from Arcade-Services include some native libraries that
|
||||
# our current symbol uploader can't handle. Below is a workaround until
|
||||
# we get issue: https://github.com/dotnet/arcade/issues/2457 sorted.
|
||||
if ($FileName -Match "Microsoft\.DotNet\.Darc\.") {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
elseif ($FileName -Match "Microsoft\.DotNet\.Maestro\.Tasks\.") {
|
||||
Write-Host "Ignoring Arcade-services file: $FileName"
|
||||
Write-Host
|
||||
return
|
||||
}
|
||||
|
||||
Write-Host "Validating $FileName "
|
||||
$Status = CountMissingSymbols "$InputPath\$FileName"
|
||||
|
||||
if ($Status -ne 0) {
|
||||
Write-PipelineTaskError "Missing symbols for $Status modules in the package $FileName"
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
|
||||
Write-Host
|
||||
}
|
||||
}
|
||||
|
||||
function CheckExitCode ([string]$stage) {
|
||||
$exitCode = $LASTEXITCODE
|
||||
if ($exitCode -ne 0) {
|
||||
Write-PipelineTaskError "Something failed while '$stage'. Check for errors above. Exiting now..."
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
Write-Host "Installing dotnet symbol ..."
|
||||
Get-Location
|
||||
. $PSScriptRoot\dotnetsymbol-init.ps1 -dotnetsymbolVersion $DotnetSymbolVersion
|
||||
CheckExitCode "Running dotnetsymbol-init"
|
||||
|
||||
CheckSymbolsAvailable
|
||||
}
|
||||
catch {
|
||||
Write-Host $_
|
||||
Write-Host $_.Exception
|
||||
Write-Host $_.ScriptStackTrace
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<solution>
|
||||
<add key="disableSourceControlIntegration" value="true" />
|
||||
</solution>
|
||||
<packageSources>
|
||||
<clear />
|
||||
<add key="guardian" value="https://securitytools.pkgs.visualstudio.com/_packaging/Guardian/nuget/v3/index.json" />
|
||||
</packageSources>
|
||||
<disabledPackageSources>
|
||||
<clear />
|
||||
</disabledPackageSources>
|
||||
</configuration>
|
||||
|
|
@ -0,0 +1,97 @@
|
|||
Param(
|
||||
[string] $GuardianPackageName, # Required: the name of guardian CLI package (not needed if GuardianCliLocation is specified)
|
||||
[string] $NugetPackageDirectory, # Required: directory where NuGet packages are installed (not needed if GuardianCliLocation is specified)
|
||||
[string] $GuardianCliLocation, # Optional: Direct location of Guardian CLI executable if GuardianPackageName & NugetPackageDirectory are not specified
|
||||
[string] $Repository=$env:BUILD_REPOSITORY_NAME, # Required: the name of the repository (e.g. dotnet/arcade)
|
||||
[string] $BranchName=$env:BUILD_SOURCEBRANCH, # Optional: name of branch or version of gdn settings; defaults to master
|
||||
[string] $SourceDirectory=$env:BUILD_SOURCESDIRECTORY, # Required: the directory where source files are located
|
||||
[string] $ArtifactsDirectory = (Join-Path $env:BUILD_SOURCESDIRECTORY ("artifacts")), # Required: the directory where build artifacts are located
|
||||
[string] $AzureDevOpsAccessToken, # Required: access token for dnceng; should be provided via KeyVault
|
||||
[string[]] $SourceToolsList, # Optional: list of SDL tools to run on source code
|
||||
[string[]] $ArtifactToolsList, # Optional: list of SDL tools to run on built artifacts
|
||||
[bool] $TsaPublish=$False, # Optional: true will publish results to TSA; only set to true after onboarding to TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaBranchName=$env:BUILD_SOURCEBRANCH, # Optional: required for TSA publish; defaults to $(Build.SourceBranchName); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaRepositoryName=$env:BUILD_REPOSITORY_NAME, # Optional: TSA repository name; will be generated automatically if not submitted; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $BuildNumber=$env:BUILD_BUILDNUMBER, # Optional: required for TSA publish; defaults to $(Build.BuildNumber)
|
||||
[bool] $UpdateBaseline=$False, # Optional: if true, will update the baseline in the repository; should only be run after fixing any issues which need to be fixed
|
||||
[bool] $TsaOnboard=$False, # Optional: if true, will onboard the repository to TSA; should only be run once; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaInstanceUrl, # Optional: only needed if TsaOnboard or TsaPublish is true; the instance-url registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaCodebaseName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the codebase registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaProjectName, # Optional: only needed if TsaOnboard or TsaPublish is true; the name of the project registered with TSA; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaNotificationEmail, # Optional: only needed if TsaOnboard is true; the email(s) which will receive notifications of TSA bug filings (e.g. alias@microsoft.com); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaCodebaseAdmin, # Optional: only needed if TsaOnboard is true; the aliases which are admins of the TSA codebase (e.g. DOMAIN\alias); TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaBugAreaPath, # Optional: only needed if TsaOnboard is true; the area path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $TsaIterationPath, # Optional: only needed if TsaOnboard is true; the iteration path where TSA will file bugs in AzDO; TSA is the automated framework used to upload test results as bugs.
|
||||
[string] $GuardianLoggerLevel="Standard" # Optional: the logger level for the Guardian CLI; options are Trace, Verbose, Standard, Warning, and Error
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
#Replace repo names to the format of org/repo
|
||||
if (!($Repository.contains('/'))) {
|
||||
$RepoName = $Repository -replace '(.*?)-(.*)', '$1/$2';
|
||||
}
|
||||
else{
|
||||
$RepoName = $Repository;
|
||||
}
|
||||
|
||||
if ($GuardianPackageName) {
|
||||
$guardianCliLocation = Join-Path $NugetPackageDirectory (Join-Path $GuardianPackageName (Join-Path "tools" "guardian.cmd"))
|
||||
} else {
|
||||
$guardianCliLocation = $GuardianCliLocation
|
||||
}
|
||||
|
||||
$ValidPath = Test-Path $guardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-Host "Invalid Guardian CLI Location."
|
||||
exit 1
|
||||
}
|
||||
|
||||
& $(Join-Path $PSScriptRoot "init-sdl.ps1") -GuardianCliLocation $guardianCliLocation -Repository $RepoName -BranchName $BranchName -WorkingDirectory $ArtifactsDirectory -AzureDevOpsAccessToken $AzureDevOpsAccessToken -GuardianLoggerLevel $GuardianLoggerLevel
|
||||
$gdnFolder = Join-Path $ArtifactsDirectory ".gdn"
|
||||
|
||||
if ($TsaOnboard) {
|
||||
if ($TsaCodebaseName -and $TsaNotificationEmail -and $TsaCodebaseAdmin -and $TsaBugAreaPath) {
|
||||
Write-Host "$guardianCliLocation tsa-onboard --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $ArtifactsDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $guardianCliLocation tsa-onboard --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $ArtifactsDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian tsa-onboard failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
Write-Host "Could not onboard to TSA -- not all required values ($$TsaCodebaseName, $$TsaNotificationEmail, $$TsaCodebaseAdmin, $$TsaBugAreaPath) were specified."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
if ($ArtifactToolsList -and $ArtifactToolsList.Count -gt 0) {
|
||||
& $(Join-Path $PSScriptRoot "run-sdl.ps1") -GuardianCliLocation $guardianCliLocation -WorkingDirectory $ArtifactsDirectory -TargetDirectory $ArtifactsDirectory -GdnFolder $gdnFolder -ToolsList $ArtifactToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel
|
||||
}
|
||||
if ($SourceToolsList -and $SourceToolsList.Count -gt 0) {
|
||||
& $(Join-Path $PSScriptRoot "run-sdl.ps1") -GuardianCliLocation $guardianCliLocation -WorkingDirectory $ArtifactsDirectory -TargetDirectory $SourceDirectory -GdnFolder $gdnFolder -ToolsList $SourceToolsList -AzureDevOpsAccessToken $AzureDevOpsAccessToken -UpdateBaseline $UpdateBaseline -GuardianLoggerLevel $GuardianLoggerLevel
|
||||
}
|
||||
|
||||
if ($UpdateBaseline) {
|
||||
& (Join-Path $PSScriptRoot "push-gdn.ps1") -Repository $RepoName -BranchName $BranchName -GdnFolder $GdnFolder -AzureDevOpsAccessToken $AzureDevOpsAccessToken -PushReason "Update baseline"
|
||||
}
|
||||
|
||||
if ($TsaPublish) {
|
||||
if ($TsaBranchName -and $BuildNumber) {
|
||||
if (-not $TsaRepositoryName) {
|
||||
$TsaRepositoryName = "$($Repository)-$($BranchName)"
|
||||
}
|
||||
Write-Host "$guardianCliLocation tsa-publish --all-tools --repository-name `"$TsaRepositoryName`" --branch-name `"$TsaBranchName`" --build-number `"$BuildNumber`" --codebase-name `"$TsaCodebaseName`" --notification-alias `"$TsaNotificationEmail`" --codebase-admin `"$TsaCodebaseAdmin`" --instance-url `"$TsaInstanceUrl`" --project-name `"$TsaProjectName`" --area-path `"$TsaBugAreaPath`" --iteration-path `"$TsaIterationPath`" --working-directory $SourceDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $guardianCliLocation tsa-publish --all-tools --repository-name "$TsaRepositoryName" --branch-name "$TsaBranchName" --build-number "$BuildNumber" --codebase-name "$TsaCodebaseName" --notification-alias "$TsaNotificationEmail" --codebase-admin "$TsaCodebaseAdmin" --instance-url "$TsaInstanceUrl" --project-name "$TsaProjectName" --area-path "$TsaBugAreaPath" --iteration-path "$TsaIterationPath" --working-directory $ArtifactsDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian tsa-publish failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
Write-Host "Could not publish to TSA -- not all required values ($$TsaBranchName, $$BuildNumber) were specified."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $Repository,
|
||||
[string] $BranchName="master",
|
||||
[string] $WorkingDirectory,
|
||||
[string] $AzureDevOpsAccessToken,
|
||||
[string] $GuardianLoggerLevel="Standard"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
# Construct basic auth from AzDO access token; construct URI to the repository's gdn folder stored in that repository; construct location of zip file
|
||||
$encodedPat = [Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$AzureDevOpsAccessToken"))
|
||||
$escapedRepository = [Uri]::EscapeDataString("/$Repository/$BranchName/.gdn")
|
||||
$uri = "https://dev.azure.com/dnceng/internal/_apis/git/repositories/sdl-tool-cfg/Items?path=$escapedRepository&versionDescriptor[versionOptions]=0&`$format=zip&api-version=5.0-preview.1"
|
||||
$zipFile = "$WorkingDirectory/gdn.zip"
|
||||
|
||||
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
||||
$gdnFolder = (Join-Path $WorkingDirectory ".gdn")
|
||||
Try
|
||||
{
|
||||
# We try to download the zip; if the request fails (e.g. the file doesn't exist), we catch it and init guardian instead
|
||||
Write-Host "Downloading gdn folder from internal config repostiory..."
|
||||
Invoke-WebRequest -Headers @{ "Accept"="application/zip"; "Authorization"="Basic $encodedPat" } -Uri $uri -OutFile $zipFile
|
||||
if (Test-Path $gdnFolder) {
|
||||
# Remove the gdn folder if it exists (it shouldn't unless there's too much caching; this is just in case)
|
||||
Remove-Item -Force -Recurse $gdnFolder
|
||||
}
|
||||
[System.IO.Compression.ZipFile]::ExtractToDirectory($zipFile, $WorkingDirectory)
|
||||
Write-Host $gdnFolder
|
||||
} Catch [System.Net.WebException] {
|
||||
# if the folder does not exist, we'll do a guardian init and push it to the remote repository
|
||||
Write-Host "Initializing Guardian..."
|
||||
Write-Host "$GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel"
|
||||
& $GuardianCliLocation init --working-directory $WorkingDirectory --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Guardian init failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
# We create the mainbaseline so it can be edited later
|
||||
Write-Host "$GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline"
|
||||
& $GuardianCliLocation baseline --working-directory $WorkingDirectory --name mainbaseline
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Guardian baseline failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
& $(Join-Path $PSScriptRoot "push-gdn.ps1") -Repository $Repository -BranchName $BranchName -GdnFolder $gdnFolder -AzureDevOpsAccessToken $AzureDevOpsAccessToken -PushReason "Initialize gdn folder"
|
||||
}
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="Microsoft.Guardian.Cli" version="0.3.2"/>
|
||||
</packages>
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
Param(
|
||||
[string] $Repository,
|
||||
[string] $BranchName="master",
|
||||
[string] $GdnFolder,
|
||||
[string] $AzureDevOpsAccessToken,
|
||||
[string] $PushReason
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
# We create the temp directory where we'll store the sdl-config repository
|
||||
$sdlDir = Join-Path $env:TEMP "sdl"
|
||||
if (Test-Path $sdlDir) {
|
||||
Remove-Item -Force -Recurse $sdlDir
|
||||
}
|
||||
|
||||
Write-Host "git clone https://dnceng:`$AzureDevOpsAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir"
|
||||
git clone https://dnceng:$AzureDevOpsAccessToken@dev.azure.com/dnceng/internal/_git/sdl-tool-cfg $sdlDir
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git clone failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
# We copy the .gdn folder from our local run into the git repository so it can be committed
|
||||
$sdlRepositoryFolder = Join-Path (Join-Path (Join-Path $sdlDir $Repository) $BranchName) ".gdn"
|
||||
if (Get-Command Robocopy) {
|
||||
Robocopy /S $GdnFolder $sdlRepositoryFolder
|
||||
} else {
|
||||
rsync -r $GdnFolder $sdlRepositoryFolder
|
||||
}
|
||||
# cd to the sdl-config directory so we can run git there
|
||||
Push-Location $sdlDir
|
||||
# git add . --> git commit --> git push
|
||||
Write-Host "git add ."
|
||||
git add .
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git add failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
Write-Host "git -c user.email=`"dn-bot@microsoft.com`" -c user.name=`"Dotnet Bot`" commit -m `"$PushReason for $Repository/$BranchName`""
|
||||
git -c user.email="dn-bot@microsoft.com" -c user.name="Dotnet Bot" commit -m "$PushReason for $Repository/$BranchName"
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git commit failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
Write-Host "git push"
|
||||
git push
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Error "Git push failed with exit code $LASTEXITCODE."
|
||||
}
|
||||
|
||||
# Return to the original directory
|
||||
Pop-Location
|
||||
|
|
@ -0,0 +1,65 @@
|
|||
Param(
|
||||
[string] $GuardianCliLocation,
|
||||
[string] $WorkingDirectory,
|
||||
[string] $TargetDirectory,
|
||||
[string] $GdnFolder,
|
||||
[string[]] $ToolsList,
|
||||
[string] $UpdateBaseline,
|
||||
[string] $GuardianLoggerLevel="Standard"
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
Set-StrictMode -Version 2.0
|
||||
$LASTEXITCODE = 0
|
||||
|
||||
# We store config files in the r directory of .gdn
|
||||
Write-Host $ToolsList
|
||||
$gdnConfigPath = Join-Path $GdnFolder "r"
|
||||
$ValidPath = Test-Path $GuardianCliLocation
|
||||
|
||||
if ($ValidPath -eq $False)
|
||||
{
|
||||
Write-Host "Invalid Guardian CLI Location."
|
||||
exit 1
|
||||
}
|
||||
|
||||
foreach ($tool in $ToolsList) {
|
||||
$gdnConfigFile = Join-Path $gdnConfigPath "$tool-configure.gdnconfig"
|
||||
$config = $False
|
||||
Write-Host $tool
|
||||
# We have to manually configure tools that run on source to look at the source directory only
|
||||
if ($tool -eq "credscan") {
|
||||
Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" TargetDirectory : $TargetDirectory `""
|
||||
& $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " TargetDirectory : $TargetDirectory "
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian configure for $tool failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
$config = $True
|
||||
}
|
||||
if ($tool -eq "policheck") {
|
||||
Write-Host "$GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args `" Target : $TargetDirectory `""
|
||||
& $GuardianCliLocation configure --working-directory $WorkingDirectory --tool $tool --output-path $gdnConfigFile --logger-level $GuardianLoggerLevel --noninteractive --force --args " Target : $TargetDirectory "
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian configure for $tool failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
$config = $True
|
||||
}
|
||||
|
||||
Write-Host "$GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel --config $gdnConfigFile $config"
|
||||
if ($config) {
|
||||
& $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel --config $gdnConfigFile
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian run for $tool using $gdnConfigFile failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
} else {
|
||||
& $GuardianCliLocation run --working-directory $WorkingDirectory --tool $tool --baseline mainbaseline --update-baseline $UpdateBaseline --logger-level $GuardianLoggerLevel
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host "Guardian run for $tool failed with exit code $LASTEXITCODE."
|
||||
exit $LASTEXITCODE
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,44 @@
|
|||
parameters:
|
||||
overrideParameters: '' # Optional: to override values for parameters.
|
||||
additionalParameters: '' # Optional: parameters that need user specific values eg: '-SourceToolsList @("abc","def") -ArtifactToolsList @("ghi","jkl")'
|
||||
continueOnError: false # optional: determines whether to continue the build if the step errors;
|
||||
dependsOn: '' # Optional: dependencies of the job
|
||||
|
||||
jobs:
|
||||
- job: Run_SDL
|
||||
dependsOn: ${{ parameters.dependsOn }}
|
||||
displayName: Run SDL tool
|
||||
variables:
|
||||
- group: DotNet-VSTS-Bot
|
||||
steps:
|
||||
- checkout: self
|
||||
clean: true
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Build Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
downloadType: specific files
|
||||
matchingPattern: "**"
|
||||
downloadPath: $(Build.SourcesDirectory)\artifacts
|
||||
- task: NuGetToolInstaller@1
|
||||
displayName: 'Install NuGet.exe'
|
||||
- task: NuGetCommand@2
|
||||
displayName: 'Install Guardian'
|
||||
inputs:
|
||||
restoreSolution: $(Build.SourcesDirectory)\eng\common\sdl\packages.config
|
||||
feedsToUse: config
|
||||
nugetConfigPath: $(Build.SourcesDirectory)\eng\common\sdl\NuGet.config
|
||||
externalFeedCredentials: GuardianConnect
|
||||
restoreDirectory: $(Build.SourcesDirectory)\.packages
|
||||
- ${{ if ne(parameters.overrideParameters, '') }}:
|
||||
- powershell: eng/common/sdl/execute-all-sdl-tools.ps1 ${{ parameters.overrideParameters }}
|
||||
displayName: Execute SDL
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
- ${{ if eq(parameters.overrideParameters, '') }}:
|
||||
- powershell: eng/common/sdl/execute-all-sdl-tools.ps1
|
||||
-GuardianPackageName Microsoft.Guardian.Cli.0.3.2
|
||||
-NugetPackageDirectory $(Build.SourcesDirectory)\.packages
|
||||
-AzureDevOpsAccessToken $(dn-bot-dotnet-build-rw-code-rw)
|
||||
${{ parameters.additionalParameters }}
|
||||
displayName: Execute SDL
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
|
|
@ -59,6 +59,21 @@ jobs:
|
|||
/p:Configuration=$(_BuildConfig)
|
||||
condition: ${{ parameters.condition }}
|
||||
continueOnError: ${{ parameters.continueOnError }}
|
||||
- task: powershell@2
|
||||
displayName: Create ReleaseConfigs Artifact
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(BARBuildId)
|
||||
Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value "$(DefaultChannels)"
|
||||
Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(IsInternalBuild)
|
||||
Add-Content -Path "$(Build.StagingDirectory)/ReleaseConfigs.txt" -Value $(IsStableBuild)
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish ReleaseConfigs Artifact
|
||||
inputs:
|
||||
PathtoPublish: '$(Build.StagingDirectory)/ReleaseConfigs.txt'
|
||||
PublishLocation: Container
|
||||
ArtifactName: ReleaseConfigs
|
||||
- ${{ if eq(parameters.enablePublishBuildArtifacts, 'true') }}:
|
||||
- task: PublishBuildArtifacts@1
|
||||
displayName: Publish Logs to VSTS
|
||||
|
|
|
|||
|
|
@ -0,0 +1,145 @@
|
|||
parameters:
|
||||
enableSymbolValidation: true
|
||||
|
||||
stages:
|
||||
- stage: Publish
|
||||
dependsOn: validate
|
||||
variables:
|
||||
- template: ../common-variables.yml
|
||||
displayName: Developer Channel
|
||||
jobs:
|
||||
- template: ../setup-maestro-vars.yml
|
||||
|
||||
- job:
|
||||
displayName: Symbol Publishing
|
||||
dependsOn: setupMaestroVars
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], variables.PublicDevRelease_30_Channel_Id)
|
||||
variables:
|
||||
- group: DotNet-Symbol-Server-Pats
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download PDB Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: PDBArtifacts
|
||||
continueOnError: true
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Blob Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: BlobArtifacts
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Publish
|
||||
inputs:
|
||||
filePath: eng\common\sdk-task.ps1
|
||||
arguments: -task PublishToSymbolServers -restore -msbuildEngine dotnet
|
||||
/p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat)
|
||||
/p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat)
|
||||
/p:PDBArtifactsDirectory='$(Build.ArtifactStagingDirectory)/PDBArtifacts/'
|
||||
/p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/'
|
||||
/p:Configuration=Release
|
||||
|
||||
- job:
|
||||
displayName: Publish to Static Feed
|
||||
dependsOn: setupMaestroVars
|
||||
variables:
|
||||
- group: DotNet-Blob-Feed
|
||||
- group: Publish-Build-Assets
|
||||
- name: BARBuildId
|
||||
value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], variables.PublicDevRelease_30_Channel_Id)
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Package Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: PackageArtifacts
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Blob Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: BlobArtifacts
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Asset Manifests
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: AssetManifests
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Publish
|
||||
inputs:
|
||||
filePath: eng\common\sdk-task.ps1
|
||||
arguments: -task PublishToPackageFeed -restore -msbuildEngine dotnet
|
||||
/p:AccountKeyToStaticFeed='$(dotnetfeed-storage-access-key-1)'
|
||||
/p:BARBuildId=$(BARBuildId)
|
||||
/p:MaestroApiEndpoint='https://maestro-prod.westus2.cloudapp.azure.com'
|
||||
/p:BuildAssetRegistryToken='$(MaestroAccessToken)'
|
||||
/p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/'
|
||||
/p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/'
|
||||
/p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/'
|
||||
/p:ArtifactsCategory='$(_DotNetArtifactsCategory)'
|
||||
/p:OverrideAssetsWithSameName=true
|
||||
/p:PassIfExistingItemIdentical=true
|
||||
/p:Configuration=Release
|
||||
|
||||
|
||||
- stage: PublishValidation
|
||||
displayName: Publish Validation
|
||||
variables:
|
||||
- template: ../common-variables.yml
|
||||
jobs:
|
||||
- template: ../setup-maestro-vars.yml
|
||||
|
||||
- ${{ if eq(parameters.enableSymbolValidation, 'true') }}:
|
||||
- job:
|
||||
displayName: Symbol Availability
|
||||
dependsOn: setupMaestroVars
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], variables.PublicDevRelease_30_Channel_Id)
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Package Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: PackageArtifacts
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Check Symbol Availability
|
||||
inputs:
|
||||
filePath: $(Build.SourcesDirectory)/eng/common/post-build/symbols-validation.ps1
|
||||
arguments: -InputPath $(Build.ArtifactStagingDirectory)/PackageArtifacts/ -ExtractPath $(Agent.BuildDirectory)/Temp/ -DotnetSymbolVersion $(SymbolToolVersion)
|
||||
|
||||
- job:
|
||||
displayName: Gather Drop
|
||||
dependsOn: setupMaestroVars
|
||||
variables:
|
||||
BARBuildId: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], variables.PublicDevRelease_30_Channel_Id)
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: PowerShell@2
|
||||
displayName: Setup Darc CLI
|
||||
inputs:
|
||||
targetType: filePath
|
||||
filePath: '$(Build.SourcesDirectory)/eng/common/darc-init.ps1'
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Run Darc gather-drop
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
darc gather-drop --non-shipping --continue-on-error --id $(BARBuildId) --output-dir $(Agent.BuildDirectory)/Temp/Drop/ --bar-uri https://maestro-prod.westus2.cloudapp.azure.com/ --password $(MaestroAccessToken) --latest-location
|
||||
|
||||
- template: ../promote-build.yml
|
||||
parameters:
|
||||
ChannelId: ${{ variables.PublicDevRelease_30_Channel_Id }}
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
stages:
|
||||
- stage: PVR_Publish
|
||||
dependsOn: validate
|
||||
variables:
|
||||
- template: ../common-variables.yml
|
||||
displayName: Validation Channel
|
||||
jobs:
|
||||
- template: ../setup-maestro-vars.yml
|
||||
|
||||
- job:
|
||||
displayName: Publish to Static Feed
|
||||
dependsOn: setupMaestroVars
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], variables.PublicValidationRelease_30_Channel_Id)
|
||||
variables:
|
||||
- group: DotNet-Blob-Feed
|
||||
- group: Publish-Build-Assets
|
||||
- name: BARBuildId
|
||||
value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Package Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: PackageArtifacts
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Blob Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: BlobArtifacts
|
||||
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Asset Manifests
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: AssetManifests
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Publish
|
||||
inputs:
|
||||
filePath: eng\common\sdk-task.ps1
|
||||
arguments: -task PublishToPackageFeed -restore -msbuildEngine dotnet
|
||||
/p:AccountKeyToStaticFeed='$(dotnetfeed-storage-access-key-1)'
|
||||
/p:BARBuildId=$(BARBuildId)
|
||||
/p:MaestroApiEndpoint='https://maestro-prod.westus2.cloudapp.azure.com'
|
||||
/p:BuildAssetRegistryToken='$(MaestroAccessToken)'
|
||||
/p:ManifestsBasePath='$(Build.ArtifactStagingDirectory)/AssetManifests/'
|
||||
/p:BlobBasePath='$(Build.ArtifactStagingDirectory)/BlobArtifacts/'
|
||||
/p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts/'
|
||||
/p:ArtifactsCategory='$(_DotNetArtifactsCategory)'
|
||||
/p:OverrideAssetsWithSameName=true
|
||||
/p:PassIfExistingItemIdentical=true
|
||||
/p:Configuration=Release
|
||||
|
||||
|
||||
- stage: PVR_PublishValidation
|
||||
displayName: Publish Validation
|
||||
variables:
|
||||
- template: ../common-variables.yml
|
||||
jobs:
|
||||
- template: ../setup-maestro-vars.yml
|
||||
|
||||
- job:
|
||||
displayName: Gather Drop
|
||||
dependsOn: setupMaestroVars
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], variables.PublicValidationRelease_30_Channel_Id)
|
||||
variables:
|
||||
- name: BARBuildId
|
||||
value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
|
||||
- group: Publish-Build-Assets
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: PowerShell@2
|
||||
displayName: Setup Darc CLI
|
||||
inputs:
|
||||
targetType: filePath
|
||||
filePath: '$(Build.SourcesDirectory)/eng/common/darc-init.ps1'
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Run Darc gather-drop
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
darc gather-drop --non-shipping --continue-on-error --id $(BARBuildId) --output-dir $(Agent.BuildDirectory)/Temp/Drop/ --bar-uri https://maestro-prod.westus2.cloudapp.azure.com --password $(MaestroAccessToken) --latest-location
|
||||
|
||||
- template: ../promote-build.yml
|
||||
parameters:
|
||||
ChannelId: ${{ variables.PublicValidationRelease_30_Channel_Id }}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
variables:
|
||||
# .NET Core 3 Dev
|
||||
PublicDevRelease_30_Channel_Id: 3
|
||||
|
||||
# .NET Tools - Validation
|
||||
PublicValidationRelease_30_Channel_Id: 9
|
||||
|
||||
SourceLinkCLIVersion: 3.0.0
|
||||
SymbolToolVersion: 1.0.1
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
parameters:
|
||||
enableSourceLinkValidation: true
|
||||
enableSigningValidation: true
|
||||
enableSymbolValidation: true
|
||||
SDLValidationParameters:
|
||||
enable: false
|
||||
params: ''
|
||||
|
||||
stages:
|
||||
- stage: validate
|
||||
dependsOn: build
|
||||
displayName: Validate
|
||||
jobs:
|
||||
- ${{ if eq(parameters.enableSigningValidation, 'true') }}:
|
||||
- job:
|
||||
displayName: Signing Validation
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Package Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: PackageArtifacts
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Validate
|
||||
inputs:
|
||||
filePath: eng\common\sdk-task.ps1
|
||||
arguments: -task SigningValidation -restore -msbuildEngine dotnet
|
||||
/p:PackageBasePath='$(Build.ArtifactStagingDirectory)/PackageArtifacts'
|
||||
/p:Configuration=Release
|
||||
|
||||
- ${{ if eq(parameters.enableSourceLinkValidation, 'true') }}:
|
||||
- job:
|
||||
displayName: SourceLink Validation
|
||||
variables:
|
||||
- template: common-variables.yml
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Blob Artifacts
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: BlobArtifacts
|
||||
|
||||
- task: PowerShell@2
|
||||
displayName: Validate
|
||||
inputs:
|
||||
filePath: $(Build.SourcesDirectory)/eng/common/post-build/sourcelink-validation.ps1
|
||||
arguments: -InputPath $(Build.ArtifactStagingDirectory)/BlobArtifacts/
|
||||
-ExtractPath $(Agent.BuildDirectory)/Extract/
|
||||
-GHRepoName $(Build.Repository.Name)
|
||||
-GHCommit $(Build.SourceVersion)
|
||||
-SourcelinkCliVersion $(SourceLinkCLIVersion)
|
||||
|
||||
- ${{ if eq(parameters.SDLValidationParameters.enable, 'true') }}:
|
||||
- template: /eng/common/templates/job/execute-sdl.yml
|
||||
parameters:
|
||||
additionalParameters: ${{ parameters.SDLValidationParameters.params }}
|
||||
|
||||
- template: \eng\common\templates\post-build\channels\public-dev-release.yml
|
||||
parameters:
|
||||
enableSymbolValidation: ${{ parameters.enableSymbolValidation }}
|
||||
|
||||
- template: \eng\common\templates\post-build\channels\public-validation-release.yml
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
parameters:
|
||||
ChannelId: 0
|
||||
|
||||
jobs:
|
||||
- job:
|
||||
displayName: Promote Build
|
||||
dependsOn: setupMaestroVars
|
||||
condition: contains(dependencies.setupMaestroVars.outputs['setReleaseVars.InitialChannels'], ${{ parameters.ChannelId }})
|
||||
variables:
|
||||
- name: BARBuildId
|
||||
value: $[ dependencies.setupMaestroVars.outputs['setReleaseVars.BARBuildId'] ]
|
||||
- name: ChannelId
|
||||
value: ${{ parameters.ChannelId }}
|
||||
- group: Publish-Build-Assets
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: PowerShell@2
|
||||
displayName: Add Build to Channel
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
$headers = @{
|
||||
"Accept" = "application/json"
|
||||
"Authorization" = "Bearer $(MaestroAccessToken)"
|
||||
}
|
||||
Invoke-RestMethod -Method Post -Headers $headers -Uri https://maestro-prod.westus2.cloudapp.azure.com/api/channels/$(ChannelId)/builds/$(BARBuildId)?api-version=2019-01-16
|
||||
enabled: false
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
jobs:
|
||||
- job: setupMaestroVars
|
||||
displayName: Setup Maestro Vars
|
||||
pool:
|
||||
vmImage: 'windows-2019'
|
||||
steps:
|
||||
- task: DownloadBuildArtifacts@0
|
||||
displayName: Download Release Configs
|
||||
inputs:
|
||||
buildType: current
|
||||
artifactName: ReleaseConfigs
|
||||
|
||||
- task: PowerShell@2
|
||||
name: setReleaseVars
|
||||
displayName: Set Release Configs Vars
|
||||
inputs:
|
||||
targetType: inline
|
||||
script: |
|
||||
# This is needed to make Write-PipelineSetVariable works in this context
|
||||
$ci = $true
|
||||
|
||||
. "$(Build.SourcesDirectory)/eng/common/tools.ps1"
|
||||
|
||||
$Content = Get-Content "$(Build.StagingDirectory)/ReleaseConfigs/ReleaseConfigs.txt"
|
||||
|
||||
$BarId = $Content | Select -Index 0
|
||||
|
||||
$Channels = ""
|
||||
$Content | Select -Index 1 | ForEach-Object { $Channels += "$_ ," }
|
||||
|
||||
$IsInternalBuild = $Content | Select -Index 2
|
||||
$IsStableBuild = $Content | Select -Index 3
|
||||
|
||||
Write-PipelineSetVariable -Name 'BARBuildId' -Value $BarId
|
||||
Write-PipelineSetVariable -Name 'InitialChannels' -Value "$Channels"
|
||||
Write-PipelineSetVariable -Name 'IsInternalBuild' -Value $IsInternalBuild
|
||||
Write-PipelineSetVariable -Name 'IsStableBuild' -Value $IsStableBuild
|
||||
|
|
@ -35,7 +35,7 @@
|
|||
# Specifies which msbuild engine to use for build: 'vs', 'dotnet' or unspecified (determined based on presence of tools.vs in global.json).
|
||||
[string]$msbuildEngine = if (Test-Path variable:msbuildEngine) { $msbuildEngine } else { $null }
|
||||
|
||||
# True to attempt using .NET Core already that meets requirements specified in global.json
|
||||
# True to attempt using .NET Core already that meets requirements specified in global.json
|
||||
# installed on the machine instead of downloading one.
|
||||
[bool]$useInstalledDotNetCli = if (Test-Path variable:useInstalledDotNetCli) { $useInstalledDotNetCli } else { $true }
|
||||
|
||||
|
|
@ -76,7 +76,7 @@ function Exec-Process([string]$command, [string]$commandArgs) {
|
|||
|
||||
$finished = $false
|
||||
try {
|
||||
while (-not $process.WaitForExit(100)) {
|
||||
while (-not $process.WaitForExit(100)) {
|
||||
# Non-blocking loop done to allow ctr-c interrupts
|
||||
}
|
||||
|
||||
|
|
@ -92,68 +92,6 @@ function Exec-Process([string]$command, [string]$commandArgs) {
|
|||
}
|
||||
}
|
||||
|
||||
function Write-PipelineTaskError {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Message,
|
||||
[Parameter(Mandatory = $false)]
|
||||
[string]$Type = 'error',
|
||||
[string]$ErrCode,
|
||||
[string]$SourcePath,
|
||||
[string]$LineNumber,
|
||||
[string]$ColumnNumber,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if(!$ci) {
|
||||
if($Type -eq 'error') {
|
||||
Write-Error $Message
|
||||
return
|
||||
}
|
||||
elseif ($Type -eq 'warning') {
|
||||
Write-Warning $Message
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
if(($Type -ne 'error') -and ($Type -ne 'warning')) {
|
||||
Write-Host $Message
|
||||
return
|
||||
}
|
||||
if(-not $PSBoundParameters.ContainsKey('Type')) {
|
||||
$PSBoundParameters.Add('Type', 'error')
|
||||
}
|
||||
Write-LogIssue @PSBoundParameters
|
||||
}
|
||||
|
||||
function Write-PipelineSetVariable {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory = $true)]
|
||||
[string]$Name,
|
||||
[string]$Value,
|
||||
[switch]$Secret,
|
||||
[switch]$AsOutput)
|
||||
|
||||
if($ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'setvariable' -Data $Value -Properties @{
|
||||
'variable' = $Name
|
||||
'issecret' = $Secret
|
||||
} -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
function Write-PipelinePrependPath {
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[Parameter(Mandatory=$true)]
|
||||
[string]$Path,
|
||||
[switch]$AsOutput)
|
||||
if($ci) {
|
||||
Write-LoggingCommand -Area 'task' -Event 'prependpath' -Data $Path -AsOutput:$AsOutput
|
||||
}
|
||||
}
|
||||
|
||||
function InitializeDotNetCli([bool]$install) {
|
||||
if (Test-Path variable:global:_DotNetInstallDir) {
|
||||
return $global:_DotNetInstallDir
|
||||
|
|
@ -196,7 +134,7 @@ function InitializeDotNetCli([bool]$install) {
|
|||
if ($install) {
|
||||
InstallDotNetSdk $dotnetRoot $dotnetSdkVersion
|
||||
} else {
|
||||
Write-PipelineTaskError "Unable to find dotnet with SDK version '$dotnetSdkVersion'"
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message "Unable to find dotnet with SDK version '$dotnetSdkVersion'"
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
|
@ -244,13 +182,13 @@ function InstallDotNet([string] $dotnetRoot, [string] $version, [string] $archit
|
|||
|
||||
& $installScript @installParameters
|
||||
if ($lastExitCode -ne 0) {
|
||||
Write-PipelineTaskError -Message "Failed to install dotnet cli (exit code '$lastExitCode')."
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message "Failed to install dotnet cli (exit code '$lastExitCode')."
|
||||
ExitWithExitCode $lastExitCode
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# Locates Visual Studio MSBuild installation.
|
||||
# Locates Visual Studio MSBuild installation.
|
||||
# The preference order for MSBuild to use is as follows:
|
||||
#
|
||||
# 1. MSBuild from an active VS command prompt
|
||||
|
|
@ -267,7 +205,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
|
|||
|
||||
if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
|
||||
$vsMinVersionStr = if ($vsRequirements.version) { $vsRequirements.version } else { "15.9" }
|
||||
$vsMinVersion = [Version]::new($vsMinVersionStr)
|
||||
$vsMinVersion = [Version]::new($vsMinVersionStr)
|
||||
|
||||
# Try msbuild command available in the environment.
|
||||
if ($env:VSINSTALLDIR -ne $null) {
|
||||
|
|
@ -316,7 +254,7 @@ function InitializeVisualStudioMSBuild([bool]$install, [object]$vsRequirements =
|
|||
function InitializeVisualStudioEnvironmentVariables([string] $vsInstallDir, [string] $vsMajorVersion) {
|
||||
$env:VSINSTALLDIR = $vsInstallDir
|
||||
Set-Item "env:VS$($vsMajorVersion)0COMNTOOLS" (Join-Path $vsInstallDir "Common7\Tools\")
|
||||
|
||||
|
||||
$vsSdkInstallDir = Join-Path $vsInstallDir "VSSDK\"
|
||||
if (Test-Path $vsSdkInstallDir) {
|
||||
Set-Item "env:VSSDK$($vsMajorVersion)0Install" $vsSdkInstallDir
|
||||
|
|
@ -351,13 +289,13 @@ function InitializeXCopyMSBuild([string]$packageVersion, [bool]$install) {
|
|||
# Locates Visual Studio instance that meets the minimal requirements specified by tools.vs object in global.json.
|
||||
#
|
||||
# The following properties of tools.vs are recognized:
|
||||
# "version": "{major}.{minor}"
|
||||
# "version": "{major}.{minor}"
|
||||
# Two part minimal VS version, e.g. "15.9", "16.0", etc.
|
||||
# "components": ["componentId1", "componentId2", ...]
|
||||
# "components": ["componentId1", "componentId2", ...]
|
||||
# Array of ids of workload components that must be available in the VS instance.
|
||||
# See e.g. https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-enterprise?view=vs-2017
|
||||
#
|
||||
# Returns JSON describing the located VS instance (same format as returned by vswhere),
|
||||
# Returns JSON describing the located VS instance (same format as returned by vswhere),
|
||||
# or $null if no instance meeting the requirements is found on the machine.
|
||||
#
|
||||
function LocateVisualStudio([object]$vsRequirements = $null){
|
||||
|
|
@ -377,8 +315,8 @@ function LocateVisualStudio([object]$vsRequirements = $null){
|
|||
}
|
||||
|
||||
if (!$vsRequirements) { $vsRequirements = $GlobalJson.tools.vs }
|
||||
$args = @("-latest", "-prerelease", "-format", "json", "-requires", "Microsoft.Component.MSBuild")
|
||||
|
||||
$args = @("-latest", "-prerelease", "-format", "json", "-requires", "Microsoft.Component.MSBuild", "-products", "*")
|
||||
|
||||
if (Get-Member -InputObject $vsRequirements -Name "version") {
|
||||
$args += "-version"
|
||||
$args += $vsRequirements.version
|
||||
|
|
@ -388,7 +326,7 @@ function LocateVisualStudio([object]$vsRequirements = $null){
|
|||
foreach ($component in $vsRequirements.components) {
|
||||
$args += "-requires"
|
||||
$args += $component
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$vsInfo =& $vsWhereExe $args | ConvertFrom-Json
|
||||
|
|
@ -418,7 +356,7 @@ function InitializeBuildTool() {
|
|||
|
||||
if ($msbuildEngine -eq "dotnet") {
|
||||
if (!$dotnetRoot) {
|
||||
Write-PipelineTaskError "/global.json must specify 'tools.dotnet'."
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message "/global.json must specify 'tools.dotnet'."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
@ -427,13 +365,13 @@ function InitializeBuildTool() {
|
|||
try {
|
||||
$msbuildPath = InitializeVisualStudioMSBuild -install:$restore
|
||||
} catch {
|
||||
Write-PipelineTaskError $_
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message $_
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
$buildTool = @{ Path = $msbuildPath; Command = ""; Tool = "vs"; Framework = "net472" }
|
||||
} else {
|
||||
Write-PipelineTaskError "Unexpected value of -msbuildEngine: '$msbuildEngine'."
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message "Unexpected value of -msbuildEngine: '$msbuildEngine'."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
@ -445,12 +383,12 @@ function GetDefaultMSBuildEngine() {
|
|||
if (Get-Member -InputObject $GlobalJson.tools -Name "vs") {
|
||||
return "vs"
|
||||
}
|
||||
|
||||
|
||||
if (Get-Member -InputObject $GlobalJson.tools -Name "dotnet") {
|
||||
return "dotnet"
|
||||
}
|
||||
|
||||
Write-PipelineTaskError "-msbuildEngine must be specified, or /global.json must specify 'tools.dotnet' or 'tools.vs'."
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message "-msbuildEngine must be specified, or /global.json must specify 'tools.dotnet' or 'tools.vs'."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
@ -475,11 +413,13 @@ function GetSdkTaskProject([string]$taskName) {
|
|||
|
||||
function InitializeNativeTools() {
|
||||
if (Get-Member -InputObject $GlobalJson -Name "native-tools") {
|
||||
$nativeArgs=""
|
||||
$nativeArgs= @{}
|
||||
if ($ci) {
|
||||
$nativeArgs = "-InstallDirectory $ToolsDir"
|
||||
$nativeArgs = @{
|
||||
InstallDirectory = "$ToolsDir"
|
||||
}
|
||||
}
|
||||
Invoke-Expression "& `"$PSScriptRoot/init-tools-native.ps1`" $nativeArgs"
|
||||
& "$PSScriptRoot/init-tools-native.ps1" @nativeArgs
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -501,7 +441,7 @@ function InitializeToolset() {
|
|||
}
|
||||
|
||||
if (-not $restore) {
|
||||
Write-PipelineTaskError "Toolset version $toolsetVersion has not been restored."
|
||||
Write-PipelineTelemetryError -Category "InitializeToolset" -Message "Toolset version $toolsetVersion has not been restored."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
|
|
@ -561,11 +501,13 @@ function MSBuild() {
|
|||
function MSBuild-Core() {
|
||||
if ($ci) {
|
||||
if (!$binaryLog) {
|
||||
throw "Binary log must be enabled in CI build."
|
||||
Write-PipelineTaskError -Message "Binary log must be enabled in CI build."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
|
||||
if ($nodeReuse) {
|
||||
throw "Node reuse must be disabled in CI build."
|
||||
Write-PipelineTaskError -Message "Node reuse must be disabled in CI build."
|
||||
ExitWithExitCode 1
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -573,8 +515,8 @@ function MSBuild-Core() {
|
|||
|
||||
$cmdArgs = "$($buildTool.Command) /m /nologo /clp:Summary /v:$verbosity /nr:$nodeReuse /p:ContinuousIntegrationBuild=$ci"
|
||||
|
||||
if ($warnAsError) {
|
||||
$cmdArgs += " /warnaserror /p:TreatWarningsAsErrors=true"
|
||||
if ($warnAsError) {
|
||||
$cmdArgs += " /warnaserror /p:TreatWarningsAsErrors=true"
|
||||
}
|
||||
|
||||
foreach ($arg in $args) {
|
||||
|
|
@ -582,29 +524,29 @@ function MSBuild-Core() {
|
|||
$cmdArgs += " `"$arg`""
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$exitCode = Exec-Process $buildTool.Path $cmdArgs
|
||||
|
||||
if ($exitCode -ne 0) {
|
||||
Write-PipelineTaskError "Build failed."
|
||||
Write-PipelineTaskError -Message "Build failed."
|
||||
|
||||
$buildLog = GetMSBuildBinaryLogCommandLineArgument $args
|
||||
if ($buildLog -ne $null) {
|
||||
Write-Host "See log: $buildLog" -ForegroundColor DarkGray
|
||||
if ($buildLog -ne $null) {
|
||||
Write-Host "See log: $buildLog" -ForegroundColor DarkGray
|
||||
}
|
||||
|
||||
ExitWithExitCode $exitCode
|
||||
}
|
||||
}
|
||||
|
||||
function GetMSBuildBinaryLogCommandLineArgument($arguments) {
|
||||
function GetMSBuildBinaryLogCommandLineArgument($arguments) {
|
||||
foreach ($argument in $arguments) {
|
||||
if ($argument -ne $null) {
|
||||
$arg = $argument.Trim()
|
||||
if ($arg.StartsWith("/bl:", "OrdinalIgnoreCase")) {
|
||||
return $arg.Substring("/bl:".Length)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($arg.StartsWith("/binaryLogger:", "OrdinalIgnoreCase")) {
|
||||
return $arg.Substring("/binaryLogger:".Length)
|
||||
}
|
||||
|
|
@ -614,7 +556,7 @@ function GetMSBuildBinaryLogCommandLineArgument($arguments) {
|
|||
return $null
|
||||
}
|
||||
|
||||
. $PSScriptRoot\LoggingCommandFunctions.ps1
|
||||
. $PSScriptRoot\pipeline-logging-functions.ps1
|
||||
|
||||
$RepoRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..")
|
||||
$EngRoot = Resolve-Path (Join-Path $PSScriptRoot "..")
|
||||
|
|
|
|||
|
|
@ -52,78 +52,6 @@ else
|
|||
use_global_nuget_cache=${use_global_nuget_cache:-true}
|
||||
fi
|
||||
|
||||
function EmitError {
|
||||
if [[ "$ci" != true ]]; then
|
||||
echo "$@" >&2
|
||||
return
|
||||
fi
|
||||
|
||||
message_type="error"
|
||||
sourcepath=''
|
||||
linenumber=''
|
||||
columnnumber=''
|
||||
error_code=''
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
opt="$(echo "${1/#--/-}" | awk '{print tolower($0)}')"
|
||||
case "$opt" in
|
||||
-type|-t)
|
||||
message_type=$2
|
||||
shift
|
||||
;;
|
||||
-sourcepath|-s)
|
||||
sourcepath=$2
|
||||
shift
|
||||
;;
|
||||
-linenumber|-l)
|
||||
linenumber=$2
|
||||
shift
|
||||
;;
|
||||
-columnnumber|-col)
|
||||
columnnumber=$2
|
||||
shift
|
||||
;;
|
||||
-code|-c)
|
||||
error_code=$2
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
|
||||
shift
|
||||
done
|
||||
|
||||
message='##vso[task.logissue'
|
||||
|
||||
message="$message type=$message_type"
|
||||
|
||||
if [ -n "$sourcepath" ]; then
|
||||
message="$message;sourcepath=$sourcepath"
|
||||
else
|
||||
message="$message;sourcepath=${BASH_SOURCE[1]}"
|
||||
fi
|
||||
|
||||
if [ -n "$linenumber" ]; then
|
||||
message="$message;linenumber=$linenumber"
|
||||
else
|
||||
message="$message;linenumber=${BASH_LINENO[0]}"
|
||||
fi
|
||||
|
||||
if [ -n "$columnnumber" ]; then
|
||||
message="$message;columnnumber=$columnnumber"
|
||||
fi
|
||||
|
||||
if [ -n "$error_code" ]; then
|
||||
message="$message;code=$error_code"
|
||||
fi
|
||||
|
||||
message="$message]$*"
|
||||
|
||||
echo "$message"
|
||||
}
|
||||
|
||||
# Resolve any symlinks in the given path.
|
||||
function ResolvePath {
|
||||
local path=$1
|
||||
|
|
@ -149,7 +77,7 @@ function ReadGlobalVersion {
|
|||
local pattern="\"$key\" *: *\"(.*)\""
|
||||
|
||||
if [[ ! $line =~ $pattern ]]; then
|
||||
EmitError "Error: Cannot find \"$key\" in $global_json_file"
|
||||
Write-PipelineTelemetryError -category 'InitializeTools' "Error: Cannot find \"$key\" in $global_json_file"
|
||||
ExitWithExitCode 1
|
||||
fi
|
||||
|
||||
|
|
@ -210,7 +138,7 @@ function InitializeDotNetCli {
|
|||
if [[ "$install" == true ]]; then
|
||||
InstallDotNetSdk "$dotnet_root" "$dotnet_sdk_version"
|
||||
else
|
||||
EmitError "Unable to find dotnet with SDK version '$dotnet_sdk_version'"
|
||||
Write-PipelineTelemetryError -category 'InitializeToolset' "Unable to find dotnet with SDK version '$dotnet_sdk_version'"
|
||||
ExitWithExitCode 1
|
||||
fi
|
||||
fi
|
||||
|
|
@ -221,7 +149,7 @@ function InitializeDotNetCli {
|
|||
export PATH="$dotnet_root:$PATH"
|
||||
|
||||
if [[ $ci == true ]]; then
|
||||
# Make Sure that our bootstrapped dotnet cli is avaliable in future steps of the Azure Pipelines build
|
||||
# Make Sure that our bootstrapped dotnet cli is available in future steps of the Azure Pipelines build
|
||||
echo "##vso[task.prependpath]$dotnet_root"
|
||||
echo "##vso[task.setvariable variable=DOTNET_MULTILEVEL_LOOKUP]0"
|
||||
echo "##vso[task.setvariable variable=DOTNET_SKIP_FIRST_TIME_EXPERIENCE]1"
|
||||
|
|
@ -263,7 +191,7 @@ function InstallDotNet {
|
|||
fi
|
||||
bash "$install_script" --version $version --install-dir "$root" $archArg $runtimeArg $skipNonVersionedFilesArg || {
|
||||
local exit_code=$?
|
||||
EmitError "Failed to install dotnet SDK (exit code '$exit_code')."
|
||||
Write-PipelineTelemetryError -category 'InitializeToolset' "Failed to install dotnet SDK (exit code '$exit_code')."
|
||||
ExitWithExitCode $exit_code
|
||||
}
|
||||
}
|
||||
|
|
@ -349,7 +277,7 @@ function InitializeToolset {
|
|||
fi
|
||||
|
||||
if [[ "$restore" != true ]]; then
|
||||
EmitError "Toolset version $toolsetVersion has not been restored."
|
||||
Write-PipelineTelemetryError -category 'InitializeToolset' "Toolset version $toolset_version has not been restored."
|
||||
ExitWithExitCode 2
|
||||
fi
|
||||
|
||||
|
|
@ -366,7 +294,7 @@ function InitializeToolset {
|
|||
local toolset_build_proj=`cat "$toolset_location_file"`
|
||||
|
||||
if [[ ! -a "$toolset_build_proj" ]]; then
|
||||
EmitError "Invalid toolset path: $toolset_build_proj"
|
||||
Write-PipelineTelemetryError -category 'InitializeToolset' "Invalid toolset path: $toolset_build_proj"
|
||||
ExitWithExitCode 3
|
||||
fi
|
||||
|
||||
|
|
@ -404,12 +332,12 @@ function MSBuild {
|
|||
function MSBuild-Core {
|
||||
if [[ "$ci" == true ]]; then
|
||||
if [[ "$binary_log" != true ]]; then
|
||||
EmitError "Binary log must be enabled in CI build."
|
||||
Write-PipelineTaskError "Binary log must be enabled in CI build."
|
||||
ExitWithExitCode 1
|
||||
fi
|
||||
|
||||
if [[ "$node_reuse" == true ]]; then
|
||||
EmitError "Node reuse must be disabled in CI build."
|
||||
Write-PipelineTaskError "Node reuse must be disabled in CI build."
|
||||
ExitWithExitCode 1
|
||||
fi
|
||||
fi
|
||||
|
|
@ -423,7 +351,7 @@ function MSBuild-Core {
|
|||
|
||||
"$_InitializeBuildTool" "$_InitializeBuildToolCommand" /m /nologo /clp:Summary /v:$verbosity /nr:$node_reuse $warnaserror_switch /p:TreatWarningsAsErrors=$warn_as_error /p:ContinuousIntegrationBuild=$ci "$@" || {
|
||||
local exit_code=$?
|
||||
EmitError "Build failed (exit code '$exit_code')."
|
||||
Write-PipelineTaskError "Build failed (exit code '$exit_code')."
|
||||
ExitWithExitCode $exit_code
|
||||
}
|
||||
}
|
||||
|
|
@ -431,6 +359,8 @@ function MSBuild-Core {
|
|||
ResolvePath "${BASH_SOURCE[0]}"
|
||||
_script_dir=`dirname "$_ResolvePath"`
|
||||
|
||||
. "$_script_dir/pipeline-logging-functions.sh"
|
||||
|
||||
eng_root=`cd -P "$_script_dir/.." && pwd`
|
||||
repo_root=`cd -P "$_script_dir/../.." && pwd`
|
||||
artifacts_dir="$repo_root/artifacts"
|
||||
|
|
@ -460,4 +390,4 @@ mkdir -p "$log_dir"
|
|||
if [[ $ci == true ]]; then
|
||||
export TEMP="$temp_dir"
|
||||
export TMP="$temp_dir"
|
||||
fi
|
||||
fi
|
||||
|
|
|
|||
|
|
@ -0,0 +1,5 @@
|
|||
# We can't use already installed dotnet cli since we need to install additional shared runtimes.
|
||||
# We could potentially try to find an existing installation that has all the required runtimes,
|
||||
# but it's unlikely one will be available.
|
||||
|
||||
$script:useInstalledDotNetCli = $false
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
# We can't use already installed dotnet cli since we need to install additional shared runtimes.
|
||||
# We could potentially try to find an existing installation that has all the required runtimes,
|
||||
# but it's unlikely one will be available.
|
||||
|
||||
if [ "${DotNetBuildFromSource:-false}" = false ]; then
|
||||
use_installed_dotnet_cli="false"
|
||||
fi
|
||||
|
|
@ -1,7 +1,15 @@
|
|||
<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test">
|
||||
<Project Sdk="Microsoft.DotNet.Helix.Sdk" DefaultTargets="Test" TreatAsLocalProperty="ProjectToBuild">
|
||||
|
||||
<Import Project="$(MSBuildThisFileDirectory)..\targets\Helix.Common.props" />
|
||||
<Import Project="$(MSBuildThisFileDirectory)..\..\build\repo.props" />
|
||||
<PropertyGroup>
|
||||
<!--
|
||||
When invoking helix.proj for the whole repo with build.cmd, ProjectToBuild will be set to the path to this project.
|
||||
This must be reset in order for Build.props to evaluate a list of projects to be tested on Helix.
|
||||
-->
|
||||
<ProjectToBuild Condition="'$(ProjectToBuild)' == '$(MSBuildProjectFullPath)'"/>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="..\targets\Helix.Common.props" />
|
||||
<Import Project="..\Build.props" />
|
||||
|
||||
<ItemGroup>
|
||||
<HelixTargetQueue Include="@(HelixAvailableTargetQueue)" />
|
||||
|
|
@ -16,7 +24,7 @@
|
|||
<MaxRetryCount Condition="'$(MaxRetryCount)' == ''">2</MaxRetryCount>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(CI)' == 'true' ">
|
||||
<PropertyGroup Condition=" '$(ContinuousIntegrationBuild)' == 'true' ">
|
||||
<HelixType>ci</HelixType>
|
||||
<Creator>aspnetcore</Creator>
|
||||
<HelixBuild>$(BUILD_BUILDNUMBER).$(SYSTEM_JOBATTEMPT)</HelixBuild>
|
||||
|
|
@ -25,11 +33,11 @@
|
|||
<FailOnMissionControlTestFailure>true</FailOnMissionControlTestFailure>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(CI)' != 'true' ">
|
||||
<PropertyGroup Condition=" '$(ContinuousIntegrationBuild)' != 'true' ">
|
||||
<HelixType>dev</HelixType>
|
||||
<Creator>$(USERNAME)</Creator>
|
||||
<Creator Condition="'$(USERNAME)' == ''">$(USER)</Creator>
|
||||
<HelixBuild>$([System.DateTime]::Now.ToString('yyyyMMdd HH:mm'))</HelixBuild>
|
||||
<HelixBuild>$([System.DateTime]::Now.ToString('yyyyMMddHHmm'))</HelixBuild>
|
||||
</PropertyGroup>
|
||||
|
||||
<Target Name="Gather" BeforeTargets="Build">
|
||||
|
|
|
|||
|
|
@ -1,60 +0,0 @@
|
|||
<#
|
||||
.SYNOPSIS
|
||||
This adds the complete closure of project references to a .sln file
|
||||
|
||||
.EXAMPLE
|
||||
Let's say you have a folder of projects in src/Banana/, and a file src/Banana/Banana.sln.
|
||||
To traverse the ProjectReference graph to add all dependency projects, run this script:
|
||||
|
||||
./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir ./src/Banana/
|
||||
|
||||
.EXAMPLE
|
||||
If src/Banana/ has multiple .sln files, use the -sln parameter.
|
||||
|
||||
./eng/scripts/AddAllProjectRefsToSolution.ps1 -WorkingDir ./src/Banana/ -SolutionFile src/Banana/Solution1.sln
|
||||
#>
|
||||
[CmdletBinding(PositionalBinding = $false)]
|
||||
param(
|
||||
[string]$WorkingDir,
|
||||
[Alias('sln')]
|
||||
[string]$SolutionFile
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$repoRoot = Resolve-Path "$PSScriptRoot/../../"
|
||||
$listFile = New-TemporaryFile
|
||||
|
||||
if (-not $WorkingDir) {
|
||||
$WorkingDir = Get-Location
|
||||
}
|
||||
|
||||
Push-Location $WorkingDir
|
||||
try {
|
||||
if (-not $SolutionFile) {
|
||||
|
||||
$slnCount = Get-ChildItem *.sln | Measure
|
||||
|
||||
if ($slnCount.count -eq 0) {
|
||||
Write-Error "Could not find a solution in this directory. Specify one with -sln <PATH>"
|
||||
exit 1
|
||||
}
|
||||
if ($slnCount.count -gt 1) {
|
||||
Write-Error "Multiple solutions found in this directory. Specify which one to modify with -sln <PATH>"
|
||||
exit 1
|
||||
}
|
||||
$SolutionFile = Get-ChildItem *.sln | select -first 1
|
||||
}
|
||||
|
||||
& "$repoRoot\build.ps1" -projects "$(Get-Location)\**\*.*proj" /t:ShowProjectClosure "/p:ProjectsReferencedOutFile=$listFile"
|
||||
|
||||
foreach ($proj in (Get-Content $listFile)) {
|
||||
& dotnet sln $SolutionFile add $proj
|
||||
if ($lastexitcode -ne 0) {
|
||||
Write-Warning "Failed to add $proj to $SolutionFile"
|
||||
}
|
||||
}
|
||||
}
|
||||
finally {
|
||||
Pop-Location
|
||||
rm $listFile -ea ignore
|
||||
}
|
||||
|
|
@ -43,9 +43,11 @@ function LogError {
|
|||
try {
|
||||
if ($ci) {
|
||||
# Install dotnet.exe
|
||||
& $repoRoot/build.ps1 -ci -norestore /t:InstallDotNet
|
||||
& $repoRoot/restore.cmd -ci -NoBuildNodeJS
|
||||
}
|
||||
|
||||
. "$repoRoot/activate.ps1"
|
||||
|
||||
#
|
||||
# Duplicate .csproj files can cause issues with a shared build output folder
|
||||
#
|
||||
|
|
@ -55,7 +57,7 @@ try {
|
|||
# Ignore duplicates in submodules. These should be isolated from the rest of the build.
|
||||
# Ignore duplicates in the .ref folder. This is expected.
|
||||
Get-ChildItem -Recurse "$repoRoot/src/*.*proj" `
|
||||
| ? { $_.FullName -notmatch 'submodules' } `
|
||||
| ? { $_.FullName -notmatch 'submodules' -and $_.FullName -notmatch 'node_modules' } `
|
||||
| ? { (Split-Path -Leaf (Split-Path -Parent $_)) -ne 'ref' } `
|
||||
| % {
|
||||
$fileName = [io.path]::GetFileNameWithoutExtension($_)
|
||||
|
|
@ -122,10 +124,6 @@ try {
|
|||
-filepath "$repoRoot\eng\Versions.props"
|
||||
}
|
||||
|
||||
#
|
||||
# Solutions
|
||||
#
|
||||
|
||||
Write-Host "Checking that solutions are up to date"
|
||||
|
||||
Get-ChildItem "$repoRoot/*.sln" -Recurse `
|
||||
|
|
@ -164,17 +162,13 @@ try {
|
|||
}
|
||||
|
||||
Write-Host "Re-generating package baselines"
|
||||
$dotnet = 'dotnet'
|
||||
if ($ci) {
|
||||
$dotnet = "$repoRoot/.dotnet/dotnet.exe"
|
||||
}
|
||||
Invoke-Block {
|
||||
& $dotnet run -p "$repoRoot/eng/tools/BaselineGenerator/"
|
||||
& dotnet run -p "$repoRoot/eng/tools/BaselineGenerator/"
|
||||
}
|
||||
|
||||
Write-Host "Re-generating Browser.JS files"
|
||||
Invoke-Block {
|
||||
& $dotnet build "$repoRoot\src\Components\Browser.JS\Microsoft.AspNetCore.Components.Browser.JS.npmproj"
|
||||
& dotnet build "$repoRoot\src\Components\Browser.JS\Microsoft.AspNetCore.Components.Browser.JS.npmproj"
|
||||
}
|
||||
|
||||
Write-Host "Run git diff to check for pending changes"
|
||||
|
|
|
|||
|
|
@ -5,4 +5,6 @@ $ErrorActionPreference = 'stop'
|
|||
|
||||
$repoRoot = Resolve-Path "$PSScriptRoot/../.."
|
||||
|
||||
& "$repoRoot\build.ps1" -ci:$ci -NoRestore -all /t:GenerateProjectList
|
||||
& "$repoRoot\eng\common\msbuild.ps1" -ci:$ci "$repoRoot/eng/CodeGen.proj" `
|
||||
/t:GenerateProjectList `
|
||||
/bl:artifacts/log/genprojlist.binlog
|
||||
|
|
|
|||
|
|
@ -5,4 +5,6 @@ $ErrorActionPreference = 'stop'
|
|||
|
||||
$repoRoot = Resolve-Path "$PSScriptRoot/../.."
|
||||
|
||||
& "$repoRoot\build.ps1" -ci:$ci -BuildManaged -NoBuildNodeJS /t:GenerateReferenceSources
|
||||
& "$repoRoot\eng\common\msbuild.ps1" -ci:$ci "$repoRoot/eng/CodeGen.proj" `
|
||||
/t:GenerateReferenceSources `
|
||||
/bl:artifacts/log/genrefassemblies.binlog
|
||||
|
|
|
|||
|
|
@ -45,14 +45,18 @@ _kill iisexpresstray.exe
|
|||
_kill w3wp.exe
|
||||
_kill msbuild.exe
|
||||
_kill vbcscompiler.exe
|
||||
_kill git.exe
|
||||
_kill vctip.exe
|
||||
_kill chrome.exe
|
||||
_kill h2spec.exe
|
||||
_kill WerFault.exe
|
||||
_killJavaInstances
|
||||
_killSeleniumTrackedProcesses
|
||||
|
||||
# Special case these. When testing with -ci locally, you typically don't actually want to kill your browser or git command line
|
||||
if ($env:TF_BUILD) {
|
||||
_kill chrome.exe
|
||||
_kill git.exe
|
||||
}
|
||||
|
||||
if (Get-Command iisreset -ErrorAction ignore) {
|
||||
iisreset /restart
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +0,0 @@
|
|||
@ECHO OFF
|
||||
SET RepoRoot=%~dp0..\..
|
||||
%RepoRoot%\build.cmd -ci -all -pack -sign %*
|
||||
SET exit_code=%ERRORLEVEL%
|
||||
ECHO build.cmd completed
|
||||
EXIT /b %exit_code%
|
||||
|
|
@ -4,3 +4,4 @@ curl -sSL http://nginx.org/download/nginx-1.14.2.tar.gz | tar zxfv - -C /tmp &&
|
|||
./configure --prefix=$HOME/nginxinstall --with-http_ssl_module
|
||||
make
|
||||
make install
|
||||
echo "##vso[task.prependpath]$HOME/nginxinstall/sbin"
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
*/AppHostTemplate/apphost.exe;AspNetCoreRuntime.*.nupkg; Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it.
|
||||
*/runtime.*.microsoft.netcore.dotnetapphost/*/apphost.exe;Microsoft.AspNetCore.AzureAppServices.SiteExtension.*.nupkg; Exclude the apphost because this is expected to be code-signed by customers after the SDK modifies it.
|
||||
*.js;; Exclude all JavaScript files from codesigning because we don't expect these to run on Windows Script Host
|
||||
*.binlog;; Exclude msbuild log files
|
||||
*.symbols.nupkg;; Exclude NuGet symbols packages. These are not shipped to customers and should not be code signed.
|
||||
;*.symbols.nupkg; Exclude everything inside NuGet symbols packages. These are not shipped to customers and should not be code signed.
|
||||
;runtime.osx-x64.Microsoft.AspNetCore.App.*.nupkg; Exclude the contents of the MacOS runtime package because MacOS only supports codesigning for MacOS native binaries and apps
|
||||
;runtime.linux-*.Microsoft.AspNetCore.App.*.nupkg; Exclude the contents of the Linux runtime packages because Linux doesn't support validating authenticode signatures
|
||||
|
|
@ -13,12 +13,12 @@
|
|||
|
||||
This target is meant to be used when invoking helix tests on one project at a time.
|
||||
|
||||
Usage: dotnet build /t:Helix src/MyTestProject.csproj
|
||||
Usage: dotnet msbuild /t:Helix src/MyTestProject.csproj
|
||||
|
||||
-->
|
||||
<Target Name="Helix">
|
||||
<MSBuild Projects="$(MSBuildThisFileDirectory)..\helix\helix.proj"
|
||||
Properties="Projects=$(MSBuildProjectFullPath)" />
|
||||
Properties="ProjectToBuild=$(MSBuildProjectFullPath)" />
|
||||
</Target>
|
||||
|
||||
<!-- Build the actual helix work items to send to helix queues -->
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<NpmTestArgs>test</NpmTestArgs>
|
||||
<Configuration Condition="'$(Configuration)' == '' AND '$(CI)' == 'true'">Release</Configuration>
|
||||
<Configuration Condition="'$(Configuration)' == '' AND '$(ContinuousIntegrationBuild)' == 'true'">Release</Configuration>
|
||||
<Configuration Condition="'$(Configuration)' == ''">Debug</Configuration>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@
|
|||
<Exec Condition="'$(OS)' != 'Windows_NT'"
|
||||
Command="echo '$(ProjectListContentLines.Replace('\t','\\t'))' > $(_RefProjectFileOutputPath)" />
|
||||
|
||||
<Message Importance="High" Text="Generated $(_RefProjectFileOutputPath)" />
|
||||
</Target>
|
||||
|
||||
<Target Name="_GenerateProjectSourceInner" Returns="@(ProjectListContent)" DependsOnTargets="Build" Condition="'$(TargetFrameworkIdentifier)' != '.NETFramework'">
|
||||
|
|
@ -65,6 +66,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<MakeDir Directories="$(_RefSourceOutputPath)" />
|
||||
<Message Importance="High" Text="Generating $(_RefSourceFileOutputPath)" />
|
||||
<Exec Command="$(_GenAPICmd)" />
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -103,10 +103,6 @@
|
|||
</ProjectReference>
|
||||
|
||||
<Reference Remove="@(_ProjectReferenceByAssemblyName)" />
|
||||
|
||||
<!-- Use _ReferenceTemp to workaround issues in Visual Studio which causes a conflict between Reference, packages, and projects. -->
|
||||
<_ReferenceTemp Include="@(Reference)" />
|
||||
<Reference Remove="@(Reference)" />
|
||||
</ItemGroup>
|
||||
|
||||
<!--
|
||||
|
|
@ -135,9 +131,6 @@
|
|||
-->
|
||||
<Target Name="ResolveCustomReferences" BeforeTargets="CollectPackageReferences;ResolveAssemblyReferencesDesignTime;ResolveAssemblyReferences" Condition=" '$(TargetFramework)' != '' ">
|
||||
<ItemGroup>
|
||||
<Reference Include="@(_ReferenceTemp)" />
|
||||
<_ReferenceTemp Remove="@(_ReferenceTemp)" />
|
||||
|
||||
<!-- Ensure only content asset are consumed from .Sources packages -->
|
||||
<Reference>
|
||||
<IncludeAssets Condition="'%(IsSharedSource)' == 'true'">ContentFiles;Build</IncludeAssets>
|
||||
|
|
|
|||
|
|
@ -1,2 +1,9 @@
|
|||
<Project>
|
||||
<Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory)..\, Directory.Build.props))\Directory.Build.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
<IsPackable>false</IsPackable>
|
||||
<HasReferenceAssembly>false</HasReferenceAssembly>
|
||||
<DisablePackageReferenceRestrictions>true</DisablePackageReferenceRestrictions>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
<Project>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,107 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Xml.Linq;
|
||||
using Microsoft.Build.Framework;
|
||||
using Microsoft.Build.Utilities;
|
||||
|
||||
namespace RepoTasks
|
||||
{
|
||||
public class CreateFrameworkListFile : Task
|
||||
{
|
||||
/// <summary>
|
||||
/// Files to extract basic information from and include in the list.
|
||||
/// </summary>
|
||||
[Required]
|
||||
public ITaskItem[] Files { get; set; }
|
||||
|
||||
[Required]
|
||||
public string TargetFile { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Extra attributes to place on the root node.
|
||||
///
|
||||
/// %(Identity): Attribute name.
|
||||
/// %(Value): Attribute value.
|
||||
/// </summary>
|
||||
public ITaskItem[] RootAttributes { get; set; }
|
||||
|
||||
public override bool Execute()
|
||||
{
|
||||
XAttribute[] rootAttributes = RootAttributes
|
||||
?.Select(item => new XAttribute(item.ItemSpec, item.GetMetadata("Value")))
|
||||
.ToArray();
|
||||
|
||||
var frameworkManifest = new XElement("FileList", rootAttributes);
|
||||
|
||||
var usedFileProfiles = new HashSet<string>();
|
||||
|
||||
foreach (var f in Files
|
||||
.Select(item => new
|
||||
{
|
||||
Item = item,
|
||||
Filename = Path.GetFileName(item.ItemSpec),
|
||||
TargetPath = item.GetMetadata("TargetPath"),
|
||||
AssemblyName = FileUtilities.GetAssemblyName(item.ItemSpec),
|
||||
FileVersion = FileUtilities.GetFileVersion(item.ItemSpec),
|
||||
IsNative = item.GetMetadata("IsNativeImage") == "true",
|
||||
IsSymbolFile = item.GetMetadata("IsSymbolFile") == "true"
|
||||
})
|
||||
.Where(f =>
|
||||
!f.IsSymbolFile &&
|
||||
(f.Filename.EndsWith(".dll", StringComparison.OrdinalIgnoreCase) || f.IsNative))
|
||||
.OrderBy(f => f.TargetPath, StringComparer.Ordinal)
|
||||
.ThenBy(f => f.Filename, StringComparer.Ordinal))
|
||||
{
|
||||
var element = new XElement(
|
||||
"File",
|
||||
new XAttribute("Type", f.IsNative ? "Native" : "Managed"),
|
||||
new XAttribute(
|
||||
"Path",
|
||||
Path.Combine(f.TargetPath, f.Filename).Replace('\\', '/')));
|
||||
|
||||
if (f.AssemblyName != null)
|
||||
{
|
||||
byte[] publicKeyToken = f.AssemblyName.GetPublicKeyToken();
|
||||
string publicKeyTokenHex;
|
||||
|
||||
if (publicKeyToken != null)
|
||||
{
|
||||
publicKeyTokenHex = BitConverter.ToString(publicKeyToken)
|
||||
.ToLowerInvariant()
|
||||
.Replace("-", "");
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.LogError($"No public key token found for assembly {f.Item.ItemSpec}");
|
||||
publicKeyTokenHex = "";
|
||||
}
|
||||
|
||||
element.Add(
|
||||
new XAttribute("AssemblyName", f.AssemblyName.Name),
|
||||
new XAttribute("PublicKeyToken", publicKeyTokenHex),
|
||||
new XAttribute("AssemblyVersion", f.AssemblyName.Version));
|
||||
}
|
||||
else if (!f.IsNative)
|
||||
{
|
||||
// This file isn't managed and isn't native. Leave it off the list.
|
||||
continue;
|
||||
}
|
||||
|
||||
element.Add(new XAttribute("FileVersion", f.FileVersion));
|
||||
|
||||
frameworkManifest.Add(element);
|
||||
}
|
||||
|
||||
Directory.CreateDirectory(Path.GetDirectoryName(TargetFile));
|
||||
File.WriteAllText(TargetFile, frameworkManifest.ToString());
|
||||
|
||||
return !Log.HasLoggedErrors;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
// Copyright (c) .NET Foundation. All rights reserved.
|
||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
|
||||
namespace RepoTasks
|
||||
{
|
||||
internal static partial class FileUtilities
|
||||
{
|
||||
private static readonly HashSet<string> s_assemblyExtensions = new HashSet<string>(
|
||||
new[] { ".dll", ".exe", ".winmd" },
|
||||
StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public static Version GetFileVersion(string sourcePath)
|
||||
{
|
||||
var fvi = FileVersionInfo.GetVersionInfo(sourcePath);
|
||||
|
||||
if (fvi != null)
|
||||
{
|
||||
return new Version(fvi.FileMajorPart, fvi.FileMinorPart, fvi.FileBuildPart, fvi.FilePrivatePart);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static AssemblyName GetAssemblyName(string path)
|
||||
{
|
||||
if (!s_assemblyExtensions.Contains(Path.GetExtension(path)))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
return AssemblyName.GetAssemblyName(path);
|
||||
}
|
||||
catch (BadImageFormatException)
|
||||
{
|
||||
// Not a valid assembly.
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -10,7 +10,6 @@ using System.Reflection;
|
|||
using System.Text;
|
||||
using Microsoft.Build.Framework;
|
||||
using Microsoft.Build.Utilities;
|
||||
using Microsoft.DotNet.Build.Tasks;
|
||||
using Microsoft.Extensions.DependencyModel;
|
||||
|
||||
namespace RepoTasks
|
||||
|
|
@ -61,7 +60,7 @@ namespace RepoTasks
|
|||
var filePath = reference.ItemSpec;
|
||||
var fileName = Path.GetFileName(filePath);
|
||||
var fileVersion = FileUtilities.GetFileVersion(filePath)?.ToString() ?? string.Empty;
|
||||
var assemblyVersion = FileUtilities.TryGetAssemblyVersion(filePath);
|
||||
var assemblyVersion = FileUtilities.GetAssemblyName(filePath)?.Version;
|
||||
if (assemblyVersion == null)
|
||||
{
|
||||
var nativeFile = new RuntimeFile(fileName, null, fileVersion);
|
||||
|
|
@ -98,6 +98,7 @@ namespace RepoTasks
|
|||
stream.Position = 0;
|
||||
stream.SetLength(0);
|
||||
rawNuspec.Save(stream);
|
||||
Log.LogMessage(MessageImportance.High, "Added <frameworkReference> to {0}", fileName);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netcoreapp3.0</TargetFrameworks>
|
||||
<TargetFrameworks Condition="'$(OS)' == 'Windows_NT'">$(TargetFrameworks);net472</TargetFrameworks>
|
||||
<DefineConstants Condition="'$(TargetFramework)' == 'net472'">$(DefineConstants);BUILD_MSI_TASKS</DefineConstants>
|
||||
<Optimize>false</Optimize>
|
||||
<DebugType>embedded</DebugType>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="NuGet.Build.Tasks" Version="5.1.0-rtm.5921" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyModel" Version="2.1.0" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
|
||||
<PackageReference Include="Microsoft.Build.Framework" Version="15.8.166" />
|
||||
<PackageReference Include="Microsoft.Build.Tasks.Core" Version="15.8.166" />
|
||||
<PackageReference Include="Microsoft.Build.Utilities.Core" Version="15.8.166" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup Condition="'$(TargetFramework)' == 'net472'">
|
||||
<PackageReference Include="Wix" Version="3.11.1" />
|
||||
|
||||
<Reference Include="Microsoft.Build" />
|
||||
<Reference Include="Microsoft.Build.Framework" />
|
||||
<Reference Include="Microsoft.Build.Tasks.v4.0" />
|
||||
<Reference Include="Microsoft.Build.Utilities.v4.0" />
|
||||
<Reference Include="Microsoft.Deployment.WindowsInstaller">
|
||||
<HintPath>$(WiXSdkPath)\Microsoft.Deployment.WindowsInstaller.dll</HintPath>
|
||||
</Reference>
|
||||
<Reference Include="Microsoft.Deployment.WindowsInstaller.Package">
|
||||
<HintPath>$(WiXSdkPath)\Microsoft.Deployment.WindowsInstaller.Package.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<Project>
|
||||
<PropertyGroup>
|
||||
<_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' == 'core'">netcoreapp3.0</_RepoTaskAssemblyFolder>
|
||||
<_RepoTaskAssemblyFolder Condition="'$(MSBuildRuntimeType)' != 'core'">net472</_RepoTaskAssemblyFolder>
|
||||
<_RepoTaskAssembly>$(ArtifactsBinDir)RepoTasks\Release\$(_RepoTaskAssemblyFolder)\RepoTasks.dll</_RepoTaskAssembly>
|
||||
</PropertyGroup>
|
||||
|
||||
<UsingTask TaskName="RepoTasks.GenerateGuid" AssemblyFile="$(_RepoTaskAssembly)" Condition="'$(MSBuildRuntimeType)' != 'core'" />
|
||||
<UsingTask TaskName="RepoTasks.GetMsiProperty" AssemblyFile="$(_RepoTaskAssembly)" Condition="'$(MSBuildRuntimeType)' != 'core'" />
|
||||
<UsingTask TaskName="RepoTasks.GenerateSharedFrameworkDepsFile" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
<UsingTask TaskName="RepoTasks.CreateFrameworkListFile" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
<UsingTask TaskName="RepoTasks.RemoveSharedFrameworkDependencies" AssemblyFile="$(_RepoTaskAssembly)" />
|
||||
</Project>
|
||||
|
|
@ -5,6 +5,8 @@ VisualStudioVersion = 16.0.0.0
|
|||
MinimumVisualStudioVersion = 16.0.0.0
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BaselineGenerator", "BaselineGenerator\BaselineGenerator.csproj", "{CF76A947-3A72-4824-87E6-BF029D84218B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RepoTasks", "RepoTasks\RepoTasks.csproj", "{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
|
|
@ -30,5 +32,17 @@ Global
|
|||
{CF76A947-3A72-4824-87E6-BF029D84218B}.Release|x64.Build.0 = Release|Any CPU
|
||||
{CF76A947-3A72-4824-87E6-BF029D84218B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{CF76A947-3A72-4824-87E6-BF029D84218B}.Release|x86.Build.0 = Release|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Release|x64.Build.0 = Release|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{E418DA57-B2AA-43FC-9AD5-0E4D1AA993DE}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
|
|
|
|||
22
global.json
22
global.json
|
|
@ -4,11 +4,27 @@
|
|||
},
|
||||
"tools": {
|
||||
"dotnet": "3.0.100-preview5-011568",
|
||||
"jdk": "11.0.3"
|
||||
"runtimes": {
|
||||
"dotnet/x64": [
|
||||
"$(MicrosoftNETCoreAppRuntimeVersion)"
|
||||
],
|
||||
"dotnet/x86": [
|
||||
"$(MicrosoftNETCoreAppRuntimeVersion)"
|
||||
]
|
||||
},
|
||||
"jdk": "11.0.3",
|
||||
"vs": {
|
||||
"version": "16.0",
|
||||
"components": [
|
||||
"Microsoft.VisualStudio.Component.VC.ATL",
|
||||
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
|
||||
"Microsoft.VisualStudio.Component.Windows10SDK.17134"
|
||||
]
|
||||
}
|
||||
},
|
||||
"msbuild-sdks": {
|
||||
"Yarn.MSBuild": "1.15.2",
|
||||
"Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19302.2",
|
||||
"Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19302.2"
|
||||
"Microsoft.DotNet.Arcade.Sdk": "1.0.0-beta.19323.4",
|
||||
"Microsoft.DotNet.Helix.Sdk": "2.0.0-beta.19323.4"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
version:3.0.0-build-20190606.1
|
||||
commithash:2229c5dff7ca6384e7c17148a6da1aaee161f44d
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
"$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json",
|
||||
"channel": "master",
|
||||
"msbuildType": "full",
|
||||
"toolsets": {
|
||||
"nodejs": {
|
||||
"minVersion": "10.0",
|
||||
"required": true
|
||||
},
|
||||
"visualstudio": {
|
||||
"required": [
|
||||
"Windows"
|
||||
],
|
||||
"includePrerelease": true,
|
||||
"versionRange": "[16.0, 17.0)",
|
||||
"requiredWorkloads": [
|
||||
"Microsoft.VisualStudio.Component.VC.ATL",
|
||||
"Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
|
||||
"Microsoft.VisualStudio.Component.Windows10SDK.17134"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -17,7 +17,7 @@
|
|||
<ContentTargetFolders>contentFiles</ContentTargetFolders>
|
||||
<DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
|
||||
<DefaultExcludeItems>$(DefaultExcludeItems);$(BaseOutputPath);$(BaseIntermediateOutputPath);</DefaultExcludeItems>
|
||||
<NoWarn>$(NoWarn);NU5105;CS8021</NoWarn>
|
||||
<NoWarn>$(NoWarn);CS8021</NoWarn>
|
||||
<IsProjectReferenceProvider>false</IsProjectReferenceProvider>
|
||||
</PropertyGroup>
|
||||
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue