3

根据另一个答案,如果您定义一个没有def它的变量将变为“全局”,因此您可以从脚本中的任何位置访问它。我怎样才能用一种方法来做到这一点(因为没有defAFAIK 就没有定义)?

记录在案:我正在定义 Jenkins 管道,并希望从各个阶段访问一些“全局”方法

4

2 回答 2

6

您可以在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'
                }
            }
        }
    }
}

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

关于你的陈述:

如果您在没有 def 的情况下定义一个变量,它就会变成“全局”,因此您可以从脚本中的任何位置访问它

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

于 2018-01-18T11:03:13.023 回答
1

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

于 2018-01-18T11:01:05.830 回答