Azure DevOps 项目管道无法从不同项目中的工件源访问 NuGet 包
Posted
技术标签:
【中文标题】Azure DevOps 项目管道无法从不同项目中的工件源访问 NuGet 包【英文标题】:Azure DevOps Project pipeline not able to access NuGet package from Artifact Feed in different Project 【发布时间】:2020-06-03 09:06:36 【问题描述】:2020 年 2 月 20 日更新
总结
Azure DevOps 管道构建无法从我们在 Artifacts 下的私有源中找到 NuGet 包。
我们的 Azure DevOps 环境
在 Azure 中,我们有我们的公司“空间”:dev.azure.com/OurCompany
在这之下,我们有多个项目,例如,想象一下这三个:
绿色:包含特定类型的应用程序 蓝色:这包含不同类型的应用程序 红色:这包含我们的“通用”帮助代码红色
RED 持有我们所有常见的帮助代码都是 GREEN 和 BLUE 应用程序使用的 DLL。这些以 NuGet 包的形式提供。
在 RED 的 Artifacts 下,我们看到了一个名为“OurCompany”的“组织范围的提要”。我们知道我们不能使用它,因为这些 NuGet 包需要对 OurCompany 中的每个人都可用,这意味着不仅在 Azure 上,而且在我们公司网络中的桌面计算机上(我们运行 Visual Studio 的地方)。我认为“组织范围的提要”不会暴露在我们的企业网络中。
因此,我们在 RED 的 Artifacts 下创建了一个新的 Feed。当我查看权限时,我看到以下条目:
我:(所有者) [OurCompany]\Project Collection 管理员:(所有者) [RED]\项目管理员:(所有者) RED 构建服务(OurCompany):(贡献者) 项目集合构建服务(OurCompany):(贡献者) [RED]\Contributors(贡献者)公司
所以,回到 Corporate 中,我们将 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\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 中的 Artifact Feed。
我确实尝试在 RED 中为 Feed 添加权限。单击“添加用户/组”。我找到以下内容并将它们添加为读者或贡献者,但没有成功。
-
[GREEN]\绿队
绿色构建服务
所以:
-
我是不是走错了路?如果是这样,我应该做什么(我认为我已经非常严格地遵循了 Azure DevOps 说明)
我这样做是否正确?如果有,我错过了什么?
更新 #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 活动 ID:Guid))。
【问题讨论】:
注意到您cross-posted this question。因为它在这里很受欢迎(赞成,回答),我不会删除这个副本,但是as per the general rules of the Stack Exchange network你真的应该删除旧帖子。 这个问题首先发布在 DevOps.SE 上,所以 SO 版本是交叉发布的……(应该删除或迁移)。 【参考方案1】:Azure DevOps 项目管道无法访问不同项目中的工件源
我认为你走对了路。关于项目范围提要有known issue。
正如文件Package permissions in Azure Pipelines所说:
要在 Azure Pipelines 中使用源中的包,需要适当的构建 身份必须有权访问您的提要。默认情况下,项目 Collection Build Service 是一个贡献者。如果你改变了你的 构建以在项目范围内运行,您需要添加项目级别 根据需要建立读者或贡献者的身份。这 项目级构建标识命名如下:
[项目名称] 构建服务([组织名称])(例如 FabrikamFiber 构建服务(代码共享-演示))
您可以查看this thread 了解更多详情。
希望这会有所帮助。
【讨论】:
这似乎是我设置它的方式......所以“RED”是带有 NuGet 包的项目。根据您上面的屏幕截图,我有Project Collection Build Service (OurCompany) = Contributor
和以下项目条目,这些条目是要提取这些包的:GREEN Build Service (OurCompany) = Reader; BLUE Build Service (OutCompany) = Reader
。 Elipsis 还显示了这两个值“允许构建和发布”和“允许项目范围的构建”,但它们是灰色的,似乎没有任何效果。但是,那些构建管道仍然显示Unable to find version '.' of package '...'.
Lui-MSFT:我用 NuGet 还原步骤中的错误消息更新了原始帖子。这是否能进一步说明问题?
我刚刚注意到的一件事。对于构建步骤NuGetCommand@2
,它具有:vstsFeed: 'Guid1/Guid2'
。我虽然使用的是使用 Git 而不是 vsts 的 Azure Artifact....这有关系吗?
@DrGriff,using an Azure Artifact that's using Git and not vsts
是什么意思?结果如何使用 UI 而不是 YAML?
我也有同样的问题。我将消费项目的构建服务添加到我的 fead 的权限中,但没有任何改变。【参考方案2】:
终于,我找到了问题所在。我想知道这是否是一个错误,或者只是记录不佳....(或者我只是没有正确解释它)。
根据上面 Leo Lui-MSFT 的建议(由 Microsoft 记录),我已将权限添加到 NuGet 提要,但这不起作用。不过,我对他的一句话很感兴趣:
如果您已将构建更改为在项目范围内运行
就我个人而言,我没有,所以我与我们的系统管理员联系,我们完成了所有可能的设置。最终,我们找到了它——这不是我能够改变的。
因此,在我上面的示例中,BLUE 和 GREEN 是尝试在 RED 的 Artifact 提要中使用 NuGet 包的两个项目。
所以选择蓝色(或绿色),在 Azure DevOps 的左下角,您会看到一个链接“项目设置”。在“管道 > 设置”下有四个设置。我们必须将以下内容更改为:
将工作授权范围限制为当前项目 = false
希望有帮助!
【讨论】:
这正是我所需要的。我们有另外两个项目已经这样做了,但我无法弄清楚我们的新项目的配置中缺少什么。感谢您在这里发帖。 英雄。在一个糟糕的地方多么糟糕的环境! 感谢您找到这个。希望 MS 能找到一种方法来简化这项非常常见的任务。 这行得通。不确定为什么所有提要都是项目范围。我们有一些属于 org 范围的提要,它们运行良好。我不能告诉你多少感谢! 你把甘露洒在饥饿的路上。我找到了这个设置,因为我无法更改它,我以为我找错了地方。这篇文章确认它是正确的,我发现它在组织级别针对未发布的提要进行了更改。更改了它,现在构建工作正常。谢谢你【参考方案3】:在我的 LibsProject 中,我有一个 LibsFeed(OP 的 RED),我想在我的 ConsumingProject 的管道中使用它.
我必须添加以下权限才能使其工作:
LibsFeed:将 ConsumingProject Build Service 添加为 Contributor(Read 自动更改为 Contributor) LibsProject:将ConsumingProject Team添加到LibsProject -> Project Settings -> Team下的LibsProject Team即使拥有所有可以想到的管理员权限,我什至无法启用 OP 的解决方案
将工作授权范围限制在当前项目
【讨论】:
【参考方案4】:您可以执行以下操作以访问同一组织中的其他项目提要:
-
从以下选项中选择:Feed 设置 >> 权限 >> [单击三点菜单] >> sel
a) 允许构建和发布
b) 允许项目范围的构建
转到项目设置(从您要访问提要的位置)
确保在以下设置中未选中该选项:项目设置 >> 管道 >> 设置 >> 将作业授权范围限制为非发布管道的当前项目
【讨论】:
以上是关于Azure DevOps 项目管道无法从不同项目中的工件源访问 NuGet 包的主要内容,如果未能解决你的问题,请参考以下文章
Azure Pipelines 托管代理无法访问 DevOps 项目源
构建 .NET 5.0 项目 Azure DevOps 管道