#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
декоратор, чтобы это исправить.