7

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

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

詹金斯文件

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
...
4

6 回答 6

9

看起来处理这个问题的唯一方法是将这个从 Jenkins 文件传递​​到 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 类

MyClass(def script) {
  throw new Exception("FOO=${script.env.FOO}")
}
于 2018-01-12T22:12:21.620 回答
3

我相信您可以如下填充共享库可以访问的环境变量。

詹基斯档案

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

变量/lib.groovy

def call(){
    echo ("FOO: ${FOO}")
    echo ("FOO:"+env.FOO)
}
于 2018-04-17T12:01:27.503 回答
2

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

在 Jenkinsfile 中

mypackages.myclass.mymethod(steps)

在源代码中

class myclass implements Serializable {
  void mymethod(steps) {
    String myEnvVar = steps.sh(returnStdout: true, script: "env | grep 'myVar' | cut -f 2- -d '='")
  }
}
于 2018-04-23T22:35:53.027 回答
1

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

詹金斯文件

myVar = "abc"

变量/test.groovy

String myVar = evaluate("myVar")
于 2018-09-19T01:30:06.407 回答
1

对我来说,这很有效。

詹金斯文件

@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)
}

因此,要将环境传递给库中的类,只需thisvars/yourfunc.groovy.

于 2019-04-04T12:21:31.567 回答
1

我最近偶然发现了这个问题,所以我要添加我的$0.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似乎提供了相当灵活的界面的优势。

于 2019-10-06T18:02:49.487 回答