Общие библиотеки Jenkins: Shared Libraries

Рейтинг: 67.6% · 8 голосов
Подробный курс по Jenkins и CI/CD: установка и настройка, плагины и Configuration as Code, конвейеры (pipeline) и Jenkinsfile, declarative и scripted, агенты, Docker и Kubernetes, общие библиотеки на Groovy, безопасность и credentials, интеграции (SonarQube, артефакты), траблшутинг. Актуально на 2026.
Ответить
Аватара пользователя
Andrey_CICD
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Общие библиотеки Jenkins: Shared Libraries

Сообщение Andrey_CICD »

Оглавление курса (47)
  1. Что такое Jenkins и зачем нужен CI/CD
  2. Jenkins в 2026: версии, экосистема и сравнение с GitLab CI и GitHub Actions
  3. Архитектура Jenkins: контроллер, агенты, узлы и исполнители
  4. Установка Jenkins: пакеты, Docker и Kubernetes
  5. Первичная настройка Jenkins: мастер, плагины, пользователи
  6. Плагины Jenkins: установка, обновление и ключевой набор
  7. Configuration as Code (JCasC): настройка Jenkins декларативно
  8. Конвейеры Jenkins и Jenkinsfile: pipeline as code
  9. Scripted против Declarative: два синтаксиса конвейера
  10. Структура конвейера: node, stage, steps и первый pipeline
  11. Генератор сниппетов, запуск конвейера и Replay
  12. Типы заданий Jenkins: Freestyle, Pipeline, Multibranch и Organization
  13. Декларативный конвейер: структура pipeline, agent, stages
  14. agent, environment и переменные в конвейере
  15. tools, options, parameters и triggers в декларативном конвейере
  16. stages, parallel и matrix: организация этапов
  17. Условное выполнение when и блок post
  18. Триггеры сборки: webhook от GitHub, SCM polling и расписание
  19. Параметры сборки и пользовательский ввод
  20. Управление потоком: timeout, retry, sleep и waitUntil
  21. Параллелизм и блокировки: parallel, lock, milestone
  22. Постобработка и уведомления о результате сборки
  23. Groovy для Jenkins: основы скриптового конвейера
  24. Скриптовый конвейер: логика, циклы и функции
  25. Общие библиотеки Jenkins: Shared Libraries (вы здесь)
  26. Подключение и загрузка общих библиотек
  27. Шаги оболочки: sh, bat, powershell и коды возврата
  28. Переменные среды, withEnv и рабочие пространства
  29. Работа с файлами, артефактами и отпечатками
  30. Сборка проектов в конвейере: Maven, Gradle, npm
  31. Качество кода: SonarQube и покрытие тестами
  32. Управление артефактами: публикация в Nexus и Artifactory
  33. Docker в Jenkins: образы как агенты сборки
  34. Сборка и публикация Docker-образов из конвейера
  35. Jenkins в Kubernetes: динамические pod-агенты
  36. Развёртывание в Kubernetes из конвейера
  37. Безопасность Jenkins: аутентификация и матрица прав
  38. Учётные данные Jenkins: credentials в конвейере
  39. Безопасность сценариев: Groovy sandbox и Vault
  40. Уведомления и отчёты: email, Slack, Telegram, HTML
  41. Blue Ocean и интерфейс Jenkins в 2026
  42. Автоматизация Jenkins: CLI, REST API и script console
  43. Поиск и устранение неисправностей: читаем логи конвейера
  44. Типичные ошибки конвейера: сериализация и неутверждённый код
  45. Эксплуатация Jenkins: бэкап, обновление, масштабирование
  46. Конвертация и миграция: от Freestyle к Jenkinsfile
  47. Итог: сквозной CI/CD конвейер и Jenkins против альтернатив в 2026
Боль, которую решают общие библиотеки

