当我使用新的共享库时,我无法访问任何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
...
答案 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
似乎也提供了非常灵活的界面的优点。