VSTS发布定义Rest API PUT调用丢失环境多阶段问题求助
我之前也碰到过一模一样的情况,核心原因是这类发布定义的REST API采用全量替换式更新,而非增量更新。你只修改了变量并提交PUT请求,但没有把原有发布定义的完整结构(包括所有阶段配置)一并传入,服务器就会默认你要删除那些未在请求体中声明的阶段内容。
给你几个具体的解决步骤:
确保获取完整的发布定义结构
你提到GET接口返回的内容里没有DeployPhases,大概率是用了旧版本的API或者没指定完整字段的参数。尝试在GET请求中指定更高版本的API(比如api-version=7.1-preview.7,不同平台版本号可能有差异),或者添加includeAllProperties=true这类参数,强制接口返回所有字段,包括阶段相关的配置。如果还是获取不到,也可以通过平台的UI导出发布定义的JSON文件,对比你GET到的内容,补全缺失的部分。全量提交更新后的发布定义
拿到完整的RD结构后,只修改你需要更新的变量部分,其他所有原有字段(包括DeployPhases、环境配置等)都要原封不动保留,然后把整个完整的JSON结构作为PUT请求的Body发送。举个简化的示例:// 完整的发布定义JSON,只修改variables里的目标值 { "id": 123, "name": "你的发布定义名称", "variables": { "原有变量1": { "value": "旧值" }, "要更新的变量": { "value": "新值" } // 只改这里 }, "environments": [ { "name": "你的环境名称", "deployPhases": [ // 这里保留原有所有阶段配置,哪怕看起来没变化 { "phaseType": "AgentBasedDeployment", "name": "阶段1", // ... 其他阶段属性 } ] } ], // ... 其他所有原有字段 }单环境场景的额外注意
哪怕你的RD只有一个环境,也要确保PUT请求体里完整包含这个环境的deployPhases配置,不能因为GET接口没返回就省略——有些API默认会隐藏部分嵌套字段,但PUT时必须显式提供,否则服务器会清空这部分内容。
按照这个方式操作,应该就能既更新变量,又不会丢失任何阶段配置了。
内容的提问来源于stack exchange,提问作者Sanghamitra Samantaray

