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

时间:2018-03-20 10:55:29

标签: jenkins groovy global-variables jenkins-pipeline

我有以下目录结构

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

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

  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
      }
    }
    
  2. foo.groovy

    import groovy.transform.Field
    @Field GlobalVar="Hello World!"
    
  3. 我能够访问脚本块中的Jenkins文件中的变量

    echo "${foo.GlobalVar}"
    

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

1 个答案:

答案 0 :(得分:5)

示例代码中的"${foo.GlobalVar}"正在尝试针对foo类型解析Bar。由于没有foo引用,因此无法解析,您可能会得到类似MissingPropertyException的内容。

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

从以下位置更改您的行:

this.script.echo "${foo.GlobalVar}"

要从foo对象(我认为詹姆斯金融管道中的scriptthis scriptnew Foo(this, config)来查找this.script.echo "${this.script.foo.GlobalVar}"

import pandas as pd 

def main():
    data = [{'cast_id': 1, 'character': 'W', 'credit_id': '5', 'gender': 2, 'id': 31, 'name': 'To', 'order': 0, 'profile_path': 'pQ'} , {'cast_id': 2, 'character': 'Bu', 'credit_id': '52', 'gender': 2, 'id': 12, 'name': 'Ti', 'order': 1, 'profile_path': 'uX'}]
    df = pd.DataFrame.from_dict(data)
    print(df)

if __name__ == '__main__':
    main()