Изменение аннотированной переменной @Field в Jenkins после объявления? - PullRequest
0 голосов
/ 17 января 2019

В настоящее время я работаю над сценарием 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 на newAVar, не делая aVar глобальным. Я пробовал следующее:

  1. aVar = newAVar превращает aVar в глобальный
  2. @ Field aVar = newAVar просто не работает, так как @Field должен быть в теле скрипта.
  3. def aVar = newAVar, очевидно, не работает, поскольку aVar превращается в локальную переменную
  4. this.aVar = newAVar по некоторым причинам также превращает aVar в глобальный
  5. Даже попытка изменить aVar вне скрипта с помощью a.aVar = "b" просто превращает его в глобальный

(С другой стороны, если вы превращаете aVar в список и добавляете его вместо замены, он работает так, как ожидалось)

Можно ли переназначить переменные @Field после их инициализации? Если нет, то как люди обычно решают эту проблему? (Я думал об упаковке подпрограммы в классе, который мог бы инициализировать, но я чувствую, что это больше проблем, чем стоит, и менее интуитивно понятно)

Спасибо.

1 Ответ

0 голосов
/ 27 февраля 2019

Наконец-то получил ответ благодаря Изменить переменную сценария из Closure в 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    
...