Расширение библиотек кода по конвейерам Jenkins может показаться сложной задачей. Есть много разных способов сделать то же самое в конвейере Jenkins. Выбор между декларативным или скриптовым конвейером. Выбор того, где и как импортировать библиотеки. Разработчику Jenkins предстоит выполнить обширный список задач. Не говоря уже об отслеживании окружающей среды и состояния конвейера по мере его развития. Итак, как лучше всего использовать общие функции в разных конвейерах?

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

Давайте посмотрим, как настроить простую общую библиотеку и реализовать ее в одном из наших конвейеров.

Создайте библиотеку

Чтобы использовать общие библиотеки, мы должны сначала создать правильную структуру каталогов в репозитории и написать код Groovy. В этом примере мы будем использовать базовый файл класса Groovy, который просто запускает echo и выводит сообщение в консоль Jenkins. Давайте настроим для этого новый каталог в нашем существующем репозитории Git (это может быть место, где вы храните свой Jenkinsfiles и любые сопутствующие файлы Groovy):

src/org/mytools/

Внутри этого каталога вы создадите новый файл Groovy с именем:

Tools.groovy

У вас должна получиться следующая структура:

src/org/mytools/Tools.groovy

Теперь откройте файл Tools.groovy и поместите внутрь следующий код:

package org.mytools
class Tools implements Serializable {
    private static final long serialVersionUID
    def steps
    Tools(steps) {
        this.steps = steps
    }
    void myEcho(String msg) {
        steps.echo msg
    }
}

Давайте разберемся, что здесь происходит. В первой строке мы определяем пакет, частью которого он будет. Это объявление пакета Java, которое позволяет нам сгруппировать код в единое целое (большинство файлов внутри этого каталога должны находиться в одном пакете).

В следующей строке мы определяем наш класс Tools, который является реализацией класса Serializable. Это позволяет нам сохранять состояние наших классов во время конвейера Jenkins. serialVersionUID предоставляет переменную для сохранения уникального идентификатора состояния объекта.

Следующие несколько строк внутри Tools дескриптора класса извлекают переменную steps из вызывающего конвейера. Мы должны принять steps в качестве параметра, потому что классы в разделяемых библиотеках не знают о функциях шагов конвейера, таких как echo или sh. Это сообщает нашему классу, что мы ожидаем, что это будет передано в качестве параметра при создании экземпляра.

Наконец, мы настраиваем нашу myEcho функцию, которая просто принимает строку, а затем использует этап echo конвейера для ее вывода на консоль. На этом мы завершаем работу над классом и размещаем большую часть наших функций.

Это все, что касается нашей структуры каталогов и конфигурации Groovy. Если в какой-то момент вы застрянете с настройкой своей библиотеки, вы можете обратиться к официальной документации Jenkins по разделяемым библиотекам.

Затем давайте посмотрим, как мы втягиваем этот новый пакет в Jenkins.

Настроить библиотеку в Jenkins

Чтобы использовать общие библиотеки внутри конвейера в Jenkins, нам необходимо настроить библиотеку. Откройте экземпляр Jenkins и перейдите в раздел Управление Jenkins - ›Настроить систему. Прокрутите вниз, пока не найдете раздел Глобальные библиотеки конвейеров. Введите соответствующую информацию, относящуюся к вашему репозиторию Git и деталям оформления заказа:

Вы можете оставить значения по умолчанию отмеченными / снятыми флажками, но сделайте одно соображение относительно поля Загрузить неявно. Если вы хотите, чтобы ваши библиотеки были доступны автоматически в каждом конвейере, вы можете установить этот флажок, в противном случае оставьте его пустым, и мы рассмотрим их импорт вручную. Вначале я бы посоветовал не устанавливать этот флажок, чтобы вы четко указывали, какие библиотеки будут использоваться.

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

Импортировать библиотеку в конвейер

Использовать общие библиотеки в конвейере невероятно просто, и вы удивитесь, почему вы не сделали это раньше. После сборки и настройки общей библиотеки в Jenkins она теперь доступна для конвейеров, и ее нужно только объявить. Давайте посмотрим на пример конвейера, в котором используется наша новая библиотека:

@Library('mytools')
import org.mytools.Utils
Tools tools = new Tools(this)
pipeline {
    agent any
    stages {
        stage('test') {
            steps {
                script {
                    tools.myEcho('test')
                }
            }
        }
    }
}

В приведенном выше примере конвейера мы добавляем несколько элементов перед объявлением самого конвейера. Самый важный элемент - это запись @Library. Это говорит конвейеру использовать нашу новую общую mytools библиотеку. Однако одного этого недостаточно, нам нужно указать конвейеру, какие классы использовать, а затем создать их экземпляры.

Сначала нам нужно импортировать класс Utils, а затем создать для него новый объект, вызвав new Tools(this). Помните, как мы ранее говорили, что должны идти по своим следам? Предоставляя ключевое слово this в качестве параметра нашему классу, мы обеспечиваем необходимый контекст конвейера для таких вещей, как echo.

Теперь, когда наш объект был импортирован и создан, мы можем использовать его, как любой другой объект. Внутри любых script блоков в декларативном конвейере мы можем просто вызвать tools.myEcho и наблюдать за выводом.

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

Спасибо за внимание! Используя общие библиотеки в Jenkins, вы можете упростить повторно используемый код и сделать его доступным для нескольких задач конвейера. Дополнительные сведения об общих библиотеках см. В официальной документации Jenkins здесь.