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

问题描述 投票:0回答:1

我目前正在开发一个Jenkins脚本,它加载另一个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
}

在path / to / file下:

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

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

return this

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

  1. 他=神经痛患者,他是一个全球性的
  2. @Field aVar = newAVar只是不起作用,因为@Field需要在脚本体中。
  3. def aVar = newAVar显然不起作用,因为aVar变成局部变量
  4. this.aVar = newAVar也因某种原因将aVar变成了全局
  5. 即使尝试使用a.aVar =“b”更改脚本之外的aVar也只是将它变成了全局

(另一方面,如果你将aVar变成一个列表并添加到它而不是替换它,它就像预期的那样工作)

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

谢谢。

jenkins groovy scope annotations
1个回答
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
}

在path / to / file中:

import groovy.transform.Field

@Field def aVar = []

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

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

return this    
© www.soinside.com 2019 - 2024. All rights reserved.