使用Post方法修改TFS 2017构建嵌套变量时遇错求助
解决TFS 2017构建变量修改的Post请求错误问题
首先,咱们先理清楚你遇到的问题根源:你现在的请求体只传递了Variables部分,但TFS 2017的构建定义更新API(如果是修改定义默认变量的话)需要完整的构建定义对象,缺少Repository这类必填字段就会触发你看到的Value cannot be null错误。
先明确你的需求方向:
情况1:只是排队新构建时临时用新变量值(你已经会的方法)
如果只是想在每次排队构建时覆盖BuildVersion的值,你之前用POST /_apis/build/builds的方法是对的,但要注意API字段的大小写(TFS API区分大小写,你之前写的Variables应该是小写的variables),正确的请求体示例:
{ "definition": { "id": 你的构建定义ID }, "variables": { "BuildVersion": { "value": "你的新值", "allowOverride": true } } }
这个方法不需要修改构建定义的默认值,只是临时覆盖,适合单次构建的需求。
情况2:修改构建定义的默认变量值(让后续所有新构建都用这个值)
因为TFS 2017不支持PATCH方法部分更新构建定义,所以必须用PUT方法传递完整的定义内容,步骤如下:
- 获取完整的构建定义
调用GET API:
把返回的完整JSON保存下来,这包含了构建定义的所有配置(包括Repository、Triggers、Steps等核心内容)。GET /_apis/build/definitions/{你的构建定义ID}?api-version=2.3 - 修改变量值
在保存的JSON里找到variables节点下的BuildVersion,修改它的value字段为你想要的新值,其他所有字段保持原样不要改动。 - 用PUT方法更新定义
调用PUT API:
请求体就是你修改后的完整JSON内容,这样就能成功更新默认变量值了。PUT /_apis/build/definitions/{你的构建定义ID}?api-version=2.3
为什么你的原请求会报错?
你之前的请求体只传了Variables部分,TFS API会把这个当作完整的构建定义来处理,但缺少了definition.Repository这类必填配置项,所以就抛出了参数为空的错误。TFS 2017的构建定义更新不支持只传递修改的部分,必须提供完整的定义对象。
另外补充一点:如果你的需求是修改已经排队/正在运行的构建的变量值,很遗憾,TFS 2017并不支持这个操作——一旦构建排队完成,变量就固定了,只能取消当前构建,重新排队并指定新的变量值。
内容的提问来源于stack exchange,提问作者SomewhatStudent
相关产品推荐
相关产品推荐

