在 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
似乎具有相当灵活的界面优势。
当我使用我的新共享库时,我无法访问任何 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
似乎具有相当灵活的界面优势。