代码之家  ›  专栏  ›  技术社区  ›  Uko

Groovy脚本中的全局方法

  •  3
  • Uko  · 技术社区  · 8 年前

    根据 another answer 如果定义变量时没有 def 它变为“全局”,因此您可以从脚本中的任何位置访问它。我如何用一个方法做到这一点(因为没有 def公司 AFAIK)?

    2 回复  |  直到 8 年前
        1
  •  6
  •   Szymon Stepniak    8 年前

    您可以在 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 例子

        2
  •  2
  •   michaelranaldo    8 年前

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