Azure DevOps 项目管道无法从不同项目中的 Artifact Feed 访问 NuGet 包

Azure DevOps Project pipeline not able to access NuGet package from Artifact Feed in different Project

2020 年 2 月 20 日更新

总结

Azure DevOps 管道构建无法从 Artifacts 下的私有源中找到 NuGet 包。

我们的 Azure DevOps 环境

在 Azure 中,我们有我们的公司 "space":dev.azure。com/OurCompany

在此之下,我们有多个项目,例如,假设这三个:

红色

RED 包含我们所有常用的帮助程序代码,都是由 GREEN 和 BLUE 中的应用程序使用的 DLL。这些以 NuGet 包的形式提供。

在 RED 的 Artifacts 下,我们看到一个名为 "OurCompany" 的 "organisational scoped feed"。我们知道我们不能使用它,因为这些 NuGet 包需要可供 OurCompany 中的每个人使用,这意味着不仅在 Azure 上,而且在我们公司网络中的桌面计算机上(我们 运行 Visual Studio).我认为 "organisational scoped feed" 不会暴露在我们的企业网络中。

因此,我们在 RED 的 Artifacts 下创建了一个新的 Feed。当我查看权限时,我看到以下条目:

企业

因此,回到公司,我们将 NuGet 包提要添加到我们的 Visual Studio,然后它可以从 Azure 中拉下 NuGet 包。

绿色和蓝色

这里有我们的产品。我们创建一个构建管道并添加一个 NuGet 恢复步骤:

- task: NuGetCommand@2
  displayName: 'Restore for Our Application'
  inputs:
    command: 'restore'
    restoreSolution: '**/*.sln'
    feedsToUse: 'select'
    vstsFeed: '{Guid1}/{Guid2}'

当我们从下拉列表中选择 Azure Artifacts 提要时,两个 Guid 已填写。

绿色或蓝色 NuGet 恢复失败

所以这就是我们 运行 进入我们的问题的地方。当 NuGet 恢复步骤执行时,它失败并显示以下消息:

Unable to find version 'nnnn.n.n' of package 'TheNuGetPackage'.

日志输出很大,但突出的几行似乎是:

2020-02-18T18:36:35.2838118Z [command]C:\hostedtoolcache\windows\NuGet.4.0\x64\nuget.exe sources Add -NonInteractive -Name {Guid2} -Source https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json
-ConfigFile d:\a\Nuget\tempNuGet_356.config 2020-02-18T18:36:35.7513495Z Package source with Name: {Guid2} added successfully. 2020-02-18T18:36:41.1671856Z     [CredentialProvider.183638]Command-line v0.1.20+a5d37185a1a95acb4f0g997b9c23cab99508: "d:\a\_tasks\NuGetCommand_333b11bd-d341-40d9-bdbd-b32d5ce6f23b.164.0\CredentialProviderV2\plugins\netfx\CredentialProvider.Microsoft\CredentialProvider.Microsoft.exe"
-Plugin 2020-02-18T18:36:41.1673979Z     [CredentialProvider]Handling 'Request' 'GetAuthenticationCredentials'. Time elapsed in ms: 3 - Payload: {"Uri":"https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json","IsRetry":false,"IsNonInteractive":true,"CanShowDialog":true} 2020-02-18T18:36:41.1674299Z     [CredentialProvider]Handling auth request, Uri: https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json, IsRetry: False, IsNonInteractive: True, CanShowDialog: True 2020-02-18T18:36:41.1674465Z     [CredentialProvider]URI: https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json 2020-02-18T18:36:41.1674818Z     [CredentialProvider]Skipping NuGetCredentialProvider.CredentialProviders.VstsBuildTaskServiceEndpoint.VstsBuildTaskServiceEndpointCredentialProvider, cannot provide credentials for https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json 2020-02-18T18:36:41.1675261Z     [CredentialProvider]VstsBuildTaskCredentialProvider - https://dev.azure.com/OurCompany/ 2020-02-18T18:36:41.1675425Z     [CredentialProvider]VstsBuildTaskCredentialProvider - https://pkgs.dev.azure.com/OurCompany/ 2020-02-18T18:36:41.1675722Z    [CredentialProvider]VstsBuildTaskCredentialProvider - https://pkgs.dev.azure.com/OurCompany/ 2020-02-18T18:36:41.1676021Z    [CredentialProvider]VstsBuildTaskCredentialProvider - https://pkgs.dev.azure.com/OurCompany/ 2020-02-18T18:36:41.1676161Z    [CredentialProvider]VstsBuildTaskCredentialProvider - Matched prefix: https://pkgs.dev.azure.com/OurCompany/ 2020-02-18T18:36:41.1676330Z    [CredentialProvider]VstsBuildTaskCredentialProvider - Found credentials for endpoint https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json 2020-02-18T18:36:41.1680820Z   https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json: Unable to load the service index for source https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json. 2020-02-18T18:36:41.1680996Z   Response status code does not indicate success: 404 (Not Found - VS800075: The project with id 'vstfs:///Classification/TeamProject/{Guid1}' does not exist, or you do not have permission to access it. (DevOps Activity ID: 0628EDE7-6E7E-465D-A6AE-7B6B0AA065D2)).

