Groovy脚本中的全局方法

时间:2018-01-18 10:56:28

标签: groovy jenkins-pipeline jenkins-groovy

根据another answer,如果您定义不带def的变量,它将变为“全局”,因此您可以从脚本中的任何位置访问它。如何使用方法执行此操作(因为没有def AFAIK没有定义?)

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

2 个答案:

答案 0 :(得分: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' } } } } } 中定义任何方法,例如

pomVersion()

以下是一些示例脚本,用于定义从pom.xml文件读取版本的bindings方法。它可以在任何阶段和管道的任何步骤中访问。

关于你的陈述:

  

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

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

答案 1 :(得分:1)

这样做的一种简单方法是使用Jenkins中的Shared Libraries功能在单独的文件中定义其他方法。详情请参见blog and talk by Brent Laster