Jenkins Pipeline变量声明报ProxyException缺失属性如何解决
报错根因
这个报错是Jenkins Pipeline Groovy的变量作用域规则导致的:
- 代码中在
script {}块内部用def关键字声明的INSTALL_IMAGE_ARGS、IMAGE_FILE_VAR都属于块级局部变量,作用域仅局限在当前script {}包裹的代码范围内,出块后变量就会被回收无法访问 - 原代码中调用
build步骤的位置在script {}块外部,无法访问块内定义的局部变量,因此Groovy抛出找不到属性的异常。
修复方法
有两种符合Pipeline语法规则的写法,可按需选择:
写法1:将依赖局部变量的步骤移入script块(工程实践优先推荐)
直接把build步骤放到定义变量的script块内部,保证所有变量访问都在同一个作用域里,变量作用域收敛不会出现意外覆写问题,修正后的阶段代码如下:
stage ("install_new_image") { when { expression {IMAGE_FILE_PATH_VAR} } steps { script { def IMAGE_FILE_VAR = IMAGE_FILE_PATH_VAR.split('/').last() def INSTALL_IMAGE_ARGS = "./job_files/image_upload_job.py --testbed-file ${TESTBED_FILE} --image_file ${IMAGE_FILE_VAR} --mail-to ${MAIL_TO_VAR}" echo "args for install_new_image= ${INSTALL_IMAGE_ARGS}" // build步骤移入script块,可直接访问上方定义的局部变量 build job: "/team_eng_ent_routing/Helper_Projects/PYATS_JOB_EXECUTOR", parameters: [ string(name: "pyats_job_args", value: INSTALL_IMAGE_ARGS), string(name: "branch_name", value: BRANCH_NAME_VAR), string(name: "platform_name", value: PLATFORM_NAME_VAR) ] } } }
写法2:调整变量声明方式扩大作用域
如果确实需要在script块外部访问变量,声明变量时去掉def关键字即可——去掉def后变量会绑定到Pipeline脚本的全局上下文,整个stage的steps块都能访问,修正代码如下:
stage ("install_new_image") { when { expression {IMAGE_FILE_PATH_VAR} } steps { script { // 去掉def关键字,变量升级为脚本级可访问属性 IMAGE_FILE_VAR = IMAGE_FILE_PATH_VAR.split('/').last() INSTALL_IMAGE_ARGS = "./job_files/image_upload_job.py --testbed-file ${TESTBED_FILE} --image_file ${IMAGE_FILE_VAR} --mail-to ${MAIL_TO_VAR}" echo "args for install_new_image= ${INSTALL_IMAGE_ARGS}" } // script块外可正常访问变量 build job: "/team_eng_ent_routing/Helper_Projects/PYATS_JOB_EXECUTOR", parameters: [ string(name: "pyats_job_args", value: INSTALL_IMAGE_ARGS), string(name: "branch_name", value: BRANCH_NAME_VAR), string(name: "platform_name", value: PLATFORM_NAME_VAR) ] } }
注意:非必要不使用第二种全局变量写法,跨块的全局变量容易出现命名冲突、被其他步骤意外覆写的问题,提升后续维护成本。
内容的提问来源于stack exchange,提问作者Akshay J
相关产品推荐
相关产品推荐

