构建失败时创建工作项:构建期间设置的环境变量被忽略
问题:构建失败时动态设置迭代路径创建工作项无效
问题场景
我们在构建流程中通过PowerShell脚本获取当前迭代路径,期望在构建失败时使用该路径创建工作项。脚本代码如下:
try { $Uri = "https://.../" + "_apis/work/TeamSettings/Iterations?`$timeframe=current&api-version=3.0" Write-Host $Uri $Response = Invoke-RestMethod -Method Get -UseDefaultCredentials -ContentType application/json -Uri $Uri $IterationPath = $Response.value.path Write-Host $IterationPath Write-Host "##vso[task.setvariable variable=BUG_ITERATION]$IterationPath" } catch [Exception] { $ErrorMessage = $_.Exception.Message Write-Warning "Cannot read iteration. $ErrorMessage" return "99" }
在构建配置中引用BUG_ITERATION变量后,构建持续失败,报错信息为:
##[warning]Failed to create work item for build failure: TF401346: Invalid Area/Iteration id given for work item -1, field 'System.IterationId'.
经测试确认:构建在初始化阶段就完成了变量解析,后续构建过程中对变量的修改无法生效——硬编码迭代路径时可正常创建工作项。
解决办法
方法1:改用构建失败触发的自定义脚本创建工作项
放弃使用内置的构建失败自动创建工作项功能,改为添加一个仅在构建失败时运行的PowerShell任务,直接在脚本中完成迭代路径获取和工作项创建:
- 在构建流程的末尾添加PowerShell任务,设置任务的运行条件为
只有当构建失败时 - 脚本中先通过Azure DevOps API获取当前迭代路径,再调用工作项创建API完成操作,全程无需依赖预解析变量
示例脚本片段:
# 获取当前迭代路径 $iterationUri = "https://dev.azure.com/[组织名]/[项目名]/_apis/work/TeamSettings/Iterations?`$timeframe=current&api-version=7.1-preview.3" $iterationResp = Invoke-RestMethod -Uri $iterationUri -Method Get -UseDefaultCredentials $targetIterationPath = $iterationResp.value.path # 构建工作项创建请求体 $workItemUri = "https://dev.azure.com/[组织名]/[项目名]/_apis/wit/workitems/$`Bug?api-version=7.1-preview.3" $requestBody = @( @{ op = "add" path = "/fields/System.Title" value = "构建失败:$(Build.DefinitionName) - 版本$(Build.BuildNumber)" }, @{ op = "add" path = "/fields/System.IterationPath" value = $targetIterationPath }, @{ op = "add" path = "/fields/System.Description" value = "构建失败详情:$(Build.BuildUri)" } ) | ConvertTo-Json # 发送请求创建工作项 Invoke-RestMethod -Uri $workItemUri -Method Post -UseDefaultCredentials -ContentType "application/json-patch+json" -Body $requestBody
方法2:使用跨阶段输出变量(多阶段构建场景)
如果采用多阶段构建模式,可通过输出变量传递迭代路径:
- 在第一个阶段的PowerShell任务中,将变量标记为输出变量:
Write-Host "##vso[task.setvariable variable=BUG_ITERATION;isOutput=true]$IterationPath" - 在包含工作项创建步骤的阶段中,引用该跨阶段变量,格式为:
$[stageDependencies.前置阶段名.任务名.outputs['BUG_ITERATION']] - 确保工作项创建步骤在前置阶段完成后执行,保证变量已被正确赋值
方法3:调整变量解析时机(部分版本支持)
部分Azure DevOps版本支持修改变量的解析时机,将BUG_ITERATION的解析模式改为运行时解析而非初始化阶段解析。具体操作需参考对应版本的官方文档,旧版本可能不支持此功能。
内容的提问来源于stack exchange,提问作者Jannik
相关产品推荐
相关产品推荐

