如何使用 Cake 从私有 VSTS 提要恢复私有 NuGet 包
How do you restore private NuGet packages from private VSTS feeds with Cake
我有一项任务是为我们的 dotnet 核心应用程序恢复我们的 NuGet 包:
Task("Restore-Packages")
.Does(() =>
{
DotNetCoreRestore(sln, new DotNetCoreRestoreSettings {
Sources = new[] {"https://my-team.pkgs.visualstudio.com/_packaging/my-feed/nuget/v3/index.json"},
Verbosity = DotNetCoreVerbosity.Detailed
});
});
然而,当 运行 在 VSTS 上出现以下错误时:
2018-06-14T15:10:53.3857512Z C:\Program Files\dotnet\sdk.1.300\NuGet.targets(114,5): error : Unable to load the service index for source https://my-team.pkgs.visualstudio.com/_packaging/my-feed/nuget/v3/index.json. [D:\a\s\BitCoinMiner.sln]
2018-06-14T15:10:53.3857956Z C:\Program Files\dotnet\sdk.1.300\NuGet.targets(114,5): error : Response status code does not indicate success: 401 (Unauthorized). [D:\a\s\BitCoinMiner.sln]
如何授权构建代理访问我们的私有 VSTS?
我确实遇到了同样的问题,显然 VSTS 中的构建代理无法在没有访问令牌的情况下访问您的私人 VSTS 提要,因此您将不得不在 VSTS 中创建个人访问令牌并将其提供给内置的 Cake 方法,用于添加经过身份验证的 VSTS Nuget 提要作为来源之一。在这里,我将它包装在我自己方便的 Cake 方法中,该方法检查包提要是否已经存在,如果不存在,则添加它:
void SetUpNuget()
{
var feed = new
{
Name = "<feedname>",
Source = "https://<your-vsts-account>.pkgs.visualstudio.com/_packaging/<yournugetfeed>/nuget/v3/index.json"
};
if (!NuGetHasSource(source:feed.Source))
{
var nugetSourceSettings = new NuGetSourcesSettings
{
UserName = "<any-odd-string>",
Password = EnvironmentVariable("NUGET_PAT"),
Verbosity = NuGetVerbosity.Detailed
};
NuGetAddSource(
name:feed.Name,
source:feed.Source,
settings:nugetSourceSettings);
}
}
然后我从 "Restore" 任务调用它:
Task("Restore")
.Does(() => {
SetUpNuget();
DotNetCoreRestore("./<solution-name>.sln");
});
就我个人而言,我更喜欢让 PAT 远离源代码管理,所以我在这里阅读环境变量。在 VSTS 中,您可以在 CI 构建配置的“变量”选项卡下创建一个环境变量。
希望对您有所帮助!这是 Cake 文档的 link。
正如@KevinSmith 和@NickTurner 所指出的,访问 VSTS 提要的更好方法是使用 pre-defined 系统变量 System.AccessToken
而不是使用有限的有效性,手动创建和繁琐的 PAT。此变量在构建代理上可用,供当前构建使用。更多信息 here.
在 Cake 脚本中使用此标记的一种方法如下:
首先,在azure-pipelines.yml
中将系统变量暴露为Cake任务的环境变量
steps:
- task: cake-build.cake.cake-build-task.Cake@0
displayName: 'Cake '
inputs:
target: Pack
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
然后在 Cake 中,您可以像访问任何环境变量一样访问它,所以在我的例子中:
if (!NuGetHasSource(source:feed.Source))
{
Information($"Nuget feed {feed.Source} not found, adding...");
var nugetSourceSettings = new NuGetSourcesSettings
{
UserName = "whoosywhatsit",
Password = EnvironmentVariable("SYSTEM_ACCESSTOKEN"),
Verbosity = NuGetVerbosity.Detailed
};
NuGetAddSource(
name:feed.Name,
source:feed.Source,
settings:nugetSourceSettings);
}
这似乎行得通!如果有更好的方法在 Cake 中访问此变量,请告诉我。 另请注意在我的例子中,我只是用它来从我的 VSTS 提要中恢复包,而不是推送到它。我通过 YML 中的 DotNetCoreCLI@2
任务完成,如下所示:
- task: DotNetCoreCLI@2
displayName: 'dotnet nuget push'
inputs:
command: push
packagesToPush: 'artifacts/package.nupkg'
publishVstsFeed: '<id of my VSTS feed>'
剩下的由 Azure 管道处理。
我有一项任务是为我们的 dotnet 核心应用程序恢复我们的 NuGet 包:
Task("Restore-Packages")
.Does(() =>
{
DotNetCoreRestore(sln, new DotNetCoreRestoreSettings {
Sources = new[] {"https://my-team.pkgs.visualstudio.com/_packaging/my-feed/nuget/v3/index.json"},
Verbosity = DotNetCoreVerbosity.Detailed
});
});
然而,当 运行 在 VSTS 上出现以下错误时:
2018-06-14T15:10:53.3857512Z C:\Program Files\dotnet\sdk.1.300\NuGet.targets(114,5): error : Unable to load the service index for source https://my-team.pkgs.visualstudio.com/_packaging/my-feed/nuget/v3/index.json. [D:\a\s\BitCoinMiner.sln]
2018-06-14T15:10:53.3857956Z C:\Program Files\dotnet\sdk.1.300\NuGet.targets(114,5): error : Response status code does not indicate success: 401 (Unauthorized). [D:\a\s\BitCoinMiner.sln]
如何授权构建代理访问我们的私有 VSTS?
我确实遇到了同样的问题,显然 VSTS 中的构建代理无法在没有访问令牌的情况下访问您的私人 VSTS 提要,因此您将不得不在 VSTS 中创建个人访问令牌并将其提供给内置的 Cake 方法,用于添加经过身份验证的 VSTS Nuget 提要作为来源之一。在这里,我将它包装在我自己方便的 Cake 方法中,该方法检查包提要是否已经存在,如果不存在,则添加它:
void SetUpNuget()
{
var feed = new
{
Name = "<feedname>",
Source = "https://<your-vsts-account>.pkgs.visualstudio.com/_packaging/<yournugetfeed>/nuget/v3/index.json"
};
if (!NuGetHasSource(source:feed.Source))
{
var nugetSourceSettings = new NuGetSourcesSettings
{
UserName = "<any-odd-string>",
Password = EnvironmentVariable("NUGET_PAT"),
Verbosity = NuGetVerbosity.Detailed
};
NuGetAddSource(
name:feed.Name,
source:feed.Source,
settings:nugetSourceSettings);
}
}
然后我从 "Restore" 任务调用它:
Task("Restore")
.Does(() => {
SetUpNuget();
DotNetCoreRestore("./<solution-name>.sln");
});
就我个人而言,我更喜欢让 PAT 远离源代码管理,所以我在这里阅读环境变量。在 VSTS 中,您可以在 CI 构建配置的“变量”选项卡下创建一个环境变量。
希望对您有所帮助!这是 Cake 文档的 link。
正如@KevinSmith 和@NickTurner 所指出的,访问 VSTS 提要的更好方法是使用 pre-defined 系统变量 System.AccessToken
而不是使用有限的有效性,手动创建和繁琐的 PAT。此变量在构建代理上可用,供当前构建使用。更多信息 here.
在 Cake 脚本中使用此标记的一种方法如下:
首先,在azure-pipelines.yml
steps:
- task: cake-build.cake.cake-build-task.Cake@0
displayName: 'Cake '
inputs:
target: Pack
env:
SYSTEM_ACCESSTOKEN: $(System.AccessToken)
然后在 Cake 中,您可以像访问任何环境变量一样访问它,所以在我的例子中:
if (!NuGetHasSource(source:feed.Source))
{
Information($"Nuget feed {feed.Source} not found, adding...");
var nugetSourceSettings = new NuGetSourcesSettings
{
UserName = "whoosywhatsit",
Password = EnvironmentVariable("SYSTEM_ACCESSTOKEN"),
Verbosity = NuGetVerbosity.Detailed
};
NuGetAddSource(
name:feed.Name,
source:feed.Source,
settings:nugetSourceSettings);
}
这似乎行得通!如果有更好的方法在 Cake 中访问此变量,请告诉我。 另请注意在我的例子中,我只是用它来从我的 VSTS 提要中恢复包,而不是推送到它。我通过 YML 中的 DotNetCoreCLI@2
任务完成,如下所示:
- task: DotNetCoreCLI@2
displayName: 'dotnet nuget push'
inputs:
command: push
packagesToPush: 'artifacts/package.nupkg'
publishVstsFeed: '<id of my VSTS feed>'
剩下的由 Azure 管道处理。