在 Jenkins 管道中成功加载 env 变量,但在管道用作共享库时却没有
Load env variables successfully in Jenkins pipeline but not while the pipeline was used as shared library
在我的声明性詹金斯管道代码的一个阶段,它执行一个 bash 脚本(sh '''./a.sh'''
,脚本 "a.sh" 在外部维护) - 在该脚本中, "jarVersion" 的值是注入 ${WORKSPACE}/.jarVersion (echo "jarVersion=${jarVersion}" > ${WORKSPACE}/.jarVersion
)。在后期,我们需要获取 jarVersion 的值。我们使用 load "${WORKSPACE}/.jarVersion"
和 ${jarVersion}
来获取值。当我们在管道脚本中这样做时它会起作用。
但是,当我们将此管道设置为共享库(将其放入/vars/testSuite.groovy
)并在另一个管道脚本中调用它时。它无法识别 var ${jarVersion}
.
请指教如何解决这个问题。一个常见的问题是:如何将脚本中的值从阶段 A 传递到阶段 B?
stage('getJarVersion'){
steps{
script{
load "${WORKSPACE}/.jarVersion"
currentBuild.description = "jarVersion:${jarVersion}"
}
}
}
我希望它能像在管道脚本中一样工作。
但它显示:
groovy.lang.MissingPropertyException: No such property: jarVersion for class: testSuite
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:34)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
at testSuite.call(/jenkins/jobs/TestSuite1/builds/11/libs/pipelineUtilities/vars/testSuite.groovy:84)
对于同一 groovy 文件下的阶段,您必须在阶段块之外和节点块之前声明 object。所以对于每个阶段,你可以定义变量里面的值:
Pipeline {
def my_var
stage('stage1'){
---------
}
stage('stage2'){
---------
}
}
如果要为每个文件定义一个阶段,则必须使用输入 object 创建闭包并将其传递到 parent groovy 文件的调用中:
test.groovy:
def call(def my_obj, String my_string) {
stage('my_stage') {
println(my_obj)
}
}
parent_test.groovy
test(obj_value,string_value)
在我的声明性詹金斯管道代码的一个阶段,它执行一个 bash 脚本(sh '''./a.sh'''
,脚本 "a.sh" 在外部维护) - 在该脚本中, "jarVersion" 的值是注入 ${WORKSPACE}/.jarVersion (echo "jarVersion=${jarVersion}" > ${WORKSPACE}/.jarVersion
)。在后期,我们需要获取 jarVersion 的值。我们使用 load "${WORKSPACE}/.jarVersion"
和 ${jarVersion}
来获取值。当我们在管道脚本中这样做时它会起作用。
但是,当我们将此管道设置为共享库(将其放入/vars/testSuite.groovy
)并在另一个管道脚本中调用它时。它无法识别 var ${jarVersion}
.
请指教如何解决这个问题。一个常见的问题是:如何将脚本中的值从阶段 A 传递到阶段 B?
stage('getJarVersion'){
steps{
script{
load "${WORKSPACE}/.jarVersion"
currentBuild.description = "jarVersion:${jarVersion}"
}
}
}
我希望它能像在管道脚本中一样工作。
但它显示:
groovy.lang.MissingPropertyException: No such property: jarVersion for class: testSuite
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:53)
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.getProperty(ScriptBytecodeAdapter.java:458)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.getProperty(DefaultInvoker.java:34)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20)
at testSuite.call(/jenkins/jobs/TestSuite1/builds/11/libs/pipelineUtilities/vars/testSuite.groovy:84)
对于同一 groovy 文件下的阶段,您必须在阶段块之外和节点块之前声明 object。所以对于每个阶段,你可以定义变量里面的值:
Pipeline {
def my_var
stage('stage1'){
---------
}
stage('stage2'){
---------
}
}
如果要为每个文件定义一个阶段,则必须使用输入 object 创建闭包并将其传递到 parent groovy 文件的调用中:
test.groovy:
def call(def my_obj, String my_string) {
stage('my_stage') {
println(my_obj)
}
}
parent_test.groovy
test(obj_value,string_value)