如何使用PowerShell Invoke-RestMethod调用API添加Azure DevOps分支策略
解决方案:Azure DevOps 分支策略自动化配置(PowerShell实现)
一、从GET请求返回结果中提取特定策略值
你调用GET接口拿到的返回结果是JSON格式的策略数组,每个元素对应一条已配置的策略,你可以通过筛选指定字段提取你需要的数值,以下是提取构建验证类策略的示例代码:
# 配置基础参数 $organization = "你的组织名" $project = "你的项目名" $repoName = "目标仓库名" $pat = "你的个人访问令牌" $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f "",$pat))) $header = @{Authorization=("Basic {0}" -f $base64AuthInfo)} # 调用GET接口获取现有策略 $getPolicyUrl = "https://dev.azure.com/$organization/$project/_apis/policy/configurations/repo=$repoName&api-version=6.0" $allPolicies = Invoke-RestMethod -Uri $getPolicyUrl -Headers $header -Method Get # 提取所有构建验证类型的策略,构建验证的固定类型ID为0609b952-1397-4640-95ec-e0055d2f2c33 $buildValidationPolicies = $allPolicies.value | Where-Object { $_.type.id -eq "0609b952-1397-4640-95ec-e0055d2f2c33" } # 提取特定值示例:获取第一条构建验证策略关联的构建定义ID、生效分支 $targetBuildDefId = $buildValidationPolicies[0].settings.buildDefinitionId $targetBranch = $buildValidationPolicies[0].settings.scope[0].refName
各个核心字段的存储位置说明:
- 策略类型ID存放在
type.id字段,同类型策略的ID是固定值,你可以直接从现有返回结果中复制复用 - 策略的自定义配置全部在
settings字段下,比如构建验证的触发规则、合并要求都在这个节点下 - 策略的生效范围存放在
settings.scope数组里,对应具体的仓库、分支匹配规则
二、添加新的分支策略配置
添加策略直接调用同路径的POST接口即可,只需要按规则构造请求体,以下是添加构建验证策略的示例:
# 构造新构建验证策略的请求体 $newPolicyBody = @{ type = @{ # 构建验证策略的固定类型ID,其他类型策略替换为对应ID即可 id = "0609b952-1397-4640-95ec-e0055d2f2c33" } # 配置策略是否启用 isEnabled = $true # 配置策略是否强制要求通过才能合并 isBlocking = $true settings = @{ # 要关联的构建定义ID,可从上文提取的结果中传值 buildDefinitionId = $targetBuildDefId queueOnSourceUpdateOnly = $true # 构建结果有效期,单位分钟,0代表永久有效 validDuration = 0 manualQueueOnly = $false # 策略生效范围 scope = @( @{ repositoryId = $allPolicies.value[0].settings.scope[0].repositoryId # 匹配的分支,比如main分支就是refs/heads/main,也可以用startsWith匹配特征分支前缀 refName = "refs/heads/main" matchKind = "exact" } ) } } | ConvertTo-Json -Depth 10 # 调用POST接口添加新策略 $addPolicyUrl = "https://dev.azure.com/$organization/$project/_apis/policy/configurations?api-version=6.0" Invoke-RestMethod -Uri $addPolicyUrl -Headers $header -Method Post -Body $newPolicyBody -ContentType "application/json"
注意事项
- 如果要配置其他类型的策略,只需要把
type.id替换为对应策略的ID,同时调整settings节点的字段即可,你可以先在界面手动创建一条目标策略,再调用GET接口拿到返回结果,直接复用对应字段的结构 - 你的PAT需要有项目级别的策略编辑权限,否则会返回403错误
内容的提问来源于stack exchange,提问作者Kart
相关产品推荐
相关产品推荐

