Azure DevOps项目流水线无法从不同项目的Artifact Feed访问NuGet包

24

更新于2020年2月20日

概述

Azure DevOps的pipeline构建无法从我们存储在Artifacts下的私有feed中找到NuGet软件包。

我们的Azure DevOps环境

在Azure上,我们有我们公司的“space”:dev.azure.com/OurCompany

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

  • Green:这是一个特定类型的应用程序集合
  • Blue:这是另一种类型的应用程序集合
  • Red:这保存了我们的“公共”帮助器代码

RED

RED保存我们所有公共的帮助器代码DLL,这些DLL被GREEN和BLUE中的应用程序所使用。这些DLL以NuGet软件包的形式提供。

在RED的Artifacts下,我们看到一个名为“OurCompany”的“组织范围内的feed”。我们知道不能使用这个,因为这些NuGet软件包需要对OurCompany中的每个人都可用,这意味着不仅要在Azure上,还要在我们公司网络中的桌面机器上(我们在其中运行Visual Studio)。我认为,“组织范围内的feed”没有暴露给我们的公司网络。

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

  • {me}:(Owner)
  • [OurCompany]\Project Collection Adminstrators:(Owner)
  • [RED]\Project Administrators:(Owner)
  • RED Build Service(OurCompany):(Contributor)
  • Project Collection Build Service(OurCompany):(Contributor)
  • [RED]\Contributors:(Contributor)

公司网络

回到公司网络,我们将NuGet软件包feed添加到我们的Visual Studio中,然后它就可以从Azure下载NuGet软件包。

GREEN和BLUE

在这里,我们有我们的产品。我们创建了一个构建流程,并添加了一个NuGet还原步骤:

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

当我们从下拉菜单中选择Azure Artifacts feed时,这两个Guid就被填充了。

绿色或蓝色NuGet还原失败

所以在这里我们遇到了问题。当NuGet还原步骤执行时,它会失败并显示以下消息:

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

日志输出很多,但关键行似乎是:

2020-02-18T18:36:35.2838118Z [command]C:\hostedtoolcache\windows\NuGet\5.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\1\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\2.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 中的工件 Feed。

我尝试在 RED 中添加 Feed 权限。点击“添加用户/组”。我找到以下内容,并将它们添加为 Reader 或 Contributor,但没有成功。

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

所以:

  1. 我是不是做错了?如果是这样,我应该做什么(我认为我已经相当仔细地遵循了 Azure DevOps 的说明)
  2. 我是不是做对了?如果是这样,我错过了什么?

更新 #1

从还原步骤得到详细的错误信息:

