From c20433a4a95551aab793dce4ca1ae193ec645d9e Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Thu, 13 Aug 2020 14:52:00 -0700 Subject: [PATCH] Update infrastructure to consume private builds from .NET (#13427) --- build.psm1 | 69 ++++++++++++++++++++++++++--------- tools/UpdateDotnetRuntime.ps1 | 52 ++++++++++++++++++++++---- 2 files changed, 96 insertions(+), 25 deletions(-) diff --git a/build.psm1 b/build.psm1 index 59b6d82d79..dda6cc723d 100644 --- a/build.psm1 +++ b/build.psm1 @@ -303,7 +303,8 @@ function Start-PSBuild { [ValidatePattern("^v\d+\.\d+\.\d+(-\w+(\.\d+)?)?$")] [ValidateNotNullOrEmpty()] [string]$ReleaseTag, - [switch]$Detailed + [switch]$Detailed, + [switch]$InteractiveAuth ) if ($PSCmdlet.ParameterSetName -eq "Default" -and !$NoPSModuleRestore) @@ -426,7 +427,7 @@ Fix steps: } # handle Restore - Restore-PSPackage -Options $Options -Force:$Restore + Restore-PSPackage -Options $Options -Force:$Restore -InteractiveAuth:$InteractiveAuth # handle ResGen # Heuristic to run ResGen on the fresh machine @@ -618,7 +619,9 @@ function Restore-PSPackage [Parameter()] $Options = (Get-PSOptions -DefaultToNew), - [switch] $Force + [switch] $Force, + + [switch] $InteractiveAuth ) if (-not $ProjectDirs) @@ -654,6 +657,10 @@ function Restore-PSPackage $RestoreArguments += "quiet" } + if ($InteractiveAuth) { + $RestoreArguments += "--interactive" + } + $ProjectDirs | ForEach-Object { $project = $_ Write-Log -message "Run dotnet restore $project $RestoreArguments" @@ -1639,7 +1646,9 @@ function Install-Dotnet { [string]$Channel = $dotnetCLIChannel, [string]$Version = $dotnetCLIRequiredVersion, [switch]$NoSudo, - [string]$InstallDir + [string]$InstallDir, + [string]$AzureFeed, + [string]$FeedCredential ) # This allows sudo install to be optional; needed when running in containers / as root @@ -1674,33 +1683,57 @@ function Install-Dotnet { Start-NativeExecution { & $curl -sO $installObtainUrl/$installScript - if (-not $InstallDir) { - bash ./$installScript -c $Channel -v $Version - } else { - bash ./$installScript -c $Channel -v $Version -i $InstallDir + $bashArgs = @("./$installScript", '-c', $Channel, '-v', $Version) + + if ($InstallDir) { + $bashArgs += @('-i', $InstallDir) } + + if ($AzureFeed) { + $bashArgs += @('-AzureFeed', $AzureFeed, '-FeedCredential', $FeedCredential) + } + + bash @bashArgs } } elseif ($environment.IsWindows) { Remove-Item -ErrorAction SilentlyContinue -Recurse -Force ~\AppData\Local\Microsoft\dotnet $installScript = "dotnet-install.ps1" Invoke-WebRequest -Uri $installObtainUrl/$installScript -OutFile $installScript - if (-not $environment.IsCoreCLR) { - if (-not $InstallDir) { - & ./$installScript -Channel $Channel -Version $Version - } else { - & ./$installScript -Channel $Channel -Version $Version -InstallDir $InstallDir + $installArgs = @{ + Channel = $Channel + Version = $Version } - } else { + + if ($InstallDir) { + $installArgs += @{ InstallDir = $InstallDir } + } + + if ($AzureFeed) { + $installArgs += @{ + AzureFeed = $AzureFeed + $FeedCredential = $FeedCredential + } + } + + & ./$installScript @installArgs + } + else { # dotnet-install.ps1 uses APIs that are not supported in .NET Core, so we run it with Windows PowerShell $fullPSPath = Join-Path -Path $env:windir -ChildPath "System32\WindowsPowerShell\v1.0\powershell.exe" $fullDotnetInstallPath = Join-Path -Path $PWD.Path -ChildPath $installScript Start-NativeExecution { - if (-not $InstallDir) { - & $fullPSPath -NoLogo -NoProfile -File $fullDotnetInstallPath -Channel $Channel -Version $Version - } else { - & $fullPSPath -NoLogo -NoProfile -File $fullDotnetInstallPath -Channel $Channel -Version $Version -InstallDir $InstallDir + $psArgs = @('-NoLogo', '-NoProfile', '-File', $fullDotnetInstallPath, '-Channel', $Channel, '-Version', $Version) + + if ($InstallDir) { + $psArgs += @('-InstallDir', $InstallDir) } + + if ($AzureFeed) { + $psArgs += @('-AzureFeed', $AzureFeed, '-FeedCredential', $FeedCredential) + } + + & $fullPSPath @psArgs } } } diff --git a/tools/UpdateDotnetRuntime.ps1 b/tools/UpdateDotnetRuntime.ps1 index 1e437a17ad..2e99b0eb85 100644 --- a/tools/UpdateDotnetRuntime.ps1 +++ b/tools/UpdateDotnetRuntime.ps1 @@ -7,7 +7,16 @@ param ( [string]$SDKVersionOverride, [Parameter()] - [switch]$UpdateMSIPackaging + [switch]$UpdateMSIPackaging, + + [Parameter()] + [string]$RuntimeSourceFeed, + + [Parameter()] + [string]$RuntimeSourceFeedKey, + + [Parameter()] + [switch]$InteractiveAuth ) <# @@ -130,6 +139,14 @@ function Update-CsprojFile([string] $path, $values) { } function Get-DotnetUpdate { + if ($SDKVersionOverride) { + return @{ + ShouldUpdate = $true + NewVersion = $SDKVersionOverride + Message = $null + } + } + try { $dotnetMetadataPath = "$PSScriptRoot/../DotnetRuntimeMetadata.json" $nextChannel = (Get-Content $dotnetMetadataPath -Raw | ConvertFrom-Json).sdk.nextChannel @@ -180,17 +197,38 @@ if ($dotnetUpdate.ShouldUpdate) { Find-Dotnet - if (-not (Get-PackageSource -Name 'dotnet5' -ErrorAction SilentlyContinue)) { - $nugetFeed = ([xml](Get-Content .\nuget.config -Raw)).Configuration.packagesources.add | Where-Object { $_.Key -eq 'dotnet5' } | Select-Object -ExpandProperty Value - Register-PackageSource -Name 'dotnet5' -Location $nugetFeed -ProviderName NuGet - Write-Verbose -Message "Register new package source 'dotnet5'" -verbose + $addDotnet5Source = (-not (Get-PackageSource -Name 'dotnet5' -ErrorAction SilentlyContinue)) + $addDotnet5InternalSource = (-not (Get-PackageSource -Name 'dotnet5-internal' -ErrorAction SilentlyContinue)) + + if ($addDotnet5Source -or $addDotnet5InternalSource) { + $nugetFileSources = ([xml](Get-Content .\nuget.config -Raw)).Configuration.packagesources.add + + if ($addDotnet5Source) { + $dotnet5Feed = $nugetFileSources | Where-Object { $_.Key -eq 'dotnet5' } | Select-Object -ExpandProperty Value + Register-PackageSource -Name 'dotnet5' -Location $dotnet5Feed -ProviderName NuGet + Write-Verbose -Message "Register new package source 'dotnet5'" -verbose + } + + if ($addDotnet5InternalSource -and $InteractiveAuth) { + # This NuGet feed is for internal to Microsoft use only. + $dotnet5InternalFeed = 'https://pkgs.dev.azure.com/dnceng/internal/_packaging/dotnet5-internal/nuget/v3/index.json' + $updatedNugetFile = (Get-Content .\nuget.config -Raw) -replace "", " `r`n " + $updatedNugetFile | Out-File .\nuget.config -Force + Register-PackageSource -Name 'dotnet5-internal' -Location $dotnet5InternalFeed -ProviderName NuGet + Write-Verbose -Message "Register new package source 'dotnet5-internal'" -verbose + } } ## Install latest version from the channel $sdkVersion = if ($SDKVersionOverride) { $SDKVersionOverride } else { $dotnetUpdate.NewVersion } - Install-Dotnet -Channel "$Channel" -Version $sdkVersion + if (-not $RuntimeSourceFeed) { + Install-Dotnet -Channel "$Channel" -Version $sdkVersion + } + else { + Install-Dotnet -Channel "$Channel" -Version $sdkVersion -AzureFeed $RuntimeSourceFeed -FeedCredential $RuntimeSourceFeedKey + } Write-Verbose -Message "Installing .NET SDK completed." -Verbose @@ -224,7 +262,7 @@ if ($dotnetUpdate.ShouldUpdate) { Import-Module "$PSScriptRoot/../build.psm1" -Force Import-Module "$PSScriptRoot/packaging" -Force Start-PSBootstrap -Package - Start-PSBuild -Clean -Configuration Release -CrossGen + Start-PSBuild -Clean -Configuration Release -CrossGen -InteractiveAuth:$InteractiveAuth try { Start-PSPackage -Type msi -SkipReleaseChecks -InformationVariable wxsData