访问jenkins共享库代码

时间:2018-01-12 22:03:55

标签: jenkins-shared-libraries

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

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

Jenkinsfile

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

6 个答案:

答案 0 :(得分:3)

看起来唯一的办法就是将Jenkins文件中的 this 传递给var / lib.groovy并从该对象中获取

<强> Jenkinsfile

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

答案 1 :(得分:1)

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

Jenkisfile

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

乏/ lib.groovy

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

答案 2 :(得分:1)

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

在Jenkinsfile中

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 '='")
  }
}

答案 3 :(得分:1)

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

Jenkinsfile

myVar = "abc"

vars / test.groovy

String myVar = evaluate("myVar")

答案 4 :(得分:0)

对我来说,这就是可行的。

Jenkinsfile

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

因此要将环境传递到库中的类,只需在this中使用vars/yourfunc.groovy

答案 5 :(得分:0)

我最近偶然发现了这个问题,所以我要添加我的printf("%d", n);

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

print("%d\n",n);

还有src / ** / *。groovy的模板

$0.02

// var/myMethod.groovy import cool.package.Clazz def call(Map m) { m.put('env', env) m.put('steps', steps) new Clazz(m).call() } 中,使用标准方式:

// 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}")
        //...
    }
}

免责声明:我不使用Groovy,但是由于它看起来与Java类似,所以我很少使用它。同样,使用Jenkinsfile似乎也提供了非常灵活的界面的优点。

相关问题