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
在此之下,我们有多个项目,例如,假设这三个:
- 绿色:这包含某种类型的应用程序
- 蓝色:这包含不同类型的应用程序
- 红色:这包含我们的 "common" 辅助代码
红色
RED 包含我们所有常用的帮助程序代码,都是由 GREEN 和 BLUE 中的应用程序使用的 DLL。这些以 NuGet 包的形式提供。
在 RED 的 Artifacts 下,我们看到一个名为 "OurCompany" 的 "organisational scoped feed"。我们知道我们不能使用它,因为这些 NuGet 包需要可供 OurCompany 中的每个人使用,这意味着不仅在 Azure 上,而且在我们公司网络中的桌面计算机上(我们 运行 Visual Studio).我认为 "organisational scoped feed" 不会暴露在我们的企业网络中。
因此,我们在 RED 的 Artifacts 下创建了一个新的 Feed。当我查看权限时,我看到以下条目:
- {我}:(所有者)
- [OurCompany]\Project Collection 管理员:(所有者)
- [RED]\项目管理员:(所有者)
- RED 构建服务(我们公司):(贡献者)
- 项目集合构建服务(OurCompany):(贡献者)
- [RED]\Contributors(贡献者)
企业
因此,回到公司,我们将 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 或贡献者,但没有成功。
- [绿色]\绿队
- 绿色构建服务
所以:
- 我是不是走错了路?如果是这样,我应该做什么(我认为我已经相当严格地遵循了 Azure DevOps 说明)
- 我这样做的方式正确吗?如果是这样,我错过了什么?
更新#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
您可以执行以下操作以访问同一组织中的其他项目供稿:
- 从以下选项中选择:Feed 设置 >> 权限 >> [单击三点菜单] >> 选择
a) 允许构建和发布
b) 允许项目范围内的构建
- 转到项目设置(从您要访问提要的位置)
- 确保在以下设置中取消选中该选项:项目设置 >> 管道 >> 设置 >> 将作业授权范围限制为非发布管道的当前项目
2020 年 2 月 20 日更新
总结
Azure DevOps 管道构建无法从 Artifacts 下的私有源中找到 NuGet 包。
我们的 Azure DevOps 环境
在 Azure 中,我们有我们的公司 "space":dev.azure。com/OurCompany
在此之下,我们有多个项目,例如,假设这三个:
- 绿色:这包含某种类型的应用程序
- 蓝色:这包含不同类型的应用程序
- 红色:这包含我们的 "common" 辅助代码
红色
RED 包含我们所有常用的帮助程序代码,都是由 GREEN 和 BLUE 中的应用程序使用的 DLL。这些以 NuGet 包的形式提供。
在 RED 的 Artifacts 下,我们看到一个名为 "OurCompany" 的 "organisational scoped feed"。我们知道我们不能使用它,因为这些 NuGet 包需要可供 OurCompany 中的每个人使用,这意味着不仅在 Azure 上,而且在我们公司网络中的桌面计算机上(我们 运行 Visual Studio).我认为 "organisational scoped feed" 不会暴露在我们的企业网络中。
因此,我们在 RED 的 Artifacts 下创建了一个新的 Feed。当我查看权限时,我看到以下条目:
- {我}:(所有者)
- [OurCompany]\Project Collection 管理员:(所有者)
- [RED]\项目管理员:(所有者)
- RED 构建服务(我们公司):(贡献者)
- 项目集合构建服务(OurCompany):(贡献者)
- [RED]\Contributors(贡献者)
企业
因此,回到公司,我们将 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 或贡献者,但没有成功。
- [绿色]\绿队
- 绿色构建服务
所以:
- 我是不是走错了路?如果是这样,我应该做什么(我认为我已经相当严格地遵循了 Azure DevOps 说明)
- 我这样做的方式正确吗?如果是这样,我错过了什么?
更新#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
您可以执行以下操作以访问同一组织中的其他项目供稿:
- 从以下选项中选择:Feed 设置 >> 权限 >> [单击三点菜单] >> 选择 a) 允许构建和发布 b) 允许项目范围内的构建
- 转到项目设置(从您要访问提要的位置)
- 确保在以下设置中取消选中该选项:项目设置 >> 管道 >> 设置 >> 将作业授权范围限制为非发布管道的当前项目