Jenkins注入全局环境变量导致容器内Python执行环境变量冲突
问题:Jenkins容器环境变量冲突导致Python脚本报错
Jenkins会自动将全局环境变量注入到构建容器中,引发环境变量冲突:执行Python脚本时,脚本期望WORKSPACE环境变量指向${env.WORKSPACE}/boot_images,但实际被Jenkins注入的全局WORKSPACE(即Jenkins工作目录)覆盖,导致脚本触发路径检查报错。
Jenkinsfile 代码
stage('Build') { agent { docker { label '1.63slave' image 'linux-c4702-image' args '-u root:root' } } when { expression {params.build == 'yes'} beforeAgent true } steps { script{ sh '''#!/bin/bash cd ${env.WORKSPACE} && mv -f /home/nanopb-0.3.6-linux-x86.tar.gz ${env.WORKSPACE}/adsp_proc/ssc/tools cd ${env.WORKSPACE}/adsp_proc/ssc/tools && tar -zxvf nanopb-0.3.6-linux-x86.tar.gz cd ${env.WORKSPACE}/adsp_proc pwd python ssc/build/config_nanopb_dependency.py -f nanopb-0.3.6-linux-x86 python ./build/build.py -c sm6150 -o all -f aDSP cd ${env.WORKSPACE} && source set_env.sh cd ${env.WORKSPACE} && sh buildNonhlos.sh all cd ${env.WORKSPACE} && bitbake qti-multimedia-image cd ${env.WORKSPACE} && sh buildNonhlos.sh nonhlos ''' } } }
Python报错代码片段
#Check that boot_images folder exists, there are dependencies on this if BOOT_IMAGES_DIR not in os.environ["WORKSPACE"]: raise NameError("ERROR: buildex::setup_environment: " + \ "Build root folder 'boot_images' is missing. Please ensure this folder exist.")
解决方案
1. 在执行Python前临时覆盖环境变量
在Shell脚本中,执行Python命令前手动导出正确的WORKSPACE路径,仅在当前Shell会话生效,不会影响Jenkins全局变量:
cd ${env.WORKSPACE}/adsp_proc # 覆盖WORKSPACE为脚本需要的路径 export WORKSPACE="${env.WORKSPACE}/boot_images" python ssc/build/config_nanopb_dependency.py -f nanopb-0.3.6-linux-x86 python ./build/build.py -c sm6150 -o all -f aDSP # 后续命令若需原Jenkins工作目录,直接使用绝对路径或改回变量 cd ${env.WORKSPACE} && source set_env.sh
2. 修改Python脚本,脱离对WORKSPACE的依赖
直接在脚本中基于Jenkins注入的WORKSPACE拼接目标路径,彻底避免环境变量冲突:
import os # 基于Jenkins的WORKSPACE拼接boot_images路径 target_workspace = os.path.join(os.environ["WORKSPACE"], "boot_images") if BOOT_IMAGES_DIR not in target_workspace: raise NameError("ERROR: buildex::setup_environment: Build root folder 'boot_images' is missing. Please ensure this folder exist.")
3. 使用Jenkins withEnv 块覆盖容器内环境变量
确保withEnv块包裹在容器执行的步骤中,覆盖容器内的WORKSPACE变量:
steps { script{ withEnv(["WORKSPACE=${env.WORKSPACE}/boot_images"]) { sh '''#!/bin/bash cd ${WORKSPACE}/../adsp_proc && pwd python ssc/build/config_nanopb_dependency.py -f nanopb-0.3.6-linux-x86 python ./build/build.py -c sm6150 -o all -f aDSP # 后续命令需原Jenkins工作目录时,使用${env.WORKSPACE} cd ${env.WORKSPACE} && source set_env.sh cd ${env.WORKSPACE} && sh buildNonhlos.sh all cd ${env.WORKSPACE} && bitbake qti-multimedia-image cd ${env.WORKSPACE} && sh buildNonhlos.sh nonhlos ''' } } }
内容的提问来源于stack exchange,提问作者wenjun zeng
相关产品推荐
相关产品推荐

