1+ # This file is a temporary workaround for internal builds to be able to restore from private AzDO feeds.
2+ # This file should be removed as part of this issue: https://github.com/dotnet/arcade/issues/4080
3+ #
4+ # What the script does is iterate over all package sources in the pointed NuGet.config and add a credential entry
5+ # under <packageSourceCredentials> for each Maestro managed private feed. Two additional credential
6+ # entries are also added for the two private static internal feeds: dotnet3-internal and dotnet3-internal-transport.
7+ #
8+ # This script needs to be called in every job that will restore packages and which the base repo has
9+ # private AzDO feeds in the NuGet.config.
10+ #
11+ # See example YAML call for this script below. Note the use of the variable `$(dn-bot-dnceng-artifact-feeds-rw)`
12+ # from the AzureDevOps-Artifact-Feeds-Pats variable group.
13+ #
14+ # Any disabledPackageSources entries which start with "darc-int" will be re-enabled as part of this script executing
15+ #
16+ # - task: PowerShell@2
17+ # displayName: Setup Private Feeds Credentials
18+ # condition: eq(variables['Agent.OS'], 'Windows_NT')
19+ # inputs:
20+ # filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
21+ # arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
22+ # env:
23+ # Token: $(dn-bot-dnceng-artifact-feeds-rw)
24+
25+ [CmdletBinding ()]
26+ param (
27+ [Parameter (Mandatory = $true )][string ]$ConfigFile ,
28+ [Parameter (Mandatory = $true )][string ]$Password
29+ )
30+
31+ $ErrorActionPreference = " Stop"
32+ Set-StrictMode - Version 2.0
33+ [Net.ServicePointManager ]::SecurityProtocol = [Net.SecurityProtocolType ]::Tls12
34+
35+ . $PSScriptRoot \tools.ps1
36+
37+ # Add source entry to PackageSources
38+ function AddPackageSource ($sources , $SourceName , $SourceEndPoint , $creds , $Username , $pwd ) {
39+ $packageSource = $sources.SelectSingleNode (" add[@key='$SourceName ']" )
40+
41+ if ($packageSource -eq $null )
42+ {
43+ $packageSource = $doc.CreateElement (" add" )
44+ $packageSource.SetAttribute (" key" , $SourceName )
45+ $packageSource.SetAttribute (" value" , $SourceEndPoint )
46+ $sources.AppendChild ($packageSource ) | Out-Null
47+ }
48+ else {
49+ Write-Host " Package source $SourceName already present."
50+ }
51+ AddCredential - Creds $creds - Source $SourceName - Username $Username - pwd $pwd
52+ }
53+
54+ # Add a credential node for the specified source
55+ function AddCredential ($creds , $source , $username , $pwd ) {
56+ # Looks for credential configuration for the given SourceName. Create it if none is found.
57+ $sourceElement = $creds.SelectSingleNode ($Source )
58+ if ($sourceElement -eq $null )
59+ {
60+ $sourceElement = $doc.CreateElement ($Source )
61+ $creds.AppendChild ($sourceElement ) | Out-Null
62+ }
63+
64+ # Add the <Username> node to the credential if none is found.
65+ $usernameElement = $sourceElement.SelectSingleNode (" add[@key='Username']" )
66+ if ($usernameElement -eq $null )
67+ {
68+ $usernameElement = $doc.CreateElement (" add" )
69+ $usernameElement.SetAttribute (" key" , " Username" )
70+ $sourceElement.AppendChild ($usernameElement ) | Out-Null
71+ }
72+ $usernameElement.SetAttribute (" value" , $Username )
73+
74+ # Add the <ClearTextPassword> to the credential if none is found.
75+ # Add it as a clear text because there is no support for encrypted ones in non-windows .Net SDKs.
76+ # -> https://github.com/NuGet/Home/issues/5526
77+ $passwordElement = $sourceElement.SelectSingleNode (" add[@key='ClearTextPassword']" )
78+ if ($passwordElement -eq $null )
79+ {
80+ $passwordElement = $doc.CreateElement (" add" )
81+ $passwordElement.SetAttribute (" key" , " ClearTextPassword" )
82+ $sourceElement.AppendChild ($passwordElement ) | Out-Null
83+ }
84+
85+ $passwordElement.SetAttribute (" value" , $pwd )
86+ }
87+
88+ function InsertMaestroPrivateFeedCredentials ($Sources , $Creds , $Username , $pwd ) {
89+ $maestroPrivateSources = $Sources.SelectNodes (" add[contains(@key,'darc-int')]" )
90+
91+ Write-Host " Inserting credentials for $ ( $maestroPrivateSources.Count ) Maestro's private feeds."
92+
93+ ForEach ($PackageSource in $maestroPrivateSources ) {
94+ Write-Host " `t Inserting credential for Maestro's feed:" $PackageSource.Key
95+ AddCredential - Creds $creds - Source $PackageSource.Key - Username $Username - pwd $pwd
96+ }
97+ }
98+
99+ function EnablePrivatePackageSources ($DisabledPackageSources ) {
100+ $maestroPrivateSources = $DisabledPackageSources.SelectNodes (" add[contains(@key,'darc-int')]" )
101+ ForEach ($DisabledPackageSource in $maestroPrivateSources ) {
102+ Write-Host " `t Ensuring private source '$ ( $DisabledPackageSource.key ) ' is enabled by deleting it from disabledPackageSource"
103+ # Due to https://github.com/NuGet/Home/issues/10291, we must actually remove the disabled entries
104+ $DisabledPackageSources.RemoveChild ($DisabledPackageSource )
105+ }
106+ }
107+
108+ if (! (Test-Path $ConfigFile - PathType Leaf)) {
109+ Write-PipelineTelemetryError - Category ' Build' - Message " Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Couldn't find the NuGet config file: $ConfigFile "
110+ ExitWithExitCode 1
111+ }
112+
113+ if (! $Password ) {
114+ Write-PipelineTelemetryError - Category ' Build' - Message ' Eng/common/SetupNugetSources.ps1 returned a non-zero exit code. Please supply a valid PAT'
115+ ExitWithExitCode 1
116+ }
117+
118+ # Load NuGet.config
119+ $doc = New-Object System.Xml.XmlDocument
120+ $filename = (Get-Item $ConfigFile ).FullName
121+ $doc.Load ($filename )
122+
123+ # Get reference to <PackageSources> or create one if none exist already
124+ $sources = $doc.DocumentElement.SelectSingleNode (" packageSources" )
125+ if ($sources -eq $null ) {
126+ $sources = $doc.CreateElement (" packageSources" )
127+ $doc.DocumentElement.AppendChild ($sources ) | Out-Null
128+ }
129+
130+ # Looks for a <PackageSourceCredentials> node. Create it if none is found.
131+ $creds = $doc.DocumentElement.SelectSingleNode (" packageSourceCredentials" )
132+ if ($creds -eq $null ) {
133+ $creds = $doc.CreateElement (" packageSourceCredentials" )
134+ $doc.DocumentElement.AppendChild ($creds ) | Out-Null
135+ }
136+
137+ # Check for disabledPackageSources; we'll enable any darc-int ones we find there
138+ $disabledSources = $doc.DocumentElement.SelectSingleNode (" disabledPackageSources" )
139+ if ($disabledSources -ne $null ) {
140+ Write-Host " Checking for any darc-int disabled package sources in the disabledPackageSources node"
141+ EnablePrivatePackageSources - DisabledPackageSources $disabledSources
142+ }
143+
144+ $userName = " dn-bot"
145+
146+ # Insert credential nodes for Maestro's private feeds
147+ InsertMaestroPrivateFeedCredentials - Sources $sources - Creds $creds - Username $userName - pwd $Password
148+
149+ # 3.1 uses a different feed url format so it's handled differently here
150+ $dotnet31Source = $sources.SelectSingleNode (" add[@key='dotnet3.1']" )
151+ if ($dotnet31Source -ne $null ) {
152+ AddPackageSource - Sources $sources - SourceName " dotnet3.1-internal" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v2" - Creds $creds - Username $userName - pwd $Password
153+ AddPackageSource - Sources $sources - SourceName " dotnet3.1-internal-transport" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v2" - Creds $creds - Username $userName - pwd $Password
154+ }
155+
156+ $dotnetVersions = @ (' 5' , ' 6' , ' 7' , ' 8' )
157+
158+ foreach ($dotnetVersion in $dotnetVersions ) {
159+ $feedPrefix = " dotnet" + $dotnetVersion ;
160+ $dotnetSource = $sources.SelectSingleNode (" add[@key='$feedPrefix ']" )
161+ if ($dotnetSource -ne $null ) {
162+ AddPackageSource - Sources $sources - SourceName " $feedPrefix -internal" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix -internal/nuget/v2" - Creds $creds - Username $userName - pwd $Password
163+ AddPackageSource - Sources $sources - SourceName " $feedPrefix -internal-transport" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix -internal-transport/nuget/v2" - Creds $creds - Username $userName - pwd $Password
164+ }
165+ }
166+
167+ $doc.Save ($filename )
0 commit comments