Groovy脚本中的全局方法

Uko*_*Uko 2 groovy jenkins-groovy jenkins-pipeline

根据另一个答案,如果你定义一个变量而没有def它变成"全局",那么你可以从脚本的任何地方访问它.我怎么能用方法做到这一点(因为没有defAFAIK 没有定义)?

为了记录:我正在定义Jenkins管道,并希望从各个阶段之外访问一些"全局"方法

Szy*_*iak 5

您可以在Jenkinsfile外部定义任何方法pipeline {},例如

@NonCPS
def pomVersion() {
    def matcher = readFile('pom.xml') =~ '<version>(.+)</version>'
    return matcher ? matcher[1][1] : null
}

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh "sed -i.bak -e 's|\${appVersion}|'${pomVersion()}'|g' dep_pom.xml"            
                sh 'mvn clean -U install -DdeploymentContext=test -f dep_pom.xml'
            }
            post {
                success {
                    junit '**/target/**/*.xml'
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是一些示例脚本,它定义了pomVersion()pom.xml文件中读取版本的方法.它可以在任何阶段和管道的任何步骤中访问.

关于你的陈述:

如果你定义一个没有def的变量,它就会变成"全局",因此你可以从脚本的任何地方访问它

实际上并不像那样.Groovy脚本被编译为扩展groovy.lang.Script类的类.它使用bindings结构(将其视为a Map<String,Object>)来存储脚本中使用的所有变量.如果使用相同的GroovyShell实例运行,则此机制允许例如在两个单独的脚本之间共享相同的绑定.