Jenkinsfile传递VersionId至PowerShell遇406错误求助
解决Jenkins Pipeline中PowerShell脚本无法正确使用baseid变量导致406错误的问题
我帮你排查了下,你遇到的406错误主要是两个核心问题导致的:变量没有被正确注入到PowerShell脚本中,加上请求头和JSON格式的小疏漏。咱们一步步来解决:
核心问题分析
你在echo baseid里能看到正确值,但PowerShell脚本里的$baseid根本没被替换成实际值——因为你用了单引号'''包裹PowerShell代码,Groovy会把这部分当成纯字符串,不会解析里面的Groovy变量。服务器收到的请求体里versionId是"$baseid"这个无效值,再加上可能缺了必要的请求头,直接返回了406。
修复方案
1. 规范变量传递(用环境变量更可靠)
先把baseid放到Pipeline的环境变量里,这样在任何stage都能方便调用,也避免Groovy和PowerShell的变量冲突。修改后的完整Pipeline代码如下:
def config = "Release" pipeline { agent none parameters { string(name: 'SPRINT_NUMBER', defaultValue: '9959') string(name: 'RELEASE_NUMBER', defaultValue: '60') string(name: 'CYCLE_NAME', defaultValue: '60') } // 定义全局环境变量存储versionId environment { BASEID = '' } stages { // 新增准备阶段读取JSON并赋值给环境变量 stage('Prepare Version ID') { agent any steps { script { def vid = readJSON file: 'E:/Jenkins/workspace/27-investigate-process/script.json' BASEID = vid.id.toString() // 直接转字符串更稳妥 echo "Got Version ID: ${BASEID}" } } } stage('Windows') { agent { node { label "csharp.is.avb.com" customWorkspace "E:/Jenkins/ws/${env.BRANCH_NAME}".take(30) } } stages { stage("Adding Test Cycle") { steps { echo "Using Version ID: ${BASEID}" // 用双引号"""包裹PowerShell脚本,让Groovy能解析变量 powershell label: '', script: """ \$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" \$headers.Add("Content-Type", "application/json") // 必须添加Accept头,告诉服务器我们接受JSON响应 \$headers.Add("Accept", "application/json") \$headers.Add("Authorization", "Basic E6WnlreEA5NDA5NTAyMzIy") \$headers.Add("Cookie", "JSESSIONID=D2C7FAFF013B856E8803F; atlassian.xsrf.token=B5DX-9S26-JQRI-OYXfd11236e12a575063_lin; sto-id=BHM") // 用PowerShell哈希表生成JSON,避免手动拼接的转义错误 \$body = @{ clonedCycleId = "" name = "Official-\${env:CYCLE_NAME}" build = "" environment = "" description = "Create cycle with sprint" startDate = "4/Dec/19" endDate = "30/Dec/20" projectId = "128" versionId = "\${env:BASEID}" } | ConvertTo-Json \$response = Invoke-RestMethod 'https://jira.it.avb.com/rest/zapi/latest/cycle' -Method 'POST' -Headers \$headers -Body \$body \$response | ConvertTo-Json """ } } } } } }
2. 关键修改点说明
- 环境变量传递:把
baseid放到environment块里,PowerShell中用${env:BASEID}调用,避免了Groovy和PowerShell的变量解析冲突。 - 脚本字符串包裹:用
"""代替'''包裹PowerShell代码,同时把PowerShell里的$转义成\$,防止Groovy误解析。 - 自动生成JSON:用PowerShell的哈希表+
ConvertTo-Json生成请求体,彻底避免手动拼接JSON时的转义错误(比如双引号漏转、格式不合法)。 - 添加Accept头:很多REST API要求明确指定
Accept: application/json,否则服务器不知道该返回什么格式的响应,这也是406错误的常见诱因。
验证步骤
- 先运行
Prepare Version ID阶段,确认BASEID被正确赋值。 - 查看
Adding Test Cycle阶段的PowerShell日志,检查请求体里的versionId是不是实际的ID值,而不是$baseid。 - 如果还是有问题,可以先把
$body输出到日志(加一行Write-Host $body),确认JSON格式完全正确。
内容的提问来源于stack exchange,提问作者Jforpython
相关产品推荐
相关产品推荐

