Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PowerShell中使用Azure DevOps REST API更新生成定义_Powershell_Azure Devops_Azure Devops Rest Api_Build Definition_Build Triggers - Fatal编程技术网

在PowerShell中使用Azure DevOps REST API更新生成定义

在PowerShell中使用Azure DevOps REST API更新生成定义,powershell,azure-devops,azure-devops-rest-api,build-definition,build-triggers,Powershell,Azure Devops,Azure Devops Rest Api,Build Definition,Build Triggers,我正在尝试通过PowerShell脚本使用REST API更新Azure DevOps中的生成定义 $header = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalAccessToken)"))} $definitions = Invoke-RestMethod -Uri "https://devops.domain.com/Collecti

我正在尝试通过PowerShell脚本使用REST API更新Azure DevOps中的生成定义

$header = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalAccessToken)"))}
$definitions = Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions" -Method GET -Header $header
$branchNames = 'master', 'feature'

ForEach ($definition in $definitions.value) {
    $definition | Add-Member -NotePropertyName triggers -NotePropertyValue (@{ triggerType = 'continuousIntegration'; branchFilters = $branchNames | % {"+refs/heads/$_/*"} }) -Force

    $body = $definition | ConvertTo-Json
    Write-Host $body

    Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions/$($definition.id)?api-version=5.0" -Method PUT -ContentType application/json -Body $body -Header $header
}
我应该如何使用此方法更新构建定义,这一点并不特别清楚,但上面的结果导致以下错误:

调用RestMethod:{“$id”:“1”,“innerException”:null,“message”:“值不能为null。\r\n参数名称: definition.Repository,“typeName”:“System.ArgumentNullException,mscorlib”,“typeKey”:“ArgumentNullException”,“errorCode”:0,“eventId”:0}

这就是我想知道我是不是找错了方向,因为这应该更简单(我在SO上找到了一个简单的解决方案,用于创建新的构建定义)。事实上,我只想更新触发器分支过滤器


如何使用PowerShell和REST API实现这一点?

触发器是数组,因此您不能只编辑它,您需要编辑触发器[0],同样的事情是
branchFilters
,您需要编辑
branchFilters[0]
。此外,您不需要触摸
触发器类型

所有这些都是假设构建中已经有一个触发器,并且您想要编辑它,而不是添加一个新的触发器部分

branchFilters
数组中还有一件棘手的事情,如果您只有一个分支(
master
),并且您想要添加另一个分支,那么您需要将它添加到数组中,而不仅仅是编辑
branchFilters[0]

最后一件应该固定的事情是分支值,它应该是
+refs/heads/branchName
,而不仅仅是分支名称

因此,我有一个带有
test
分支触发器的管道,我成功地使用以下脚本将触发器编辑为
master
feature/*

# I get only one definition and update him, not iterate all my definitions
$definition = Invoke-RestMethod -Uri $url -Method Get

# Change the branch trigger from "test" to "master"
$definition.triggers[0].branchFilters[0] = "+refs/heads/master"

# Add another branch trigger - "feature/*"
$definition.triggers[0].branchFilters[0] += "+refs/heads/feature/*"

$body = $definition | ConvertTo-Json -Depth 10
Write-Host $body

Invoke-RestMethod -Uri $url -Method Put -ContentType application/json -Body $body

这是对我有效的幻灯片校正

$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$token = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalAccessToken)"))
$headers.Add("Authorization", "Basic $token")
$headers.Add("Content-Type", "application/json")
$definitions = Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions" -Method GET -Headers $headers

ForEach ($definition in $definitions.value) {
    $definition.triggers = (@{ triggerType = 'continuousIntegration'; branchFilters = 'master', 'feature/*' })
    $definition.revision++

    $body = $definition | ConvertTo-Json
    Write-Host $body

    Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions/$($definition.id)?api-version=5.0" -Method PUT -ContentType application/json -Body $body -Headers $headers
}


从接收到的定义似乎不能直接用于。这在列表响应类型中非常清楚,它不包括属性,例如
触发器
。必须使用中的定义ID从中获取定义。这将返回一个确实具有
触发器
属性的。然后可以对其进行修改并将其传递给

这是工作代码:

$header = @{Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalAccessToken)"))}
$definitions = Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions" -Method GET -Header $header
$branchNames = 'master', 'feature'

ForEach ($definition in $definitions.value) {
    $definitionToUpdate = Invoke-RestMethod -Uri "$($collection)$($project.name)/_apis/build/definitions/$($definition.id)" -Method GET -Header $header
    $trigger = $definitionToUpdate.triggers | Where {$_.triggerType -eq 'continuousIntegration'}

    if ($trigger) {
        $trigger.branchFilters = $branchNames | % {"+refs/heads/$_/*"}
        Invoke-RestMethod -Uri "https://devops.domain.com/Collection/Project/_apis/build/definitions/$($definition.id)?api-version=5.0" -Method PUT -ContentType application/json -Body ($definitionToUpdate | ConvertTo-Json -Depth 10) -Header $header
    }
}

代码在更新其分支筛选器之前检查CI触发器是否存在。

尝试将
-Depth 10
添加到
$body=$definition | ConvertTo Json
@shaykibaramczyk Nope,不会更改任何内容。如果我这样做了:
$body=$definition | ConvertTo Json-Depth 10
我没有收到您的错误(但是触发器也没有更新,但这是另一个问题。您需要正确地传递它们)@Shaykibaramczyk,错误发生在调用
Invoke RestMethod
时。但问题是,如何使用PowerShell和REST API更新触发器分支筛选器?这不是另一个问题,这是问题的一部分。我理解,我成功地更新了触发器:)检查我的答案。我刚刚注意到我在原始代码中遇到了此错误:
“在该对象上找不到属性‘triggers’。请验证该属性是否存在并且可以设置。”
您的代码实际上导致了此错误:
无法索引到空数组。
我不确定它为什么适用于您,但似乎我必须使用
addmember-NotePropertyName触发器-Force
强制向JSON对象添加一个成员,并使用
-NotePropertyValue
设置一个值。我已经更新了这个问题。但是我仍然在调用
Invoke RestMethod
.omfg时遇到了上面提到的错误,我为此挣扎了将近4个小时。我注意到这是一个数组,我得到了同样的错误“不能设置为这个对象”。非常感谢你!请看我的评论。太棒了!我没有尝试“定义”选项,而是从获取生成定义开始,这就是我成功的原因。@Shaykibaramczyk我对您的答案投了赞成票,因为它推断了这一点,但您没有说明
$url
是什么。此外,在分支名称前加上
+refs/heads/
也是有用的信息。请随便投我的一票!;)这是你应得的: