Рубрики
Uncategorized

Дженкинс трубопроводит действительно это испортилось ??

Дженкинс серьезно не связан с любой способностью разделять трубопроводы в дискретные файлы — как если бы они ненавидят чистый код и IAC. Помечено Дженкинс, Мяка, Дежол, Groovy.

За последние несколько дней я ударил голову против трубопроводов Дженкинса — тем больше я стараюсь работать, чтобы создать простой пример повторного использования кода, тем больше я чувствую, что в этом отношении трубопроводы Дженкинса и Groovy являются . сговорить Чтобы вы не практикуете чистого кодирования и правильного IAC.

Обратите внимание, что если вы создаете работу трубопровода в Jenkins и укажите его на main.groovy Файл, он будет запустить его в Groovy Interpeter. Так последующий:

// File ./main.groovy
println "Hello world!"

… является действительным файлом для определения трубопровода Дженкинса. Он просто будет распечатать свое сообщение и выйти в качестве успешной сборки.

Для всех намерений и целей требования к файлу — это просто сценарий Groovy.

Затем приходит веселая часть.

На любом языке здравоохранения, импортируя файл в той же папке, так как ваш скрипт должен быть Легко и очевидный Особенно, если языки ознакомится со сценарием языком.

В простых странах, это на самом деле не слишком сложно — вам просто нужно помнить, что это Kin с Java, а некоторые предпосылки должны заботиться. Следующие работает нормально:

// File ./main.groovy
import zoo.Cat

kitty = Cat()
kitty.sound()
// File ./zoo/Animal.groovy
package zoo
def sound() { println this.my_sound ; }
// File ./zoo/Cat.groovy
package zoo
import zoo.Animal

class Cat extends Animal { // Animal is implicitly a class!
  def my_sound = "meow"
}

Если вы запустите Groovy Main.groovy Импорт успешно.

Попробуйте запустить, что в трубопроводной работе, и она потерпит неудачу, жалуется, что не может решить Импорт зоопарк. Кот Отказ Причина этого, конечно, это потому, что КЛАССАТУРА Является ли родительская среда — это не имеет предстоящих знаний нашего динамически (с точки зрения проработанного процесса) загруженного сценария Groovy.

Итак, что проспект FCKED.

Для простого вопроса «Как импортировать другой файл Groovy» есть Myriad, безумный , предложения по стоковым потоке, большинство из которых я решил игнорировать, потому что они явно летучая мышь судно (или платформа патологически бессмыслена). Однако практика необходима, чтобы обойти вопрос классов.

Есть два, которые кажутся достаточно разумными. Сначала я наткнулся, это было:

GroovyShell shell = new GroovyShell()
def script = shell.parse(new File('zoo/Cat.groovy'))
script.method()

Мне грустно сообщать, что это не работает в Дженкинсах, потому что это Nerfs использование Groovyshell Отказ С одной стороны, это, вероятно, функция безопасности для предотвращения работы произвольного кода в экземплярах Jenkins; С другой стороны, какой наш код, если не произвольно из точки зрения Дженкина? И быть совершенно честным, я мог бы очень легко запустить Curl $ URL | Bash Как шаг и обойти ограничения безопасности Дженкинса в целом. Так что это определенно чувствует себя нерфингом.

На моей установке я получаю сообщение, с помощью которого ограничение может быть «одобрено» администраторами (права которых у меня есть), но безрезультатно.

Аналогичная ситуация возникает с другим предварительным решением, которое я бы надеялся стать «стандартным» способом делать вещи:

evaluate(new File('zoo/Cat.groovy'))

разумеется Эти потерпели неудачные маршруты, и я действительно начинаю воспитывать, и это грубо к сыру.

В окружающей среде Jenkins Groovy есть нагрузка () Функция, которая позволяет сделать подобную вещь для импорта. Это может работать:

// File ./main.groovy
node('') {
  stage("Load a file") {
    kitty = load("zoo/Cat.groovy")
    kitty.meow()
  }
}
// File ./zoo/Cat.groovy
def meow() {
  println "Miaow."
}

return this

Обратите внимание на Верните это В конце — это автоматически интенсирует объект неявного Кот класс (имя взято из имени файла).

Это, однако, не работает:

// File ./main.groovy
kitty = load("zoo/Cat.groovy")
kitty.meow()

Вместо этого не удается с ошибкой:

org.jenkinsci.plugins.workflow.steps. ПродуемаContextVariableException: Требуемый контекстный класс HUDSON. FilePath отсутствует