Представь: у тебя двадцать репозиториев, и в каждом лежит свой Jenkinsfile. В каждом - один и тот же блок деплоя на сотню строк, одинаковая отправка уведомлений в чат, одинаковая сборка Docker-образа. Кто-то поправил логику деплоя в одном проекте, в остальных девятнадцати она осталась старой. Через полгода у тебя двадцать слегка разных копий, и ни одна не считается эталоном. Это классическая копипаста, только размазанная по всему отделу.

Jenkins shared library (общие библиотеки Jenkins) - это механизм, который вытаскивает повторяющийся код конвейеров в отдельный Git-репозиторий. Один раз написал шаг deploy(), подключил его во всех Jenkinsfile, и правишь логику в одном месте. Это тот же принцип, что и обычные библиотеки в коде: DRY на уровне пайплайнов. По сути ты строишь внутренний DSL под свою компанию - набор готовых высокоуровневых шагов вроде buildApp(), runTests(), deployTo('prod'), за которыми спрятаны десятки строк рутины.

Идея не новая, она была и в книге Ластера, но за прошедшие годы вокруг неё устоялись практики, о которых в издании 2018 года не пишут. Их и разберём - на актуальном Jenkins. Для справки: на 2026 год LTS-линейка ушла далеко вперёд, ветка 2.541.x требует минимум Java 17, а более свежие сборки (2.555.x) уже хотят Java 21 или 25. Сам синтаксис shared library при этом стабилен много лет, что приятно.

Изображение

Структура: vars, src и resources

Библиотека - это обычный Git-репозиторий с тремя каталогами верхнего уровня. Каждый отвечает за свой тип кода.

Код: Выделить всё

my-shared-library/
  vars/
    deployApp.groovy      # глобальный шаг, вызывается как deployApp()
    deployApp.txt         # документация шага (HTML/Markdown)
    notifySlack.groovy
  src/
    org/cyberlake/
      Docker.groovy       # обычный Groovy-класс, пакет org.cyberlake
  resources/
    org/cyberlake/
      deploy-template.yaml # статичные файлы, грузятся libraryResource
vars/ - сердце библиотеки. Каждый файл здесь становится глобальной переменной-шагом в пайплайне. Файл vars/deployApp.groovy с методом call() ты вызываешь прямо в Jenkinsfile как deployApp(...). Имя файла - это имя шага, поэтому camelCase обязателен, дефисы и заглавная первая буква не пройдут. Именно за каталог jenkins vars цепляются новички: положил функцию - получил готовый шаг, без всякой регистрации.

src/ - стандартное дерево исходников в стиле Java: пакеты, классы, нормальное ООП. Сюда выносят сложную логику, которую неудобно держать в плоских скриптах vars: парсинг, работу с моделями данных, классы-обёртки. Каталог src добавляется в classpath при выполнении пайплайна, так что классы из него видны и в vars, и в самом Jenkinsfile через import.

resources/ - не-Groovy файлы: шаблоны конфигов, JSON, скрипты. Их читают шагом libraryResource внутри библиотеки. Удобно, когда у шага есть, например, шаблон манифеста, и его не хочется зашивать в строку Groovy.

Пример переиспользуемого шага: выносим deploy

Сделаем то, ради чего всё затевалось - стандартный деплой как один шаг. Сначала простой вариант в vars. Метод call() - это то, что вызывается, когда в пайплайне ты пишешь имя файла как функцию.

Код: Выделить всё

// vars/deployApp.groovy
def call(Map config = [:]) {
    String env     = config.environment ?: 'staging'
    String image   = config.image ?: error('Не передан image для деплоя')
    String ns      = config.namespace ?: env

    echo "Деплой ${image} в окружение ${env} (namespace ${ns})"

    // шаблон манифеста лежит в resources/
    String manifest = libraryResource 'org/cyberlake/deploy-template.yaml'
    manifest = manifest.replace('__IMAGE__', image).replace('__NS__', ns)
    writeFile file: 'deploy.yaml', text: manifest

    sh "kubectl apply -f deploy.yaml -n ${ns}"
    sh "kubectl rollout status deployment/app -n ${ns} --timeout=120s"
}
Теперь любой Jenkinsfile превращается в несколько строк. Подключаем библиотеку аннотацией @Library и зовём шаг:

