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

Jenkins Groovy读取工作区JSON文件配置及运行报错排查

问题根因
  • 变量作用域错误:releasePackages定义在前置阶段的script闭包内部,属于局部变量,后续Prepare Variable阶段无法访问该变量,直接触发空指针/变量未定义错误。
  • 文件路径写法错误:Git拉取时通过RelativeTargetDirectory指定代码存放在repo2子目录,但readJSON读取时的路径未拼接repo2前缀,且使用了不稳定的相对路径,跨阶段执行时工作目录偏移会直接导致找不到目标JSON文件。
  • 语法结构错误:现有代码闭括号对齐混乱,阶段、步骤的闭包层级不匹配,Pipeline本身存在语法校验错误。
  • Windows命令路径不规范:后续bat步骤大量使用..\相对路径跳转父目录,未基于固定根路径拼接,执行时极易出现找不到源文件/目标目录的问题。
修复方案
  1. 提前声明跨阶段访问的变量
    在Pipeline顶层定义需要跨stage使用的变量,解决作用域问题,所有用到的自定义变量(如repo2、输出目录名、构建模式变量等)必须在使用前完成赋值。
  2. 使用Jenkins内置环境变量固定路径根
    统一通过${env.WORKSPACE}获取当前任务工作区的绝对路径,所有文件操作、命令执行的路径都基于该绝对路径拼接,禁止随意使用..跳转父目录,避免工作目录偏移导致的路径错误。
  3. 增加路径校验逻辑
    读取JSON文件前先判断文件是否存在,提前抛出明确错误信息降低排错成本。
  4. 对齐Pipeline闭包层级,修正语法结构。
修正后核心代码示例
pipeline {
    agent any
    // 提前声明跨阶段全局变量
    def releasePackages = null
    // 替换为你实际的repo2赋值,其余自定义变量同理提前定义/赋值
    def repo2 = "your-code-target-dir"

    stages {
        stage('Prepare Artifacts') {
            steps {
                script {
                    checkout scm: [
                        $class: 'GitSCM',
                        branches: [[name: "FETCH_HEAD"]],
                        extensions: [
                            [$class: 'RelativeTargetDirectory',
                                relativeTargetDir: repo2],
                            [$class: 'WipeWorkspace'],
                            [$class: 'CloneOption',
                                depth: 1,
                                noTags: true,
                                reference: '',
                                shallow: true,
                                honorRefspec: true],
                            [$class: 'CheckoutOption',
                                timeout: 30]],
                        gitTool: 'Default',
                        submoduleCfg: [],
                        userRemoteConfigs: [
                            [credentialsId: 'JENKINS_LOGIN']
                        ]
                    ]
                    // 基于工作区绝对路径拼接JSON文件完整路径,删除原路径多余的双斜杠
                    def jsonConfigPath = "${env.WORKSPACE}/${repo2}/BuildAutomation/Jenkins/Pipeline/files/release_package.json"
                    echo "Reading release config from: ${jsonConfigPath}"
                    // 增加文件存在校验
                    if (!fileExists(jsonConfigPath)) {
                        error("Release config file not found, checked path: ${jsonConfigPath}")
                    }
                    releasePackages = readJSON file: jsonConfigPath
                    println releasePackages
                }
            }
        }

        stage('Prepare Variable') {
            steps {
                script{
                    // 统一拼接绝对路径,禁止使用..\相对跳转
                    def calSourceBase = "${env.WORKSPACE}/CALReleaseOutput"
                    def indiaTargetBase = "${env.WORKSPACE}/${IndiaReleaseOutputFolder}"
                    def russiaTargetBase = "${env.WORKSPACE}/${RussiaReleaseOutputFolder}"
                    def b2bSourceDir = "${env.WORKSPACE}/${b2bReleaseOutputFolder}"
                    def b2bZipTarget = "${env.WORKSPACE}/CALReleaseOutput_${tagFoldername}_B2B.zip"

                    // 路径加双引号兼容带空格的目录名
                    for(file in releasePackages[buildMod]['India']) {
                        bat("xcopy \"${calSourceBase}\\${file}\" \"${indiaTargetBase}\\${file}\" /I /E /Y")
                    }

                    for(file in releasePackages[buildMod]['Russia']) {
                        bat("xcopy \"${calSourceBase}\\${file}\" \"${russiaTargetBase}\\${file}\" /I /E /Y")
                    }
                            
                    zip archive: false, dir: b2bSourceDir, glob: '', zipFile: b2bZipTarget
                }
            }
        }
    }
}
额外注意事项
  • Windows批处理命令中,路径包含空格时必须用双引号包裹,否则xcopy等命令会将路径按空格拆分识别为多个参数,触发执行错误。
  • 如果任务运行在分布式节点上,${env.WORKSPACE}会自动适配对应节点的工作区路径,不要写死磁盘盘符的绝对路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:54:22