You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建失败时创建工作项:构建期间设置的环境变量被忽略

问题:构建失败时动态设置迭代路径创建工作项无效

问题场景

我们在构建流程中通过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任务,直接在脚本中完成迭代路径获取和工作项创建:

  1. 在构建流程的末尾添加PowerShell任务,设置任务的运行条件为只有当构建失败时
  2. 脚本中先通过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:使用跨阶段输出变量(多阶段构建场景)

如果采用多阶段构建模式,可通过输出变量传递迭代路径:

  1. 在第一个阶段的PowerShell任务中,将变量标记为输出变量:
    Write-Host "##vso[task.setvariable variable=BUG_ITERATION;isOutput=true]$IterationPath"
    
  2. 在包含工作项创建步骤的阶段中,引用该跨阶段变量,格式为:
    $[stageDependencies.前置阶段名.任务名.outputs['BUG_ITERATION']]
    
  3. 确保工作项创建步骤在前置阶段完成后执行,保证变量已被正确赋值

方法3:调整变量解析时机(部分版本支持)

部分Azure DevOps版本支持修改变量的解析时机,将BUG_ITERATION的解析模式改为运行时解析而非初始化阶段解析。具体操作需参考对应版本的官方文档,旧版本可能不支持此功能。

内容的提问来源于stack exchange,提问作者Jannik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:50:38