在Jenkins管道中成功加载env变量,但在管道用作共享库

时间:2017-12-11 22:09:25

标签: jenkins environment-variables jenkins-pipeline jenkins-shared-libraries

在我的声明性jenkins管道代码的一个阶段,它执行一个bash脚本(sh '''./a.sh''',脚本" a.sh"在外部维护) - 在该脚本中," jarVersion&的值#34;注入$ {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)

1 个答案:

答案 0 :(得分:0)

如果阶段在同一个groovy文件下,则必须在阶段块之前和节点块之前声明对象。因此,对于每个阶段,您可以在变量中定义值:

Pipeline {

def my_var

 stage('stage1'){
 ---------
 }

 stage('stage2'){
 ---------
}

}

如果要为每个文件定义一个阶段,则必须使用输入对象创建闭包,并在父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)