Когда мы ввели JenkinsFiles в нашу экосистему, у нас есть несколько очень хороших функций из коробки. Трубопроводы теперь могут выполнять произвольный код, и сборки будут верситься вместе с источником, который они строили.
Наша первоначальная реализация JenkinsFiles имела свои проблемы. Jenkinsfile поделится кодом, позвонив нагрузка
Шаг на одних и тех же сценариях неоднократно, у которых было несколько проблем.
- Загрузка этих сценариев взяла время процессора, чтобы интерпретировать их
- Загрузка этих сценариев требует сетевого времени для перемещения скрипта с узема рабочего в Master (где интерпретируется)
- Трубопроводы не могли восстановить после перезагрузки системы и воспроизведения не работали из-за использования
нагрузка
- Эти скрипты, как правило, были неприятными для развития, появилась плохая интеграция IDE, и это было подмножество функциональности Groovy. Завершение кода и AutoCorrect не работало хорошо.
Это было не хорошо, но это было лучше, чем раньше.
Архитекторы подошли ко мне о улучшении опыта разработчика для этих трубопроводов. Они упомянули с использованием Kotlin для создания трубопроводов, так как разработчики Дженкинса заявили, что они не будет поддерживать Котлин для трубопроводов . Я сомневался в этом подходе, но и заинтригован.
Между тем, я хотел распределить общий код таким образом, чтобы ликвидировали разработчиков, которые должны беспокоиться об общих деталях, таких как уведомления SCM, статистика наложения, очистка рабочей области и оптимизация SCM. Я разочаровался, пытаясь общаться с этими вопросами, и Дженкинсфайл не дал мне хороших инструментов для этого, но если я генерирую Jenkinsfile, я мог бы построить такой код в двигатель генерации.
После нескольких дней мышления я все еще был сомнительным из подхода к генерированию JenkinsFiles. Однако я не мог противостоять искушению экспериментировать. Возможность развития в Котлин была тантализация — завершение кода, обнаруженность, и сильное время компиляции гарантирует меня. Поэтому я отправился, чтобы доказать, что я мог это сделать.
Я был одновременно высеван и боишься идеи, что я создал машину Rube Goldberg.
Сначала я экспериментировал с компиляцией скриптов Kotlin на лету с переводчиком Kotlin. Я написал простой кусочек кода Kotlin для вывода JenkinsFile в банке библиотеки. Я заканчиваю это, чтобы работать, загружая правильные банки в Дженкинс и интерпретировать .kts
Сценарий на лету в Дженкинс, но я столкнулся с несколькими проблемами.
- Местное развитие не было поддерживается очень хорошо
- Использование требуется независимое понимание того, как Дженкинс управляет библиотеками
- Котлинский сценарий был разбит в текущей версии Kotlin
Я создал трубопровод из Котлина, но я был с Марка, и я не был убежден, что этот подход будет работать. Может ли это на самом деле сделать развитие jenkinsfile проще, или я преследовал свой хвост? Естественно, я не заботился о ответе на этот вопрос, потому что мне было весело.
В течение следующей недели я продолжал работать, я преобразовал процесс разработки и генерации для использования Gradle, что означало, что в настоящее время поддерживается местное развитие, резолюция артефакта была стандартизирована, и мне не нужно беспокоиться о двигателе сценария.
Теперь, когда у меня была хорошая среда разработки, и могла динамически генерировать jenkinsfile из исходного кода Kotlin Я начал работать над моей библиотекой. И это было действительно весело. Инструментарий вышла из моего пути, как ожидается, для развития Котлина И я мог сосредоточиться на моем коде. Я имел дело с Котлином, и IDE смог сказать мне немедленно, если мой код был действителен. У меня было несколько ударов долгое время, и иногда я смог сгенерировать плохие дженкинсфлы, но в целом мои трубопроводы начали укрепить. Общий код упал на место, когда я построил свои трубопроводы, а узоры стали очевидными. Изолирующая общий код стал тривиальным, поскольку я имел дело с типами Котлин, и IDE может рефакторировать для меня и сказать мне, когда я сделал ошибку.
После первой недели я чувствовал себя уверенно, что я был на правильном пути. Мой код Котлин стал более лаконичным каждый день, когда я перевел функциональность в общей библиотеке, и я смог правильно поделиться кодом как по всему проектам в общей библиотеке, так и в трубопроводах, имеющих много повторяющихся шагов (например, наш монолит).
Теперь я могу выразить мою пособию по эксплуатации CORDLE всего за несколько строк Kotlin, не беспокоясь о специально настроите все функции эзотерических женкинсов:
val pipelineDsl = PipelineDsl() val myPipeline = pipelineDsl.pipeline { agent { label("linux") } stages { stage("Build") { steps { echo("Hello, World!") } } } } generatePipeline(myPipeline, "path/to/Jenkinsfile.generated")
Я могу выразить свой трубопровод так же, как мог в Groovy, но с улучшениями, предоставляемыми Kotlin, и настроили по умолчанию, предоставляемыми на Pipelinedsl
объект.
Конечно, все эти настройки по умолчанию могут быть переопределены, так как весь объект трубопровода — это не что иное, как простые классы данных. Это также делает мои трубопроводы простыми в единицу теста, поскольку утверждения становятся простыми утверждениями о равенстве объекта Kotlin. Лучшая часть — я могу использовать любой инструмент, который интегрируется с помощью RIDLE для разработки моих трубопроводов. Заинтересованы в пробуждении трубопроводов Kotlin? Проверьте репо на Документация и примеры Отказ
Оригинал: «https://dev.to/dgoetsch/pipelinekt-jenkinsfiles-and-kotlin-4m47»