Groovy 脚本中的全局方法

Global methods in Groovy script

根据 another answer,如果您定义一个没有 def 的变量,它将变成 "global",因此您可以从脚本中的任何地方访问它。我怎样才能用一种方法来做到这一点(因为没有 def AFAIK 就没有定义)?

郑重声明:我正在定义 Jenkins 管道并希望从各个阶段

外部访问某些 "global" 方法

一个简单的方法是使用 Shared Libraries feature within Jenkins to define additional methods in a separate file. This is detailed in a blog and talk by Brent Laster.

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

@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'
                }
            }
        }
    }
}

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

关于您的声明:

if you define a variable without def it becomes "global" and thus you can access it from anywhere in the script

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