Код: Выделить всё

@Library('cyberlake-shared') _

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                deployApp(
                    environment: 'prod',
                    image: 'registry.cyberlake.ru/app:1.4.2',
                    namespace: 'production'
                )
            }
        }
    }
}
Обрати внимание на одинокий символ подчёркивания после @Library - это не опечатка. Аннотация должна стоять перед каким-то выражением, и _ служит заглушкой, когда импортировать в текущую область видимости нечего. Забудешь его - получишь ошибку компиляции.

Если логика разрастается, переноси её в класс в src. Например, обёртка над Docker:

Код: Выделить всё

// src/org/cyberlake/Docker.groovy
package org.cyberlake

class Docker implements Serializable {
    def steps
    Docker(steps) { this.steps = steps }

    String build(String name, String tag) {
        steps.sh "docker build -t ${name}:${tag} ."
        return "${name}:${tag}"
    }
}
Класс не имеет прямого доступа к шагам пайплайна, поэтому объект steps прокидывают в конструктор - через него зовут sh, echo и прочее. Реализация Serializable нужна из-за того, как Jenkins сохраняет состояние конвейера между перезапусками (механика CPS). Вызов из vars выглядит так:

Код: Выделить всё

// vars/buildImage.groovy
import org.cyberlake.Docker

def call(String name, String tag) {
    def docker = new Docker(this)   // this - текущий пайплайн со всеми шагами
    return docker.build(name, tag)
}
Документация, версионирование и доверие

Документация шага. Положи рядом с vars/deployApp.groovy файл vars/deployApp.txt - и Jenkins покажет его на странице Pipeline Syntax > Global Variables Reference. Внутри можно HTML или Markdown. Для общей jenkins library, которой пользуется весь отдел, это не формальность: без описания параметров коллеги будут читать исходник или дёргать тебя в личку.

Версионирование. Библиотека - это Git, поэтому версия - это ref: ветка, тег или коммит. Управляется прямо в аннотации через @:

Код: Выделить всё

@Library('cyberlake-shared@main') _        // всегда свежая ветка main
@Library('cyberlake-shared@v2.3.0') _      // зафиксировали на теге
@Library('cyberlake-shared@4f1c9ab') _     // конкретный коммит
@Library(['cyberlake-shared@v2.3.0', 'infra-lib@main']) _  // сразу несколько
Практика 2026 года простая: для прода фиксируй тег, для экспериментов бери ветку. Если в настройках библиотеки выключить "Allow default version to be overridden", пайплайны не смогут переопределять версию - админ задаёт её централизованно. Это спасает от ситуации, когда кто-то подтянул сырую feature-ветку в продакшен-сборку.

Доверенные и недоверенные библиотеки. Тут важный момент безопасности. Глобальные библиотеки, настроенные в Manage Jenkins > System > Global Trusted Pipeline Libraries, считаются доверенными: их код выполняется без Groovy-песочницы и может звать любые методы Java, внутренние API Jenkins, плагины. Это мощно и опасно - доступ к такой библиотеке должен быть только у тех, кому ты доверяешь сам контроллер. А вот библиотеки, заданные на уровне папки (folder-level), запускаются в песочнице наравне с обычными пайплайнами: им разрешён лишь список безопасных методов. Логика здравая: общий код, который видят все проекты, надёжно изолирован, а привилегированные обёртки лежат там, куда не дотянется случайный разработчик. Если в shared library нужен потенциально небезопасный вызов, прячь его в доверенной библиотеке за безопасным интерфейсом, а не раздавай сырой доступ всем.

