在Azure DevOps Pipeline中出现Git仓库权限问题

3
在Azure Pipelines任务中,我试图创建并推送一个新的分支。我能够使用$(System.AccessToken)变量克隆存储库,但是当我尝试推送新分支时,出现以下错误:
remote: TF401027: You need the Git 'GenericContribute' permission to perform this action. Details: identity 'Build\(GUID)', scope 'repository'.

如果我检查我的仓库安全性,我会看到构建服务用户和项目集合构建服务帐户组都将Contribute、Create Branch、Contribute to pull request和Create Tag权限设置为“允许”,根据我所做的所有研究,这应该是我需要做的全部。
我该如何解决这个问题?我认为要么我漏掉了一些愚蠢的东西,要么存在权限继承问题。然而,如果我在仓库本身上设置安全性,我的假设是应该覆盖任何继承的权限。
管道:
steps:
- powershell: |
   git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" clone "https://repoaddress/_git/common"
   cd common
   git checkout develop
   git checkout -b release/$(build.buildNumber) $(build.buildNumber)
   git -c http.extraheader="AUTHORIZATION: bearer $(System.AccessToken)" push -u origin HEAD
   
  displayName: 'Create Branch From Tag'

权限: 图片描述

2个回答

7
这可能是由于您的构建服务帐户没有此存储库的贡献权限造成的。
进入项目设置-->存储库-->单击要操作的存储库-->相应地设置存储库权限。 注意: 服务帐户为项目集合构建服务(组织名称)。

enter image description here

更新1

我遇到了这个问题,需要添加这个服务账户 {项目名称}构建服务 ({组织名称}) 并配置账户权限,这样它就能正常工作了。

enter image description here

根据错误信息:Details: identity 'Build\(GUID)', scope 'repository'.,我们可以获取服务帐户 GUID。
查看此 REST API,它可以列出服务帐户,我们可以通过 GUID 搜索服务帐户名称,然后配置权限。 更新2 由于您正在使用AccessToken,它会通过服务帐户更新存储库。作为另一种解决方法,我们可以使用个人访问令牌完成相同的操作,并且不需要配置服务帐户权限。 更新2 使用 PAT 令牌克隆存储库的示例 PowerShell 脚本:
$MyPat = 'yourPAT'
$B64Pat = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$MyPat"))
git -c http.extraHeader="Authorization: Basic $B64Pat" clone https://dev.azure.com/yourOrgName/yourProjectName/_git/yourRepoName

在PAT的生命周期内,我们将会收到两个通知 - 一个是在创建时,另一个是在过期前七天。您可以参考此文档以获取更多详细信息。
在您的PAT到期前七天,您将会收到类似以下示例的通知。

enter image description here

然后我们可以更改过期时间。

我已经给了那个账户贡献权限,但它仍然无法正常工作。 - Mike Cole
我已经设置了这些权限,但仍然出现错误。请检查我对原帖的补充。谢谢。 - Mike Cole
这是发布工作流程中的一个阶段任务,而不是独立的流水线。这会有什么区别吗? - Mike Cole
我会进行一些研究,看看如何使用PAT而不是AccessToken。然而,这使得该解决方案容易受到PAT在1年后超时的影响。我曾经在一个完全不同的项目/存储库中尝试使用AccessToken,并得到了完全相同的错误信息。 - Mike Cole
嗨 @MikeCole,你可以通过PAT令牌做同样的事情,对吧?我已经更新了答案,你可以查看更新2。祝你有个愉快的一天。 - Vito Liu
显示剩余8条评论

0
我已经修复了,而不需要使用PAT。我只需要将组织名称添加到链接中即可。
示例:
http://{Organization name}@dev.azure.com/.../_git/...

在项目设置中的“设置”下,我必须禁用“在YAML管道中保护对存储库的访问”。

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