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
1
+ # This script adds internal feeds required to build commits that depend on internal package sources. For instance,
2
+ # dotnet6-internal would be added automatically if dotnet6 was found in the nuget.config file. In addition also enables
3
+ # disabled internal Maestro (darc-int*) feeds.
4
+ #
5
+ # Optionally, this script also adds a credential entry for each of the internal feeds if supplied. This credential
6
+ # is added via the standard environment variable VSS_NUGET_EXTERNAL_FEED_ENDPOINTS. See
7
+ # https://github.com/microsoft/artifacts-credprovider/tree/v1.1.1?tab=readme-ov-file#environment-variables for more details
3
8
#
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
9
+ # See example call for this script below.
15
10
#
16
11
# - task: PowerShell@2
17
- # displayName: Setup Private Feeds Credentials
12
+ # displayName: Setup Internal Feeds
18
13
# condition: eq(variables['Agent.OS'], 'Windows_NT')
19
14
# inputs:
20
15
# 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)
16
+ # arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config
17
+ # - task: NuGetAuthenticate@1
18
+ #
19
+ # Note that the NuGetAuthenticate task should be called after SetupNugetSources.
20
+ # This ensures that:
21
+ # - Appropriate creds are set for the added internal feeds (if not supplied to the scrupt)
22
+ # - The credential provider is installed
23
+ #
24
+ # This logic is also abstracted into enable-internal-sources.yml.
24
25
25
26
[CmdletBinding ()]
26
27
param (
27
28
[Parameter (Mandatory = $true )][string ]$ConfigFile ,
28
- [Parameter ( Mandatory = $true )][ string ]$Password
29
+ [string ]$Password
29
30
)
30
31
31
32
$ErrorActionPreference = " Stop"
@@ -34,12 +35,23 @@ Set-StrictMode -Version 2.0
34
35
35
36
. $PSScriptRoot \tools.ps1
36
37
38
+ $feedEndpoints = $null
39
+
40
+ # If a credential is provided, ensure that we don't overwrite the current set of
41
+ # credentials that may have been provided by a previous call to the credential provider.
42
+ if ($Password -and $null -ne $env: VSS_NUGET_EXTERNAL_FEED_ENDPOINTS ) {
43
+ $feedEndpoints = $env: VSS_NUGET_EXTERNAL_FEED_ENDPOINTS | ConvertFrom-Json
44
+ } elseif ($Password ) {
45
+ $feedEndpoints = @ { endpointCredentials = @ () }
46
+ }
47
+
37
48
# Add source entry to PackageSources
38
- function AddPackageSource ($sources , $SourceName , $SourceEndPoint , $creds , $Username , $ pwd ) {
49
+ function AddPackageSource ($sources , $SourceName , $SourceEndPoint , $pwd ) {
39
50
$packageSource = $sources.SelectSingleNode (" add[@key='$SourceName ']" )
40
51
41
- if ($packageSource -eq $null )
52
+ if ($null -eq $packageSource )
42
53
{
54
+ Write-Host " `t Adding package source" $SourceName
43
55
$packageSource = $doc.CreateElement (" add" )
44
56
$packageSource.SetAttribute (" key" , $SourceName )
45
57
$packageSource.SetAttribute (" value" , $SourceEndPoint )
@@ -48,58 +60,34 @@ function AddPackageSource($sources, $SourceName, $SourceEndPoint, $creds, $Usern
48
60
else {
49
61
Write-Host " Package source $SourceName already present."
50
62
}
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
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
64
+ if ($pwd ) {
65
+ $feedEndpoints.endpointCredentials = AddCredential - endpointCredentials $feedEndpoints.endpointCredentials - source $SourceEndPoint - pwd $pwd
71
66
}
72
- $usernameElement .SetAttribute ( " value " , $Username )
67
+ }
73
68
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
69
+ # Add a new feed endpoint credential
70
+ function AddCredential ([array ]$endpointCredentials , $source , $pwd ) {
71
+ $endpointCredentials += @ {
72
+ endpoint = $source ;
73
+ password = $pwd
83
74
}
84
-
85
- $passwordElement.SetAttribute (" value" , $pwd )
75
+ return $endpointCredentials
86
76
}
87
77
88
- function InsertMaestroPrivateFeedCredentials ($Sources , $Creds , $Username , $pwd ) {
89
- $maestroPrivateSources = $Sources.SelectNodes (" add[contains(@key,'darc-int')]" )
78
+ function InsertMaestroInternalFeedCredentials ($Sources , $pwd ) {
79
+ $maestroInternalSources = $Sources.SelectNodes (" add[contains(@key,'darc-int')]" )
90
80
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
81
+ ForEach ($PackageSource in $maestroInternalSources ) {
82
+ Write-Host " `t Adding credential for Maestro's feed:" $PackageSource.Key
83
+ $feedEndpoints.endpointCredentials = AddCredential - endpointCredentials $feedEndpoints.endpointCredentials - source $PackageSource.value - pwd $pwd
96
84
}
97
85
}
98
86
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"
87
+ function EnableInternalPackageSources ($DisabledPackageSources ) {
88
+ $maestroInternalSources = $DisabledPackageSources.SelectNodes (" add[contains(@key,'darc-int')]" )
89
+ ForEach ($DisabledPackageSource in $maestroInternalSources ) {
90
+ Write-Host " `t Ensuring internal source '$ ( $DisabledPackageSource.key ) ' is enabled by deleting it from disabledPackageSource"
103
91
# Due to https://github.com/NuGet/Home/issues/10291, we must actually remove the disabled entries
104
92
$DisabledPackageSources.RemoveChild ($DisabledPackageSource )
105
93
}
@@ -110,58 +98,53 @@ if (!(Test-Path $ConfigFile -PathType Leaf)) {
110
98
ExitWithExitCode 1
111
99
}
112
100
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
101
# Load NuGet.config
119
102
$doc = New-Object System.Xml.XmlDocument
120
103
$filename = (Get-Item $ConfigFile ).FullName
121
104
$doc.Load ($filename )
122
105
123
106
# Get reference to <PackageSources> or create one if none exist already
124
107
$sources = $doc.DocumentElement.SelectSingleNode (" packageSources" )
125
- if ($sources -eq $null ) {
108
+ if ($null -eq $sources ) {
126
109
$sources = $doc.CreateElement (" packageSources" )
127
110
$doc.DocumentElement.AppendChild ($sources ) | Out-Null
128
111
}
129
112
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
113
# Check for disabledPackageSources; we'll enable any darc-int ones we find there
138
114
$disabledSources = $doc.DocumentElement.SelectSingleNode (" disabledPackageSources" )
139
- if ($disabledSources -ne $null ) {
115
+ if ($null -ne $disabledSources ) {
140
116
Write-Host " Checking for any darc-int disabled package sources in the disabledPackageSources node"
141
- EnablePrivatePackageSources - DisabledPackageSources $disabledSources
117
+ EnableInternalPackageSources - DisabledPackageSources $disabledSources
142
118
}
143
119
144
- $userName = " dn-bot"
145
-
146
- # Insert credential nodes for Maestro's private feeds
147
- InsertMaestroPrivateFeedCredentials - Sources $sources - Creds $creds - Username $userName - pwd $Password
120
+ if ($Password ) {
121
+ InsertMaestroInternalFeedCredentials - Sources $sources - pwd $Password
122
+ }
148
123
149
124
# 3.1 uses a different feed url format so it's handled differently here
150
125
$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
126
+ if ($null -ne $dotnet31Source ) {
127
+ AddPackageSource - Sources $sources - SourceName " dotnet3.1-internal" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal/nuget/v3/index.json " - pwd $Password
128
+ AddPackageSource - Sources $sources - SourceName " dotnet3.1-internal-transport" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/_packaging/dotnet3.1-internal-transport/nuget/v3/index.json " - pwd $Password
154
129
}
155
130
156
131
$dotnetVersions = @ (' 5' , ' 6' , ' 7' , ' 8' )
157
132
158
133
foreach ($dotnetVersion in $dotnetVersions ) {
159
134
$feedPrefix = " dotnet" + $dotnetVersion ;
160
135
$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
136
+ if ($dotnetSource ) {
137
+ AddPackageSource - Sources $sources - SourceName " $feedPrefix -internal" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedprefix -internal/nuget/v3/index.json " - pwd $Password
138
+ AddPackageSource - Sources $sources - SourceName " $feedPrefix -internal-transport" - SourceEndPoint " https://pkgs.dev.azure.com/dnceng/internal/_packaging/$feedPrefix -internal-transport/nuget/v3/index.json " - pwd $Password
164
139
}
165
140
}
166
141
167
- $doc.Save ($filename )
142
+ $doc.Save ($filename )
143
+
144
+ # If any credentials were added or altered, update the VSS_NUGET_EXTERNAL_FEED_ENDPOINTS environment variable
145
+ if ($null -ne $feedEndpoints ) {
146
+ # ci is set to true so vso logging commands will be used.
147
+ $ci = $true
148
+ Write-PipelineSetVariable - Name ' VSS_NUGET_EXTERNAL_FEED_ENDPOINTS' - Value $ ($feedEndpoints | ConvertTo-Json ) - IsMultiJobVariable $false
149
+ Write-PipelineSetVariable - Name ' NUGET_CREDENTIALPROVIDER_SESSIONTOKENCACHE_ENABLED' - Value " False" - IsMultiJobVariable $false
150
+ }
0 commit comments