You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Groovy编写的Global Pipeline Libraries中获取Jenkins环境变量

问题原因

你在共享库自定义类中拿到null是因为自定义Groovy类默认不会自动注入Jenkins流水线的上下文对象,env、steps这些流水线专属对象都需要你主动传入才能访问。

解决方案

方案1:类初始化时传入流水线上下文(推荐,适配面向对象开发场景)

这是最常用的兼容方案,2.303.1版本完全支持:

  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}"
    }
}
  1. 在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()就可以正常输出环境变量。

注意事项

  1. Jenkins内置环境变量名称都是全大写格式,不要写小写或者混合大小写,否则会返回null
  2. 不要在自定义类的构造方法、静态代码块中访问环境变量,要在实际执行的类方法中访问,避免上下文未完成加载导致取值为空
  3. 自定义类必须实现Serializable接口,否则Jenkins流水线暂停重启时会出现序列化异常

内容的提问来源于stack exchange,提问作者White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 10:24:04