在 jenkins 共享库代码中访问环境变量

access environment variables in jenkins shared library code

当我使用我的新共享库时,我无法访问任何 src class 的环境变量,它由 Jenkinsfile 直接执行或通过 var/*.groovy 脚本执行。即使我将 withEnv 添加到 var/*groovy 脚本中,这个问题仍然存在。

让环境变量传播到 jenkins 共享库 src class 执行的技巧是什么?

詹金斯文件

withEnv(["FOO=BAR2"]) {
  println "Jenkinsfile FOO=${FOO}"
  library 'my-shared-jenkins-library'
  lib.displayEnv()

共享库var/lib.groovy

def displayEnv() {
  println "Shared lib var/lib FOO=${FOO}"
  MyClass c = new MyClass()
}

共享库src/MyClass.groovy

class MyClass() {
  MyClass() {
    throw new Exception("Shared lib src/MyClass  FOO=${System.getenv('FOO')")
  }
}

** 运行 结果 **

Jenkinsfile FOO=BAR
Shared lib var/lib FOO=BAR
java.lang.Exception: Shared lib src/MyClass FOO=null
...

看来处理这个问题的唯一方法是将 Jenkins 文件中的 this 传递到 var/lib.groovy 并从中获取那个物体

詹金斯文件

withEnv(["FOO=BAR2"]) {
  library 'my-shared-jenkins-library'
  lib.displayEnv(this)

var/lib.groovy

def displayEnv(script) {
 println "Shared lib var/lib FOO=${FOO}"
 MyClass c = new MyClass(script)

}

src class

MyClass(def script) {
  throw new Exception("FOO=${script.env.FOO}")
}

我相信你可以如下填充环境变量,其中共享库可以访问。

Jenkis 文件

env.FOO="BAR2"
library 'my-shared-jenkins-library'
lib()

vars/lib.groovy

def call(){
    echo ("FOO: ${FOO}")
    echo ("FOO:"+env.FOO)
}

另一种方法是使用 "steps" 变量:

在詹金斯文件中

mypackages.myclass.mymethod(steps)

在 src

class myclass implements Serializable {
  void mymethod(steps) {
    String myEnvVar = steps.sh(returnStdout: true, script: "env | grep 'myVar' | cut -f 2- -d '='")
  }
}

不确定专家会如何评价该解决方案,但我能够使用评估从共享库访问我的 Jenkinsfile 中定义的变量。

詹金斯文件

myVar = "abc"

vars/test.groovy

String myVar = evaluate("myVar")

对我来说这很管用。

詹金斯文件:

@Library('jenkins-library') _
pipeline {
    agent any
    environment {
        FOO = 'bar'
    }
    stages {
        stage('Build') {
            steps {
                script {
                    buildImage()
...

图书馆vars/buildImage.groovy:


def call() {
    println(this.env.FOO)
    println(env.FOO)
}

所以要将环境传递给库中的 class,只需在 vars/yourfunc.groovy 中使用 this

我最近偶然发现了这个问题,所以我要添加我的 [=13=].02

我用于 var/*.groovy 的基本模板是:

// var/myMethod.groovy
import cool.package.Clazz

def call(Map m) {
    m.put('env', env)
    m.put('steps', steps)
    new Clazz(m).call()
}

以及 src/**/* 的模板。groovy

// src/cool/package/Clazz.groovy
class Clazz {
    private String cool_field_1 = "default-value-1"
    private int cool_value = 42

    def env
    def steps

    def call() {
        steps.echo("env.BUILD_TAG: ${env.BUILD_TAG}")
        //...
    }
}

Jenkinsfile中使用标准方式:

@Library('mylib@mybranch')

pipeline {
    stages {
       stage('St 1') {
           steps { myMethod('cool_value': 43) }
       }
    }
}

免责声明:我不做 Groovy 但因为它看起来类似于 Java 我可以很少使用它。同样使用 Map 似乎具有相当灵活的界面优势。