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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问jenkins共享库代码中的环境变量相关的知识,希望对你有一定的参考价值。

当我使用新的共享库时,我无法访问任何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
...
答案

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

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

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

Jenkinsfile

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

瓦尔/ lib.groovy

def call(){
    echo ("FOO: ${FOO}")
    echo ("FOO:"+env.FOO)
}
另一答案

另一种方法是使用“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 '='")
  }
}
另一答案

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

Jenkinsfile

myVar = "abc"

瓦尔/ test.groovy

String myVar = evaluate("myVar")
另一答案

对我来说,这才有效。

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即可。

以上是关于访问jenkins共享库代码中的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

PIC和PIE

jenkins流水线共享库搭建实例

35-Jenkins-共享库应用

Gitlab+jenkins持续集成+自动化部署

Jenkins扩展共享库进阶

如果只有一个线程使用互斥锁,跨线程的共享内存会损坏吗?