如何在Groovy编写的Global Pipeline Libraries中获取Jenkins环境变量
问题原因
你在共享库自定义类中拿到null是因为自定义Groovy类默认不会自动注入Jenkins流水线的上下文对象,env、steps这些流水线专属对象都需要你主动传入才能访问。
解决方案
方案1:类初始化时传入流水线上下文(推荐,适配面向对象开发场景)
这是最常用的兼容方案,2.303.1版本完全支持:
- 首先在你自定义的类中定义接收上下文的构造方法,示例代码如下:
// 共享库src路径下的类文件:src/com/xxx/MyPipeline.groovy package com.xxx // 必须实现Serializable接口,避免流水线序列化报错 class MyPipeline implements Serializable { // 存储传入的流水线上下文 private def pipeline // 构造方法接收上下文对象 MyPipeline(def pipeline) { this.pipeline = pipeline } void getEnvInfo() { // 所有环境变量通过pipeline.env访问,注意环境变量名全大写 println "构建ID:${pipeline.env.BUILD_ID}" println "构建编号:${pipeline.env.BUILD_NUMBER}" println "任务名称:${pipeline.env.JOB_NAME}" println "工作空间路径:${pipeline.env.WORKSPACE}" } }
- 在Jenkinsfile中初始化类的时候,把当前流水线的上下文(也就是
this)传入即可:
// Jenkinsfile调用示例 @Library('你的共享库名称') _ import com.xxx.MyPipeline pipeline { agent any stages { stage('测试环境变量获取') { steps { script { // 初始化时传入this作为上下文 def myPipeline = new MyPipeline(this) myPipeline.getEnvInfo() } } } } }
方案2:使用vars目录下的全局步骤
如果你不需要复杂的面向对象封装,只是写公共步骤,可以直接把脚本放在共享库的vars目录下,这类脚本默认已经注入了env对象,直接访问即可:
// 共享库vars路径下的文件:vars/printEnv.groovy def call() { // 直接访问env即可,不需要额外传参 println "工作空间:${env.WORKSPACE}" println "构建编号:${env.BUILD_NUMBER}" }
在Jenkinsfile中直接调用printEnv()就可以正常输出环境变量。
注意事项
- Jenkins内置环境变量名称都是全大写格式,不要写小写或者混合大小写,否则会返回
null - 不要在自定义类的构造方法、静态代码块中访问环境变量,要在实际执行的类方法中访问,避免上下文未完成加载导致取值为空
- 自定义类必须实现
Serializable接口,否则Jenkins流水线暂停重启时会出现序列化异常
内容的提问来源于stack exchange,提问作者White
相关产品推荐
相关产品推荐