https://api.nuget.org/v3/index.json:程序包 'Package1.nnnn.n.n' 在源 'https://api.nuget.org/v3/index.json' 上未找到。
https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json: 无法为源 'https://pkgs.dev.azure.com/OurCompany/{Guid1}/_packaging/{Guid2}/nuget/v3/index.json>' 加载服务索引。响应状态代码没有指示成功:404(未找到 - VS800075:具有 id 的项目 'vstfs:///Classification/TeamProject/{Guid1}' 不存在,或者您 没有访问它的权限。(DevOps Activity ID:{Guid})。


已经注意到您在这里交叉发布了这个问题。由于它在这里得到了良好的反响(赞同、回答),我不会删除这个副本,但是根据Stack Exchange网络的一般规则,您应该删除旧帖子 - Martijn Pieters
问题最初发布在DevOps.SE上,因此SO版本是交叉发布...(应该被删除或迁移)。 - Pierre.Vriens
4个回答

47

最终,我找到了问题所在。我想知道这是一个bug还是文档描述不清楚(或者可能是我理解有误)。

根据Leo Lui-MSFT的建议(由Microsoft记录),我已经将权限添加到NuGet feed中,但仍然无法解决问题。然而,他的这句话引起了我的兴趣:

如果您已更改构建以在项目范围内运行

就我个人而言,我没有这样做,因此我与我们的系统管理员一起查看了所有可能的设置。最终,我们找到了问题所在 - 这不是我能够更改的内容。

所以在上面的例子中,BLUE和GREEN是尝试在RED的Artifact feed中使用NuGet软件包的两个项目。

因此,在Azure DevOps的左下角选择BLUE(或GREEN),您将看到一个名为“项目设置”的链接。在“管道 > 设置”下,有四个设置。 我们必须将以下内容更改为:

将作业授权范围限制为当前项目= false

希望可以帮到您!


这正是我所需要的。我们已经有另外两个项目在做这件事,但我无法确定在我们的新项目中配置上缺少了什么。感谢您在这里发布信息。 - Macros185
3
英雄。多么糟糕的环境在一个糟糕的地方! - James Law
感谢您找到这个。希望微软能够找到一种使这个非常普遍的任务更容易的方法。 - user3230660
你让我的一天变得美好!谢谢! - etalon11
这对我没用。 - user3038723
显示剩余3条评论

9
Azure DevOps项目管道无法访问不同项目中的工件存储库。
我认为您正在采取正确的方式。关于项目范围的工件存储库,有已知问题
如文档Azure Pipelines中的包权限所述:
要在Azure Pipelines中使用来自存储库的包,适当的构建标识必须具有对您的存储库的权限。默认情况下,Project Collection Build Service是贡献者。如果您已将构建更改为在项目范围内运行,则需要将项目级构建标识添加为Reader或Contributor,根据需要进行设置。项目级构建标识的名称如下:
[Project name] Build Service ([Organization name])(例如FabrikamFiber Build Service(codesharing-demo))。

enter image description here

你可以查看此帖子以获取更多细节。
希望这可以帮到你。

这似乎是我设置的方式... 因此,“RED”是具有NuGet包的项目。根据您上面的屏幕截图,我有Project Collection Build Service (OurCompany) = Contributor和要拉取这些包的项目的以下条目:GREEN Build Service (OurCompany) = Reader; BLUE Build Service (OutCompany) = Reader。省略号还显示了这两个值“允许构建和发布”和“允许项目范围内的构建”,但它们是灰色的,似乎没有效果。然而,这些构建管道仍然显示Unable to find version '.' of package '...'. - DrGriff
Lui-MSFT:我在原帖中更新了来自NuGet还原步骤的错误消息。这能提供更多信息吗? - DrGriff
我刚刚注意到一件事。对于构建步骤NuGetCommand@2,它有:vstsFeed: '{Guid1}/{Guid2}'。但是我正在使用一个使用Git而不是vsts的Azure Artifact....这是否相关? - DrGriff
@DrGriff,您是指“使用使用Git而不是VSTS的Azure Artifact”吗?如果使用UI而不是YAML,结果如何? - Leo Liu
我有同样的问题。我将消费项目的构建服务添加到我的 fead 权限中,但没有任何改变。 - Heinzlmaen

2
您可以按照以下步骤访问同一组织中的其他项目源:
  1. 从“Feed设置”>>“权限”>> [单击三点菜单] >> 选择以下选项: a) 允许构建和发布 b) 允许仅限该项目的构建
  2. 进入要访问该源的项目设置
  3. 确保在以下设置中取消选中该选项: “项目设置”>>“管道”>>“设置”>>“仅限于当前项目的非发布管道的作业授权范围”

1
在我的LibsProject中,有一个LibsFeed(OP的RED),我希望在我的ConsumingProject中的管道中使用它。
我必须添加以下权限才能使其正常工作:
  • LibsFeed:将ConsumingProject Build Service添加为贡献者(某种方式自动更改了读取权限为贡献者)
  • LibsProject:在LibsProject ->项目设置 ->团队下的LibsProject Team中添加ConsumingProject Team
即使拥有所有可想象的管理员权限,我仍无法启用OP的解决方案。

将作业授权范围限制为当前项目


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接