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
实例,则在它们之间共享相同的绑定。
根据 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
实例,则在它们之间共享相同的绑定。