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

Azure DevOps Server 2022无法设置看板泳道条件的问题排查

Azure DevOps Server 2022泳道配置问题

核心问题

使用Azure DevOps Server 2022,拥有团队和项目集合管理员权限,在项目>看板>设置图标>设置>泳道页面添加泳道时,看不到「添加条件」选项。已确认:

  • 服务器版本为最新版
  • 具备团队及项目集合管理员权限
  • 使用Win11最新版Edge浏览器

还遗漏了哪些排查方向?

补充信息(2023.12.21)

目前怀疑工作区域(Work Areas)是问题根源:环境中有3个工作区域,脚本URI未按该属性参数化;泳道仅在其中一个看板上配置,将工作项移至无泳道配置的其他工作区域后,脚本输出无变化。
这是否是问题来源?如何在脚本中指定目标工作区域?

脚本代码

# update-Swimlane.ps1

param (
    [Parameter(Mandatory=$true)]
    [string]$id = $null
)

$server = "devops.huhs.harvard.edu" # Azure DevOps Server名称或IP
$collection = "HUHS_IS"
$project = "TEMP-JIRA-MIGRATION"
$baseUri = "https://$server/$collection/$project/_apis/wit/wiql?api-version=7.0"
$pat = Get-Content .\rawpat.txt -Raw # 个人访问令牌
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($pat)"))

$boardUri = "https://$server/$collection/$project/_apis/work/boards/Issues?api-version=7.0"
$responseGet = Invoke-RestMethod -Uri $boardUri -Method Get -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) }
$extensionFieldName = $responseGet.fields.rowField.referenceName

$uri = "https://$server/$collection/$project/_apis/wit/workitems/$($id)?api-version=7.0"
$result = Invoke-RestMethod -Uri $uri -Method GET -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) }
$SystemBoardLane = $result.fields.'System.BoardLane'
$KanbanRowLane = $result.fields.$extensionFieldName
$tags = $result.fields.'System.Tags' -split "\s*;\s*"
$state = $result.fields.'System.State'
$newBoardLane = 'CRM'
# 仅在需要时更新(检查System.BoardLane,而非WEF_[guid]_KanbanRowLane)
if ($newBoardLane -and $newBoardLane -ne $SystemBoardLane) {
    echo "Before:" # 来自上方调用
    echo "  System.State:     $state"
    echo "  Tags:             $tags"
    echo "  System.BoardLane: $SystemBoardLane"
    echo "  KanbanRowLane:    $KanbanRowLane"
    echo ""
    echo "Changing $extensionFieldName to $newBoardLane"
    $body = @"
    [
        {
            "op": "add",
            "path": "/fields/$extensionFieldName",
            "from": null,
            "value": "$newBoardLane"
        }
    ]
"@
    $result = Invoke-RestMethod -Uri $uri -Method Patch -Body $body -ContentType "application/json-patch+json" -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) }

    echo ""
    echo "Tweaking System.State"
    # 选择当前状态之外的其他活跃状态
    if ($state -ne 'Selected for Development') { $newState = 'Selected for Development'}
    if (-not $newState -and $state -ne 'On Hold') { $newState = 'On Hold'}
    if (-not $newState -and $state -ne 'Doing') { $newState = 'Doing'}
    echo "- change to $newState"
    $body = @"
[
{
    "op": "add",
    "path": "/fields/System.State",
    "value": "$newState"
}
]
"@ 
    $result = Invoke-RestMethod -Uri $uri -Method Patch -Body $body -ContentType "application/json-patch+json" -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) }

    echo "- change back to $state"
    $body = @"
[
{
    "op": "add",
    "path": "/fields/System.State",
    "value": "$state"
}
]
"@ 
    $result = Invoke-RestMethod -Uri $uri -Method Patch -Body $body -ContentType "application/json-patch+json" -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) }
    
    echo ""
    echo "After:"
    $result = Invoke-RestMethod -Uri $uri -Method GET -Headers @{Authorization = ("Basic {0}" -f $base64AuthInfo) }
    $SystemBoardLane = $result.fields.'System.BoardLane'
    $KanbanRowLane = $result.fields.$extensionFieldName
    $tags = $result.fields.'System.Tags' -split "\s*;\s*"    
    echo "  System.State:     $state"
    echo "  Tags:             $tags"
    echo "  System.BoardLane: $SystemBoardLane"
    echo "  KanbanRowLane:    $KanbanRowLane"
    echo "  Expected lane:    $newBoardLane"
}
else {
    echo "No change needed: $SystemBoardLae and $KanbanRowLane already $newBoardLane"
}

脚本执行输出

PS F:\DevTeam\Project_Management\Projects\Jira_to_DevOps_Migration> .\update-Swimlane.ps1 12770
Before:
  System.State:     Selected for Development
  Tags:             CRM
  System.BoardLane:
  KanbanRowLane:    CRM

Changing WEF_5DD75A5340614097AADDCAFDEA91A637_Kanban.Lane to CRM

Tweaking System.State
- change to On Hold
- change back to Selected for Development

After:
  System.State:     Selected for Development
  Tags:             CRM
  System.BoardLane:
  KanbanRowLane:    CRM
  Expected lane:    CRM

问题解答

一、找不到「添加条件」选项的排查方向

  1. 看板类型限制
    Azure DevOps Server中,只有**敏捷看板(Agile)**支持条件泳道,Scrum看板默认不提供此功能。确认当前看板对应的项目流程模板是否为Agile。

  2. 团队上下文错误
    泳道配置是团队级设置,而非项目级。确保你切换到的是正确的团队上下文——即使是项目集合管理员,若当前选中的团队没有关联该看板,也无法看到完整配置选项。

  3. 泳道配置模式
    若当前泳道设置为「基于字段」模式,「添加条件」选项会被隐藏。检查看板设置中是否将泳道切换为「基于查询/条件」模式,两种模式无法同时启用。

  4. 缓存或浏览器问题
    虽然已确认浏览器版本,但可尝试:

    • 清除浏览器缓存并重启
    • 使用隐身窗口访问
    • 检查是否有浏览器扩展干扰页面加载
  5. 项目流程自定义限制
    若项目流程被自定义修改,可能移除了条件泳道的支持。通过项目设置>流程查看当前工作项类型的配置,确认是否保留了泳道字段的关联设置。

二、工作区域相关疑问解答

  1. 工作区域是否是问题来源?
    是的,工作区域(Work Areas)会影响看板的工作项范围:

    • 每个看板默认关联特定的工作区域,只有属于该区域的工作项才会显示在看板上
    • 若脚本修改的工作项不在看板关联的工作区域内,即使修改了泳道字段,看板也不会刷新显示,且脚本输出可能无变化(因为字段本身已正确设置)
  2. 如何在脚本中指定目标工作区域?

    • 获取工作区域ID:调用GET https://{server}/{collection}/{project}/_apis/wit/classificationnodes/Areas?api-version=7.0接口,获取目标工作区域的id或path。
    • 修改工作项的区域路径:在脚本的Patch请求中添加区域路径字段的更新操作,示例:
      {
          "op": "add",
          "path": "/fields/System.AreaPath",
          "value": "TEMP-JIRA-MIGRATION/目标工作区域名称"
      }
      
    • 关联看板与工作区域:若需要让看板覆盖多个工作区域,可在看板设置中调整「工作项查询」,将区域路径作为查询条件之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 23:13:17