Который jenkins лядет на нас, если только он не инкапсулируется внутри узла Jenkins, импортируя файл не может быть сделан. Который брюки, потому что сам Дженкинс Уже хорошо выглядеть хорошо, сделал репо оформление заказа Чтобы получить этот файл трубопровода в первую очередь!

Таким образом, нам необходимо использовать узел «Контроллер трубопровода» (для отсутствия лучшего имени), который, кстати, не может быть узлом, который вы намереваетесь использовать для фактически обработки сборки (если вы не хотите рисковать своим трубопроводом в ожидании в очередь, который ждет …. Ваш трубопроводный контроль работой, чтобы остановить бегать, который ждет …)

Что означает, что мы на самом деле Нужно сделать это:

// File ./main.groovy
node('controllers') {
  stage("Load a file") {
    checkout([
        $class: 'GitSCM',
        branches: [[name: "master"]],
        userRemoteConfigs: [[
            credentialsId: 'github-pat',
            url: "https://github.com/org/reponame"
        ]]
    ])

    kitty = load("zoo/Cat.groovy")
    kitty.meow()
  }
}

(Предыдущий пример, который я сказал: «Может работать» только при повторном использовании рабочего пространства)

Между прочим, что блок проверки unwweyly не может быть завернут во внешнюю функцию в своем собственном файле — потому что нам нужно проверить REPO на узле, прежде чем мы сможем получить доступ к файлу! Да, есть более короткое обозначение для простых случаев использования, но когда вы должны принять во внимание пользовательские настройки … Если вы обнаружите, что это часто используют это, это Повторный код в Каждое определение трубопровода Отказ Плохо Отказ

Но что есть, то есть. Использование нагрузка () И убыл в отставке, чтобы нуждаться в узле контроллера трубопровода, я, наконец, могу получить мое разделение файлов. Я даже могу сделать это:

// File ./zoo/Cat.groovy
def meow() {
  node("farm") { // Run somewhere other than the controller node
    stage("Sound the farm") {
      println "Miaow."
    }
  }
}

return this

… который эффективно позволяет мне динамически добавлять этапы, когда я иду.

Слушай, Общая библиотека Концепция, которые они торгуют звучат как хорошая идея на поверхности, но ты Действительно Ожидайте, что я вырвут подмножество файлов Еще один репо, пройдите через Jenkins GUI, чтобы добавить его с пользовательским именем, Linke между двумя находятся в Platofrm вместо В коде Когда файлы есть Значит, чтобы быть именно рядом друг с другом, как в любом проекте по развитию зданий ??

Все это хорошо и хорошо, но что, если мы хотим быть немного чище и не использовать императивное программирование, но вместо этого используйте фактическую декларативную реализацию, что Дженкинс действительно хочет, чтобы мы использовали?

Ну, ты фарширован.

Вы можете запустить только код сценария внутри скрипт {} Блоки, которые могут существовать внутри этап {} Блоки в Этапы {} блоки в трубопровод {} блокировать. Таким образом, сельское хозяйство на этапах трубопровода невозможна вообще невозможна, вы можете изолировать фактические материалы сценариев сборки, насколько вы пишете в Shell или Makefile или все равно все равно Так зачем беспокоить с Groovy.

Обратите внимание, что параметр {} Декларация — это NO-OP, когда он также не используется в декларативном конвейере, поэтому все это вернулось к графическому интерфейсу, если вы не любите повторять себя.

И на данный момент я сдаюсь.

  • Там Должен быть собственным выражением DSL для трубопроводов, которые позволяют скрывать подраздел трубопроводов в отдельном файле
  • Без необходимости создавать еще один репо и добавлять его вручную (что в любом случае лоскут?) В административном интерфейсе
  • И TBH не следует нуждаться в том, чтобы связать еще один экземпляр, тем самым требующий дополнительного оборудования, потому что язык наполовину запеченный.

Поэтому я застрял с Дженкинсом и решением импорта на дому без декларативного добра, просто я могу иметь чистый код, потому что женкинс, похоже, не понимает, что я на самом деле не хочу поддерживать несколько копий моего кода, ни вилки мои трубопроводы до дополнения репо и не используйте его административный графический интерфейс для загрузки библиотек. Ох, и вы все еще настраиваете работу через непристойные суммы конфигурации GUI. В погоне за IAC Отказ

Спасибо Чаку Это праздники И я могу отступить от этого на пару недель.

Оригинал: «https://dev.to/taikedz/is-jenkins-pipelining-really-this-messed-up-360p»