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

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错误的常见诱因。

验证步骤

  1. 先运行Prepare Version ID阶段,确认BASEID被正确赋值。
  2. 查看Adding Test Cycle阶段的PowerShell日志,检查请求体里的versionId是不是实际的ID值,而不是$baseid。
  3. 如果还是有问题,可以先把$body输出到日志(加一行Write-Host $body),确认JSON格式完全正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 10:07:29