使用tf.exe从Azure DevOps管道设置分支权限

时间:2019-11-20 21:25:27

标签: azure-devops azure-pipelines

我有一个Powershell脚本,它试图设置在构建管道中被调用的分支权限。不幸的是,我遇到了未经授权的错误,我不确定为什么。

代码段:

$tfExe = "$(split-path -parent $MyInvocation.MyCommand.Definition)\tf.exe"
& $tfExe git permission /deny:CreateBranch /group:[$project]\Contributors /collection:https://dev.azure.com/$organization/ /teamproject:$project /repository:$reposiName /login:$username,$pat
& $tfExe git permission /allow:CreateBranch /group:[$project]\Contributors /collection:https://dev.azure.com/$organization/ /teamproject:$project /repository:$reposiName /branch:feature /login:$username,$pat

错误消息:

  

TF30063:您无权访问   https://dev.azure.com/Company-DevOps。 TF30063:您无权   访问https://dev.azure.com/Company-DevOps。 TF30063:您不是   被授权访问https://dev.azure.com/Company-DevOps

构建管道中的Powershell脚本:

Powershell Script in Build Pipeline

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

/login中的用户名和密码用于Azure DevOps服务器。对于Azure DevOps,应使用OAuth

param ($oauth)
/loginType:OAuth /login:.,$auth

在代理作业选项中,您需要启用“允许脚本访问OAuth令牌”:

enter image description here

并将$(System.AccessToken)作为oauth参数传递

enter image description here

答案 1 :(得分:0)

因此,按照Microsoft Docs的建议,我无法使它与tf.exe一起使用,但是我可以在博客here的帮助下找到答案。

步骤1

获取“贡献者”组的$descriptor

$descriptor = az devops security group list --org https://dev.azure.com/$organization --project $project | ConvertFrom-Json | select -expand graphGroups | where principalName -eq "[$project]\Contributors"

步骤2

为所需的分支创建令牌值。不幸的是,您无法明确说明您想要的分支模式。 Azure DevOps需要十六进制值(不要问)

#Create the tokens
function hexify($string) {
    return ($string | Format-Hex -Encoding Unicode | Select-Object -Expand Bytes | ForEach-Object { '{0:x2}' -f $_ }) -join ''
}

$hexFeatureBranch = hexify -string  "feature"
$featureToken = "refs/heads/$hexFeatureBranch"

$hexSprintBranch = hexify -string  "sprint"
$sprintToken = "refs/heads/$hexSprintBranch"

$hexHotfixBranch = hexify -string  "hotfix"
$hotfixToken = "refs/heads/$hexHotfixBranch"

步骤3

获取Git存储库的命名空间ID

#Get the namespace ID for the organization's Git repos
$namespaceId = az devops security permission namespace list --org "https://dev.azure.com/$organization/" --query "[?@.name == 'Git Repositories'].namespaceId | [0]"

步骤4

从服务器获取项目的JSON对象

#Get the Project's JSON object
$projectObj = az devops project show --org https://dev.azure.com/$organization --project $project | ConvertFrom-Json
$projectid = $projectObj.id

步骤5

在回购中的每个分支上,在CreateBranch上分别放置一个 Deny 。 Azure CLI要求您知道允许和拒绝的位。幸运的是,我可以通过UI捕获JSON响应来做到这一点。

$denyBranch = az devops security permission update --id $namespaceId --org https://dev.azure.com/$organization --subject $descriptor.descriptor --token "repoV2/" --deny-bit 16 --allow-bit 16494

步骤6

在每个具有模式功能/ ,sprint / 和hotfix / *

的分支上,在CreateBranch上允许
$featureTokenBuild = "repoV2/$projectid/$repoid/$featureToken"
$sprintTokenBuild = "repoV2/$projectid/$repoid/$sprintToken"
$hotfixTokenBuild = "repoV2/$projectid/$repoid/$hotfixToken"

$allowCreateBranchFeature = az devops security permission update --id $namespaceId --org https://dev.azure.com/$organization --subject $descriptor.descriptor --token $featureTokenBuild --deny-bit 0 --allow-bit 16
$allowCreateBranchSprint = az devops security permission update --id $namespaceId --org https://dev.azure.com/$organization --subject $descriptor.descriptor --token $sprintTokenBuild --deny-bit 0 --allow-bit 16
$allowCreateBranchHotfix = az devops security permission update --id $namespaceId --org https://dev.azure.com/$organization --subject $descriptor.descriptor --token $hotfixTokenBuild --deny-bit 0 --allow-bit 16

这并不容易,但至少对于将来希望这样做的人来说,这是解决方案!