Типичные грабли
  • Забыли _ после @Library('name') - компиляция падает с невнятной ошибкой. Лечится одним символом.
  • Назвали файл в vars через дефис или с заглавной (My-Step.groovy) - шаг не подхватится. Только camelCase: myStep.groovy.
  • Класс в src не реализует Serializable - при сохранении состояния пайплайн ломается на ровном месте. Добавляй implements Serializable почти всегда.
  • Зовёте sh или echo напрямую из класса в src - там их нет. Прокидывай steps (или this) в конструктор.
  • Тянете @Library('lib@main') в прод и удивляетесь, что сборка сегодня собралась иначе, чем вчера. Фиксируй тег.
  • Думаете, что библиотека всемогуща, а она в песочнице (folder-level) - и падает на запрещённом методе. Проверь, доверенная она или нет.
Для сравнения: в GitLab CI ту же задачу решают include с шаблонами и CI/CD components, в GitHub Actions - reusable workflows и composite actions. Идея одна и та же - вынести общий код, - но у Jenkins за счёт полноценного Groovy в src возможностей по логике заметно больше, ценой большей сложности.

Мини-лаба
  • Создай Git-репозиторий с каталогами vars/, src/, resources/.
  • Напиши vars/hello.groovy с методом call(String name), который делает echo "Привет, ${name}". Рядом положи hello.txt с описанием.
  • Подключи библиотеку в Manage Jenkins > System как Global Trusted Pipeline Library, источник - твой Git.
  • В тестовом проекте напиши Jenkinsfile с @Library('твоё-имя@main') _ и вызови hello('cyberlake').
  • Вынеси логику в класс src/org/example/Greeter.groovy (с implements Serializable и steps в конструкторе), вызови его из vars.
  • Поставь тег v1.0.0, переключи Jenkinsfile на @Library('...@v1.0.0') и убедись, что сборка берёт именно его.
Контрольные вопросы
  • Чем отличается код в каталоге vars/ от кода в src/ и когда что выбирать?
  • Зачем в классе из src прокидывать объект steps через конструктор и причём тут Serializable?
  • Как зафиксировать конкретную версию общей библиотеки в Jenkinsfile и почему для прода это важно?
  • В чём разница между доверенной и недоверенной библиотекой с точки зрения Groovy-песочницы?
Итог

Shared library убирает копипасту Jenkinsfile и превращает разрозненные конвейеры в управляемый набор готовых шагов. vars - плоские глобальные шаги вроде deployApp(), src - классы для сложной логики, resources - статичные файлы. Версию фиксируй через @ref, документируй шаги в .txt, а к доверию относись серьёзно: доверенные библиотеки бегают без песочницы. Освоив этот механизм, ты перестаёшь чинить деплой в двадцати местах сразу - правишь в одном.
👍2 ❤️3 🔥 😄 🤔
Аватара пользователя
ziglord
Сообщения: 1
Зарегистрирован: 14 май 2026, 10:23

Re: Общие библиотеки Jenkins: Shared Libraries

Сообщение ziglord »

Вот это про одинокий _ после @Library прям выстраданное, два часа ловил ошибку компиляции пока не нашел что забыл подчеркивание. Спасибо что вынесли в грабли.
👍 ❤️ 🔥 😄 🤔1
Аватара пользователя
kledis
Сообщения: 1
Зарегистрирован: 12 май 2026, 23:08

Re: Общие библиотеки Jenkins: Shared Libraries

Сообщение kledis »

Вопрос: а если у нас один шаг deploy используется и в untrusted folder-библиотеке, и в trusted глобальной, как лучше разруливать чтобы kubectl не падал на песочнице?
👍1 ❤️ 🔥 😄 🤔1
Ответить
← Предыдущая глава
Скриптовый конвейер: логика, циклы и функции
Следующая глава →
Подключение и загрузка общих библиотек

Все главы курса «Jenkins: конвейеры CI/CD от основ до продакшена»

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое jenkins простыми словамикак установить jenkins на linux и в dockerпервичная настройка jenkins после установкикакие плагины jenkins нужны новичкукак настроить агенты jenkins для сборкиcicd для начинающих с чего начать на jenkins

Вернуться в «Jenkins: конвейеры CI/CD от основ до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость