Комментарии 17
У Pipeline Shared Libraries в таком исполнении есть один существенный недостаток — они ломают концепцию Pipeline-as-Code, когда код хранится и версионируется вместе с пайплайном.
Куча jenkins-плагинов, это как раз имплементация. Shared Library, из той же оперы.
1) Скажите, пожалуйста, у вас получилось как-то подружить Идею с скриптами для Дженкинса?
У меня разразработка для Дженкинса в Идеи выглядит, как написание кода в IDE, в которой данный язык не поддерживается. Всё красное, никаких подсказок по классам. Оно и понятно, я не добавлял в класпас каких-либо jar-ников (которые я сходу не смог найти).
2) Вы пишите, что можно и Джаву использовать. У вас есть опыт? Ведь в дженкинсе вроде бы только на груви можно писать пайплайны?
1. Я импортирую проект как новый модуль и добавляю groovy sdk. Мне этого достаточно
2. Спасибо за замечание — исправил. Более правильно добавить, что можно использовать любые библиотеки с помощью Grab
C аннотацией grab тоже не все так просто. Например я пробовал подключить таким образом google guava и при обращении к классам библиотеки получил исключение MethodNotFoundException. Было несложно догадаться и проверить, что код pipeline-а загружается в classloader-е наследнике какого-то classloader-а в Jenkins куда уже загружены библиотеки самого Jenkins. Это может вести к очень неприятным последствиям.
Подсветка синтаксиса и автокомплит в Idea появляются после подключения библиотек Groovy Sdk И jenkins pipeline gdsl. Вот например: https://gist.github.com/arehmandev/736daba40a3e1ef1fbe939c6674d7da8
В скриптах можно использовать любые возможности языка
Oчень смелое заявление. Важно понимать, что это не groovy, а jenkins dsl. Со своим кастомным интерпретатором и своими багами. И с учётом их фишки CPS это даёт незабываемые ощущения при разработке. Так, что тут чем проще, тем меньше шансов наступить на грабли.
vars
?(1..3).each
и надо еще не забывать, что в дженкинсе по умолчанию запрещено выполнение половины встроенных методов, и их надо разрешать отдельно.
И вот мой аутпут:
Enable balancer
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Check Status)
[Pipeline] echo
Check status
[Pipeline] echo
Number: 1
[Pipeline] echo
Number: 2
[Pipeline] echo
Number: 3
[Pipeline] }
[Pipeline] // stage
[Pipeline] End of Pipeline
Finished: SUCCESS
Можете привести другой пример?
for (int i = 0; i < changeLogSets.size(); i++) {
или
@NonCPS
надо будет это переосмыслить
Я правда пока не спешу обновлять сервера, есть недоверие что опять заработает только часть конструкций :)
def collection = ['One Two Three'].collect{ it.split(' ') }
println "collection: " + collection
def result = ''
collection.each{ result += it }
println "result: " + result
Результат из Script Console:
collection: [[One, Two, Three]]
result: [One, Two, Three]
Результат из пайплайна:
[Pipeline] echo
collection: [[One, Two, Three]]
[Pipeline] echo
result: One
Jenkins Pipeline Shared Libraries