Groovy脚本中的全局方法



根据另一个答案,如果你定义一个变量而不def它就会变成"全局",因此你可以从脚本中的任何位置访问它。如何使用方法执行此操作(因为没有def AFAIK 就没有定义(?

郑重声明:我正在定义 Jenkins 管道,并希望从各个阶段访问一些"全局"方法

您可以在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()。可以在管道的任何阶段和任何步骤中访问它。

关于您的陈述:

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

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

一个简单的方法是使用 Jenkins 中的共享库功能在单独的文件中定义其他方法。这在Brent Laster的博客和谈话中有详细说明。

最新更新