如何在Azure Pipelines中获取工作项状态并替换XML文件变量
实现Azure Pipelines自动获取工作项状态并替换XML变量
一、获取工作项状态并设置为管道变量
通过Azure DevOps REST API获取工作项状态,再将其设置为管道变量供后续任务使用。以下分两种场景给出实现脚本:
场景1:指定特定工作项ID
如果明确目标工作项ID,可直接传入脚本:
# 配置参数 $workItemId = "1234" # 替换为目标工作项ID,也可通过管道参数传入如$(TargetWorkItemId) $orgUrl = "$(System.TeamFoundationCollectionUri)" $projectName = "$(System.TeamProject)" $token = "$(System.AccessToken)" # 构建请求头 $headers = @{ "Authorization" = "Bearer $token" "Content-Type" = "application/json" } # 调用REST API获取工作项详情 $apiUrl = "$orgUrl/$projectName/_apis/wit/workitems/$workItemId?api-version=7.1-preview.3" $workItem = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get # 提取状态并设置为管道变量 $workItemState = $workItem.fields.'System.State' Write-Host "##vso[task.setvariable variable=WorkItemState;]$workItemState"
场景2:自动获取管道关联的工作项
如果管道由提交或PR触发,可自动获取关联的工作项并提取状态:
$orgUrl = "$(System.TeamFoundationCollectionUri)" $projectName = "$(System.TeamProject)" $token = "$(System.AccessToken)" $headers = @{ "Authorization" = "Bearer $token" "Content-Type" = "application/json" } # 区分PR触发和构建触发场景 if ("$(System.PullRequest.PullRequestId)" -ne "") { # PR触发:直接获取关联的工作项ID列表 $workItemIds = "$(System.PullRequest.WorkItemIds)" -split "," } else { # 构建触发:获取当前构建关联的工作项 $buildId = "$(Build.BuildId)" $apiUrl = "$orgUrl/$projectName/_apis/build/builds/$buildId/workitems?api-version=7.1-preview.3" $relatedWorkItems = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get $workItemIds = $relatedWorkItems.value.id } # 提取第一个关联工作项的状态(可根据需求调整逻辑) if ($workItemIds.Count -gt 0) { $workItemId = $workItemIds[0] $apiUrl = "$orgUrl/$projectName/_apis/wit/workitems/$workItemId?api-version=7.1-preview.3" $workItem = Invoke-RestMethod -Uri $apiUrl -Headers $headers -Method Get $workItemState = $workItem.fields.'System.State' Write-Host "##vso[task.setvariable variable=WorkItemState;]$workItemState" } else { Write-Warning "未找到与当前管道关联的工作项" }
二、替换XML文件中的对应变量
假设XML文件中存在占位符(比如<WorkItemState>WORK_ITEM_STATE_PLACEHOLDER</WorkItemState>),可通过PowerShell脚本将其替换为上面获取的WorkItemState变量值:
# 配置路径和占位符 $xmlFilePath = "./path/to/your/config.xml" # 替换为实际XML文件路径 $placeholder = "WORK_ITEM_STATE_PLACEHOLDER" # 替换为XML中的实际占位符 # 读取并替换内容 $xmlContent = Get-Content $xmlFilePath -Raw $updatedContent = $xmlContent -replace $placeholder, "$(WorkItemState)" # 写回XML文件 Set-Content $xmlFilePath -Value $updatedContent -Encoding UTF8
注意事项
- 确保管道使用的
System.AccessToken拥有读取工作项的权限(默认情况下,管道服务账号已具备该权限)。 - 如果XML中的占位符是类似
$(WorkItemState)的格式,需转义正则表达式特殊字符,替换逻辑改为:$xmlContent -replace '\$\(WorkItemState\)', "$(WorkItemState)"。
内容的提问来源于stack exchange,提问作者priya
相关产品推荐
相关产品推荐

