在 Jenkins Pipeline 中配置环境变量传递参数,最推荐的方式是在 Declarative Pipeline 中使用 parameters 块定义构建参数,并通过 environment 块或 withEnv 指令注入环境变量。
先说结论:参数化构建适合需要动态调整分支、环境或配置的场景,通过 parameters 定义输入,environment 定义上下文。
- 适合:Declarative Pipeline 结构,需要用户交互或动态值的构建任务
- 先看:parameters 块定义参数类型,environment 块定义变量作用域
- 建议:敏感信息使用 password 类型参数或 Jenkins 凭据管理,避免硬编码
命令速用版
pipeline {
agent any
parameters {
string(name: 'DEPLOY_ENV', defaultValue: 'dev', description: '部署环境')
}
environment {
MY_ENV = "${params.DEPLOY_ENV}"
}
stages {
stage('Build') {
steps {
sh 'echo $MY_ENV'
}
}
}
}为什么会这样
Jenkins Pipeline 区分 Groovy 变量、Pipeline 参数和操作系统环境变量,混用会导致脚本无法读取。
parameters 块定义的变量存储在 params 对象中,仅在 Groovy 上下文直接可用。environment 块定义的变量注入到执行环境,Shell 或 Python 脚本可通过标准环境变量方式读取。def 定义的变量仅是 Groovy 局部变量,无法传递给子进程。
分步处理
第一步:在 Jenkinsfile 顶层定义 parameters 块,声明需要用户输入或动态指定的参数。
第二步:使用 environment 块将 params 参数赋值给环境变量,确保子进程可见。
第三步:在 steps 中使用 sh 或 bat 步骤,通过 $VAR 或 %VAR% 语法引用环境变量。
第四步:若需在 Python 脚本中读取,使用 os.environ 获取对应键值。
怎么验证是否生效
在 Pipeline 步骤中添加 sh 'printenv' 命令,检查输出日志中是否包含自定义变量名及其值。
使用 echo ${params.VAR_NAME} 在 Groovy 插值中打印参数值,确认参数已正确传递到 Pipeline 上下文。
常见坑
环境变量作用域受限:environment 块定义在 stage 内时,仅该 stage 可见,全局变量需定义在 pipeline 层级。
Shell 脚本解析差异:Windows bat 脚本使用 %VAR% 读取环境变量,Linux sh 脚本使用 $VAR,混用会导致获取为空。
def 变量无法传递:使用 def 定义的变量仅在 Groovy 脚本内有效,无法传递给 sh 或 Python 脚本执行。
常见问题
如何在 Python 脚本中获取 Jenkins 参数?
通过 os.environ['VAR_NAME'] 读取,前提是 Jenkins Pipeline 已通过 environment 或 withEnv 将该参数注入环境变量。
password 类型参数会明文显示吗?
不会,password 类型参数在 Jenkins 界面输入时隐藏,且在构建日志中自动掩码,适合传递敏感信息。
params 和 env 对象有什么区别?
params 用于访问 parameters 块定义的构建参数,env 用于访问 environment 块定义的环境变量或系统内置变量。
参考来源
- jenkins pipeline 执行 python 脚本并传递参数及设置环境变量
- Jenkins 环境变量终极指南:灵活配置多环境部署参数
- Jenkins Pipeline 参数传递与动态构建实践
- Jenkins 全链路教程——Jenkins Pipeline 参数化构建
- jenkins 变量传递 jenkins pipeline 变量