如何访问groovy类文件中的全局变量?

k_v*_*ath 4 groovy global-variables jenkins jenkins-pipeline

我有以下目录结构

(root)
+- src                     # Groovy source files
|   +- org
|       +- foo
|           +- Bar.groovy  # for org.foo.Bar class
+- vars
|   +- foo.groovy          # for global 'foo' variable
Run Code Online (Sandbox Code Playgroud)

我在以下文件中有以下代码行

  1. Bar.groovy

    package org.foo
    
    class Bar implements Serializable {
      def config
      def script
    
      Bar(script, config){
        this.script = script
        this.config = config
      }
    
      def accessGlobalVars(){
        this.script.echo "${foo.GlobalVar}" // throws an err
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. foo.groovy

    import groovy.transform.Field
    @Field GlobalVar="Hello World!"
    
    Run Code Online (Sandbox Code Playgroud)

我能够访问脚本块中Jenkinsfile中的变量

echo "${foo.GlobalVar}"
Run Code Online (Sandbox Code Playgroud)

是否可以访问类中的相同变量,因为vars文件夹位于src文件夹级别?

mko*_*bit 7

"${foo.GlobalVar}"在您的示例代码试图解决fooBar类型.由于没有foo参考,它无法解决,你可能会得到类似的东西MissingPropertyException.

Jenkins Pipeline Groovy使用Groovy编译和运行时API进行一些不同的编译和绑定.全局变量也可以script通过其动态GroovyObjectAPI 通过对象解析(在此处的源代码中进行了演示).最简单的方法是让Jenkins实现的动态Groovy对象解析解析您的变量.

改变你的行:

this.script.echo "${foo.GlobalVar}"
Run Code Online (Sandbox Code Playgroud)

而是fooscript对象中查找(我假设是this或者script在你的Jenkins管道中new Foo(this, config)):

this.script.echo "${this.script.foo.GlobalVar}"
Run Code Online (Sandbox Code Playgroud)