Jenkins共享库中的全局变量

时间:2019-08-28 08:31:30

标签: jenkins groovy jenkins-pipeline

我有一个使用共享库的Jenkinsfile。我想创建一个全局变量,该变量在共享库的所有函数中都可用,类似于params对象。但是我总是以

结束
groovy.lang.MissingPropertyException: No such property: pipelineParams for class: groovy.lang.Binding

this guideline之后,我在Field中定义了一个Jenkinsfile

import org.apache.commons.io.FileUtils
@groovy.transform.Field
def pipelineParams

library identifier: 'pipeline-helper@master', retriever: modernSCM(
  [$class: 'GitSCMSource',
       remote: 'https://bitbucket/scm/jenkins/pipeline-helper.git',
       credentialsId: 'bitbucket.service.user'
  ])

defaultCiPipelineMSBuild {
    nodes     = 'TEST-NODES' /* label of jenkins nodes*/
    email     = 'example@example.com' /* group mail for notifications */
    msbuild   = 'MSBUILD-DOTNET-4.6' /* ms build tool to use */ 
}

然后在defaultCiPipelineMSBuild中设置pipelineParams

def call(body) {
    // evaluate the body block, and collect configuration into the object
    pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()

    pipeline {
    ...

稍后,我调用一个函数buildApplication,该函数想使用该变量:

def msBuildExe = tool pipelineParams.msbuild

2 个答案:

答案 0 :(得分:0)

您不是自己创建一个全新的管道参数,而是尝试将变量添加到可以在共享库中使用的env参数中吗?

env.param_name = "As per your requirement"

也可以通过共享库中的env.param_nameenv[param_name]访问

答案 1 :(得分:0)

如@Dillip所建议,即使对于非字符串也可以使用env。如果作为环境变量存储的对象是列表或映射,则应将其反序列化

所以我稍稍更改了管道代码,以将地图存储为环境变量

def call(body) {
    // evaluate the body block, and collect configuration into the object
    pipelineParams= [:]
    body.resolveStrategy = Closure.DELEGATE_FIRST
    body.delegate = pipelineParams
    body()

    env.pipelineParams = pipelineParams

    pipeline {
    ...

管道被序列化,因此在读取时返回一个字符串

{ nodes=TEST-NODES,email=example@example.com,msbuild=MSBUILD-DOTNET-4.6 }

因此使用时必须反序列化

def pipelineParams = 
// Take the String value between the { and } brackets.
"${env.pipelineParams}"[1..-2]
    .split(', ')
    .collectEntries { entry -> 
        def pair = entry.split('=')
        [(pair.first()): pair.last()]
    }

//use map
pipelineParams.msbuild

您可以将反序列化添加到函数中,以便也可以在其他地方使用它。