【问题标题】:In VSTS, can I bulk change the agent queue?在 VSTS 中,我可以批量更改代理队列吗?
【发布时间】:2017-10-09 15:34:59
【问题描述】:

如果我想将所有构建和发布更改为新的代理队列,有没有办法一次性完成?

Agent Queue API 没有关于更改使用哪个队列的任何内容,Build API 没有队列名称的变量。在 VSTS 中,在设置的 Agent Pools 选项卡中,我可以看到池列表以及在其上运行的构建,但我看不到更改它们的方法。

是否有一种编程方式可以一次性更改它们,还是我必须手动更改它们?

我正在试验一个特定的构建,然后在每个构建中完全实现它。我现在的程序流程是:获取构建定义,从具有正确构建定义的构建中获取队列代理,将旧版本中的队列设置为等于新版本,然后将整个内容放回 VSTS。

$result = Invoke-RestMethod -Method GET -Uri $uri -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$result3 = Invoke-RestMethod -Method GET -Uri $uri3 -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$q = $result3.queue
$result.queue = $q
$result | ConvertTo-JSON
Invoke-RestMethod -Method PUT $uri -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -ContentType "application/json" -Body $result

我收到了错误

Invoke-RestMethod : {"$id":"1","innerException":null,"message":"Value cannot be null.\r\nParameter name:

如何从 GET 正确配置 PUT?

【问题讨论】:

  • 你用我的解决方案解决了这个问题吗?
  • 我没有,我们正在进行一些维护,并且构建代理已离线。我认为最终我将不得不在不久的将来改变整个构建步骤的方式
  • 有时间可以试试,只需要指定API url即可。

标签: powershell build azure-devops


【解决方案1】:

REST API 只能更改特定构建定义的代理队列。

因此您需要获取团队项目的所有构建定义,然后循环更改构建定义的代理队列。详情如下:

  1. 获取要申请构建定义的代理队列的id

    使用get a list of queues REST API:

    GET https://account.visualstudio.com/DefaultCollection/project/_apis/distributedtask/queues?api-version=3.0-preview.1
    

    在列出的代理队列中,找到您要使用的代理队列的id

    比如如果你想使用Default代理,你可以在下面的步骤中使用id作为7

  2. Get build definitions 用于项目

    GET ttps://account.visualstudio.com/DefaultCollection/project/_apis/build/definitions?api-version=2.0
    

    您可以获取每个构建定义的定义idrevision 和定义name

  3. 循环每个构建定义并更改代理队列。更新构建定义,它需要构建修订和存储库信息。所以你应该通过get a build definition REST API获取构建定义库:

    GET https://account.visualstudio.com/DefaultCollection/project/_apis/build/definitions/definitionID?api-version=2.0
    

    然后你可以得到如下的仓库信息:

    "repository": {
            "properties": {
                "cleanOptions": "0",
                "labelSources": "0",
                "labelSourcesFormat": "$(build.buildNumber)",
                "reportBuildStatus": "true",
                "gitLfsSupport": "false",
                "skipSyncSource": "false",
                "checkoutNestedSubmodules": "false",
                "fetchDepth": "0"
            },
            "id": "e89075b8-d7bd-4c3f-b24c-23276d89e8ec",
            "type": "TfsGit",
            "name": "vs2017",
            "url": "https://marinaliu.visualstudio.com/Git2/_git/vs2017",
            "defaultBranch": "refs/heads/master",
            "clean": "true",
            "checkoutSubmodules": false
    }
    

    然后你可以update build definition代理队列:

    PUT https://account.visualstudio.com/DefaultCollection/project/_apis/build/definitions/definitionID?api-version=2.0
    
    Application/json as:
    {
      "id": 6,
      "revision": 356,
      "queue": {
            "id": 7
        },
         "repository": {
            "properties": {
                "cleanOptions": "0",
                "labelSources": "0",
                "labelSourcesFormat": "$(build.buildNumber)",
                "reportBuildStatus": "true",
                "gitLfsSupport": "false",
                "skipSyncSource": "false",
                "checkoutNestedSubmodules": "false",
                "fetchDepth": "0"
            },
            "id": "e89075b8-d7bd-4c3f-b24c-23276d89e8ec",
            "type": "TfsGit",
            "name": "vs2017",
            "url": "https://marinaliu.visualstudio.com/Git2/_git/vs2017",
            "defaultBranch": "refs/heads/master",
            "clean": "true",
            "checkoutSubmodules": false
        }
    }
    

    现在,当前项目中的构建定义都将代理队列更改为默认代理(如示例中的id=7)。您可以使用类似的方式来更改其他构建/发布定义。

【讨论】:

  • 我用我的一些脚本更新了原始帖子。我试图或多或少地按照您的建议进行操作,但我无法弄清楚 JSON 更新构建的语法。我也一直在使用 PATCH 而不是 PUT。
  • 你最好用PUT rest api body的内容定义一个变量。然后从 GET rest api 中获取部件来替换 body 变量。
  • 所以我每次都必须创建整个构建并重新上传?这将花费大量时间,并且仅更改一个变量就需要付出很多努力。有没有办法只运行一个补丁并更新一个变量?如果我必须每次都创建整个构建,那么将每个构建的数据保存在存储库中然后我可以单独更新它们可能是有意义的。
  • 不,PATCH 方法不适用于这个 rest api。您应该使用 PUT 方法。
  • 目前这还不够。我实际上只是写了一些东西来做你的确切建议(在阅读这篇文章之前),但是在更新时我丢失了我以前的一些属性,因为个人 get 无法获得构建的所有细节。我要手动更新构建队列。
【解决方案2】:

尝试参考此代码:

param(
[string]$uri,
[string]$uri3
)
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f 'test','XXX')))
$result = Invoke-RestMethod -Method GET -Uri $uri -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
$result3 = Invoke-RestMethod -Method GET -Uri $uri3 -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
foreach($bd in $result.value){
 $detailbuild=Invoke-RestMethod -Method GET -Uri "$($bd.url)?api-version=2.0" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
  $detailbuild.queue=$result3
  $bdJson=$detailbuild| ConvertTo-JSON -Depth 20
  $updateDefUrl="$($bd.url)?api-version=2.0"
  Write-Host $bdJson
 $resultUpdaet= Invoke-RestMethod -Method PUT -Uri $updateDefUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -ContentType "application/json" -Body $bdJson
}

参数:-uri 'https://XXX.visualstudio.com/DefaultCollection/[project]/_apis/build/definitions?api-version=2.0&type=build' -uri3 'https://XXX.visualstudio.com/DefaultCollection/[project]/_apis/distributedtask/queues/[queueid]?api-version=3.0-preview.1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多