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

