如何在Azure DevOps Pipeline任务中运行WIQL查询?Linux代理Shell示例
在Linux代理的Azure DevOps Pipeline中用Shell调用REST API查询工作项
核心结论
完全可以用Shell(如Bash)替代PowerShell在Linux代理上实现工作项查询,无需依赖PowerShell环境。
实现步骤与示例
1. 配置Pipeline权限与变量
Pipeline运行时可使用内置的System.AccessToken临时令牌,它默认具备对应项目的工作项访问权限(前提是Pipeline所属服务账号有读取权限)。需在YAML中传递该变量:
steps: - bash: | # 后续Shell脚本内容 env: AZURE_DEVOPS_TOKEN: $(System.AccessToken)
2. WIQL查询的Shell脚本示例
以下是完整Bash脚本,用于查询项目中状态为"Active"的用户故事:
#!/bin/bash # 替换为你的组织和项目名 ORGANIZATION="your-org-name" PROJECT="your-project-name" # 定义WIQL查询语句 WIQL_QUERY="SELECT [System.Id], [System.Title], [System.State] FROM WorkItems WHERE [System.WorkItemType] = 'User Story' AND [System.State] = 'Active'" # 调用Azure DevOps REST API RESPONSE=$(curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Basic $(echo -n ":$AZURE_DEVOPS_TOKEN" | base64)" \ "https://dev.azure.com/$ORGANIZATION/$PROJECT/_apis/wit/wiql?api-version=7.1-preview.2" \ -d "{\"query\": \"$WIQL_QUERY\"}") # 解析并格式化输出结果 echo "=== 活跃用户故事查询结果 ===" echo "$RESPONSE" | jq -r '.workItems[] | "ID: \(.id) | 标题: \(.url | split("/")[-1])"'
3. 完整Pipeline YAML示例
将脚本整合到Pipeline中:
trigger: - main pool: vmImage: 'ubuntu-latest' # Linux代理环境 steps: - bash: | ORGANIZATION="your-org-name" PROJECT="your-project-name" WIQL_QUERY="SELECT [System.Id], [System.Title], [System.State] FROM WorkItems WHERE [System.WorkItemType] = 'User Story' AND [System.State] = 'Active'" RESPONSE=$(curl -s -X POST \ -H "Content-Type: application/json" \ -H "Authorization: Basic $(echo -n ":$AZURE_DEVOPS_TOKEN" | base64)" \ "https://dev.azure.com/$ORGANIZATION/$PROJECT/_apis/wit/wiql?api-version=7.1-preview.2" \ -d "{\"query\": \"$WIQL_QUERY\"}") echo "=== 查询结果 ===" echo "$RESPONSE" | jq '.workItems[]' env: AZURE_DEVOPS_TOKEN: $(System.AccessToken) displayName: 'Shell脚本查询工作项'
关键注意事项
- 权限验证:确保Pipeline服务账号(通常为Project Collection Build Service)拥有工作项读取权限,否则会返回403错误。
- jq工具依赖:Linux代理默认预装
jq用于JSON解析,若为自定义代理,需先执行apt-get install jq安装。 - API版本:示例使用预览版
7.1-preview.2,可替换为稳定版(如7.0)。 - 令牌编码:Basic认证需将
:+令牌做base64编码,因Azure DevOps允许用户名留空,前缀为冒号。
内容的提问来源于stack exchange,提问作者Stack_IQ
相关产品推荐
相关产品推荐

