如何使用 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 管道处理。