我觉得这像是权限问题。但是看起来奇怪的是,在创建管道构建 YAML 时发现了 RED 中的 Artifact Feed,而我们随后没有使用它的权限。

我确实尝试在 RED 中添加对 Feed 的权限。单击 "Add users/groups"。我找到了以下内容并将它们添加为 Reader 或贡献者,但没有成功。

  1. [绿色]\绿队
  2. 绿色构建服务

所以:

  1. 我是不是走错了路?如果是这样,我应该做什么(我认为我已经相当严格地遵循了 Azure DevOps 说明)
  2. 我这样做的方式正确吗?如果是这样,我错过了什么?

更新#1

还原步骤中的详细错误消息

https://api.nuget.org/v3/index.json: Package 'Package1.nnnn.n.n' is not found on source 'https://api.nuget.org/v3/index.json'.
https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json: Unable to load the service index for source https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json. Response status code does not indicate success: 404 (Not Found - VS800075: The project with id 'vstfs:///Classification/TeamProject/{Guid1}' does not exist, or you do not have permission to access it. (DevOps Activity ID: {Guid})).

Azure DevOps Project pipeline not able to access Artifact Feed in different project

我认为你走的路是对的。关于项目范围提要,有 known issue

如文档 Package permissions in Azure Pipelines 所述:

To use packages from a feed in Azure Pipelines, the appropriate build identity must have permission to your feed. By default, the Project Collection Build Service is a Contributor. If you've changed your builds to run at project scope, you'll need to add the project-level build identity as a Reader or Contributor, as desired. The project-level build identity is named as follows:

[Project name] Build Service ([Organization name]) (e.g. FabrikamFiber Build Service (codesharing-demo))

您可以查看 了解更多详情。

希望这对您有所帮助。

终于找到问题了。我想知道这是否是一个错误,或者只是记录不完整....(或者我可能只是没有正确解释它)。

根据上面 Leo Lui-MSFT 的建议(由 Microsoft 记录),我已将权限添加到 NuGet 提要,但这没有用。然而,我对他的一句话很感兴趣:

If you've changed your builds to run at project scope

就我个人而言,我没有,所以我联系了我们的系统管理员,我们完成了所有可能的设置。最终,我们找到了它——这不是我有能力改变的。

所以在我上面的示例中,BLUE 和 GREEN 是两个试图在 RED 的 Artifact 提要中使用 NuGet 包的项目。

所以选择蓝色(或绿色),在 Azure DevOps 的左下角你会看到 link "Project Settings"。在 "Pipelines > Settings" 下有四个设置。我们必须将以下内容更改为:

Limit job authorization scope to current project = false

希望对您有所帮助!

在我的 LibsProject 中,我有一个 LibsFeed(OP 的 RED),这是我想要的在我的 ConsumingProject.

的管道中使用

我必须添加以下权限才能使其正常工作:

  • LibsFeed:添加 ConsumingProject 构建服务 作为贡献者(阅读自动更改为贡献者)
  • LibsProject:将 ConsumingProject 团队 添加到 下的 LibsProject 团队 LibsProject -> 项目设置 -> 团队

我什至无法启用 OP 的解决方案,即使拥有所有可以想到的管理员权限

Limit job authorization scope to current project

您可以执行以下操作以访问同一组织中的其他项目供稿:

  1. 从以下选项中选择:Feed 设置 >> 权限 >> [单击三点菜单] >> 选择 a) 允许构建和发布 b) 允许项目范围内的构建
  2. 转到项目设置(从您要访问提要的位置)
  3. 确保在以下设置中取消选中该选项:项目设置 >> 管道 >> 设置 >> 将作业授权范围限制为非发布管道的当前项目