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