声明后在Jenkins中更改带@Field注释的变量?

时间:2019-01-17 16:44:30

标签: jenkins groovy scope annotations

我目前正在研究一个Jenkins脚本,该脚本会加载另一个Jenkins脚本并尝试将其用作对象。假设我的代码如下:

在主要的詹金斯脚本下:

node() {
    a = load ("path/to/file")
    println("Printing ${a.aVar}") //This prints "a"
    a.changeAVar("b")
    println("Printing ${a.aVar}") //This prints "b"
    println("Printing ${aVar}") //This should fail
}

路径/到/文件下:

import groovy.transform.Field
@Field def aVar = "a"

def changeAVar(newAVar){
    //CODE TO CHANGE aVar = newAVar
}

return this

不幸的是,我不知道如何在不使aVar成为全球性的情况下将aVar更改为newAVar。我尝试了以下方法:

  1. aVar = newAVar将aVar变成全球性
  2. @Field aVar = newAVar无效,因为@Field需要在脚本主体中。
  3. def aVar = newAVar显然不起作用,因为aVar变成了局部变量
  4. this.aVar = newAVar由于某种原因也将aVar变成了全球
  5. 即使尝试使用a.aVar =“ b”在脚本外部更改aVar,也只会将其纠缠为全局变量

(另一方面,如果将aVar变成列表并添加到列表中而不是替换列表,则它会按预期工作)

@Field变量初始化后是否可以重新分配?如果没有,人们通常如何解决此类问题? (我当时正在考虑将子脚本包装到可以初始化的类中,但是我觉得那比它的价值更大,而且不那么直观)

谢谢。

1 个答案:

答案 0 :(得分:0)

最后得到modify script variable from a Closure in Groovy的回答;如此专注于詹金斯是罪魁祸首,以至于我从不费力去尝试Groovy中的脚本。

替换changeAVar
getMetaClass().setProperty(this, "aVar", newAVar) 

工作完美。

演示:

node() {
    a = load ("path/to/file")
    println("Printing ${a.aVar.toString()}") //This prints "[]"
    a.changeAVar("b")
    println("Printing ${a.aVar.toString()}") //This prints "[b]"
    a.changeAVar2("c")
    println("Printing ${a.aVar.toString()}") //This prints "c"
    println("Printing ${aVar}") //This fails
}

在路径/至/文件中:

import groovy.transform.Field

@Field def aVar = []

def changeAVar(newAVar){
    aVar.add(newAVar)
}

def changeAVar2(newAVar){
    getMetaClass().setProperty(this, "aVar", newAVar)
}

return this