Библиотека общего конвейера Jenkins: могу ли я объявлять статические переменные в файле vars?

#jenkins #jenkins-pipeline

#дженкинс #jenkins-pipeline

Вопрос:

Поддерживает ли библиотека общего конвейера Jenkins статические переменные в vars/*. groovy файлах?

Примеры

«Неявная» ссылка на глобальные переменные (не работает)

 file: vars/foo.groovy
---
def functionFoo() {return "foo"}



file: vars/bar.groovy
---
def result = functionFoo()
def functionBar() {println result}


file:Jenkinsfile
---
@Library('MyLib') _
bar.functionBar()
  

Это выдает ошибку:

Исключение groovy.lang.MissingPropertyException: такого свойства нет: результат для класса: groovy.lang.Привязка в groovy.lang.Привязка.GetVariable(Binding.java:63) в org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224) в org.kohsuke.groovy.sandbox.impl.Проверка $ 4.вызовите(Checker.java:241) в org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238) в com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:24) в com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:20) ….

«Явная» ссылка на глобальные переменные (работает)

 file: vars/foo.groovy
---
def functionFoo() {return "foo"}



file: vars/bar.groovy
---
def functionBar() {
    def result = functionFoo()
    println result
}


file:Jenkinsfile
---
@Library('MyLib') _
bar.functionBar()
  

Краткие сведения

Я предполагаю, что переменные либо инициализируются другим способом, либо просто не могут использоваться внутри vars/ каталога так же, как функция. Является ли эта функция частью Groovy Language? Или ограничение глобальной конвейерной библиотеки Jenkins?

Комментарии:

1. Вы пробовали это?

Ответ №1:

Чтобы определить переменную внутри groovy vars, а не функцию, используйте groovy.transform.Поле:

 @groovy.transform.Field result = functionFoo()
def functionBar() {println this.result}
  

Комментарии:

1. Если это сработает, groovy.transform.Field похоже, что это проблема с тем, как Groovy работает с переменными в сценариях: «Аннотация переменной, используемая для изменения области видимости переменной в скрипте с того, что она находится в методе run скрипта, на то, что она находится на уровне класса для скрипта. Аннотированная переменная станет закрытым полем класса script. Тип поля будет таким же, как тип переменной.»

2. Стоит разобраться в сравнении скриптов с классами: groovy-lang.org/structure.html#_scripts_versus_classes

3. подзапрос: где определить перечисления, которые должны быть видны из конвейера jenkins, чтобы их можно было передавать в качестве параметра одной из функций общей библиотеки? src или vars?

4. Единственные 2 вещи, за которые я переплачиваю, — это хороший коньяк и волшебные ответы Дженкинса. Спасибо.

5. При попытке использовать это я получаю ошибки CPS. Помимо самой ошибки, это, по-видимому, приводит к тому, что движок путается и возвращает значения слишком рано и / или вызывает неправильный метод. Я не могу понять, куда поместить @NonCPS декоратор, чтобы это исправить.