Подключение и загрузка общих библиотек

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

Подключение и загрузка общих библиотек

Сообщение 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 живёт один и тот же кусок - сборка через Maven, нотификация в чат, деплой в Kubernetes. Поправил логику деплоя в одном месте - и пошёл копипастить по четырнадцати оставшимся. Через месяц они уже разъехались, и никто не помнит, какой вариант "правильный". Вот ровно эту боль и лечит jenkins shared library - общая библиотека, в которую ты выносишь повторяющийся код пайплайна и подключаешь его одной строкой.

В этом уроке разберём, как настроить и подключить shared library: глобальная регистрация через Manage Jenkins, аннотация @Library, неявная (implicit) и динамическая загрузка, версионирование для стабильности и разница между доверенными и недоверенными библиотеками. По состоянию на 2026 год это базовый навык: актуальная Jenkins LTS - линейка 2.541.x (Java 17 как минимум, а weekly-ветка уже требует Java 21), и shared library остаётся штатным способом не дублировать код пайплайна между проектами.

Как устроена jenkins library внутри

Общая библиотека - это просто Git-репозиторий с тремя каталогами, и Jenkins ожидает именно такую структуру:

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

(корень репозитория)
  vars/
    deployApp.groovy      # глобальная переменная-шаг: deployApp(...)
    notifySlack.groovy
  src/
    org/cyberlake/Build.groovy   # обычные Groovy-классы, как Java
  resources/
    org/cyberlake/deploy.yaml    # статические файлы, libraryResource
Каталог vars - самое ходовое. Каждый файл тут становится глобальной переменной с именем файла. Файл vars/notifySlack.groovy с методом call превращается в шаг notifySlack, который ты вызываешь прямо в пайплайне:

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

// vars/notifySlack.groovy
def call(String message, String color = 'good') {
    echo "Slack [${color}]: ${message}"
    // тут реальная отправка через slackSend или curl
}
Каталог src - это classpath в чистом виде, обычные классы Groovy с пакетами, как в Java. Туда выносят сложную логику. А resources хранит не-groovy файлы (шаблоны, yaml), которые ты вытягиваешь функцией libraryResource('org/cyberlake/deploy.yaml').

Изображение

Глобальная настройка: jenkins global library из Git

Чтобы пайплайны видели библиотеку, её надо зарегистрировать. Идёшь в Manage Jenkins -> System и ищешь раздел Global Trusted Pipeline Libraries (в старых сборках он назывался Global Pipeline Libraries). Тут jenkins global library привязывается к источнику:
  • Name - имя, по которому будешь звать: например cyberlake-pipeline
  • Default version - ветка, тег или коммит по умолчанию: main, v2.3.0 или хеш
  • Load implicitly - подгружать ли библиотеку во все пайплайны автоматически
  • Allow default version to be overridden - можно ли в Jenkinsfile попросить другую версию
  • Retrieval method - Modern SCM, источник Git с URL и credentials
В мире 2026 года руками это уже почти не настраивают - всё описывают через Configuration as Code (JCasC). Конфиг в yaml лежит в репозитории, и стенд поднимается воспроизводимо:

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

unclassified:
  globalLibraries:
    libraries:
      - name: "cyberlake-pipeline"
        defaultVersion: "main"
        implicit: false
        allowVersionOverride: true
        retriever:
          modernSCM:
            scm:
              git:
                remote: "https://git.cyberlake.ru/devops/jenkins-lib.git"
                credentialsId: "git-readonly"
Если включить implicit, шаги из vars становятся доступны вообще без всякого объявления - удобно для совсем общих вещей, но опасно: любой пайплайн потащит главную ветку, и поломка в библиотеке уронит всё разом.

jenkins @library: подключение в Jenkinsfile

Самый частый способ - аннотация. Тут важная тонкость: jenkins @library стоит ДО строки с pipeline и обязательно сопровождается импортом (хотя бы фиктивным _), иначе Groovy выкинет аннотацию как мусор.

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

@Library('cyberlake-pipeline@v2.3.0') _

pipeline {
    agent any
    stages {
        stage('Notify') {
            steps {
                notifySlack('Сборка стартовала')
            }
        }
        stage('Deploy') {
            steps {
                script {
                    def b = new org.cyberlake.Build(this)
                    b.deploy('staging')
                }
            }
        }
    }
}
После имени через @ идёт версия. Это и есть ключ к стабильности: jenkins загрузка библиотеки всегда должна быть к чему-то прибита. Варианты в порядке надёжности:
  • @cyberlake-pipeline@main - ветка. Живёт и меняется, удобно для разработки, опасно для прода
  • @cyberlake-pipeline@v2.3.0 - тег. Иммутабельный, рекомендованный для продакшена
  • @cyberlake-pipeline@a1b2c3d - конкретный коммит. Максимальная фиксация, но неудобно читать
Нужно подтянуть несколько библиотек - перечисляй их списком: @Library(['lib-a@v1.0', 'lib-b@main']) _.

Динамическая загрузка через шаг library

Аннотация резолвится ДО запуска пайплайна, поэтому имя и версию в ней нельзя вычислить на лету. Когда версия зависит от параметров сборки или ветки, используют шаг library - это и есть jenkins загрузка библиотеки в рантайме:

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

pipeline {
    agent any
    parameters {
        string(name: 'LIB_VERSION', defaultValue: 'main', description: 'Версия библиотеки')
    }
    stages {
        stage('Load & run') {
            steps {
                script {
                    def lib = library("cyberlake-pipeline@${params.LIB_VERSION}")
                    // классы из src доступны через возвращённый объект
                    lib.org.cyberlake.Build.new(this).deploy('prod')
                    // а шаги из vars - просто по имени
                    notifySlack('Deploy завершён')
                }
            }
        }
    }
}
Минус один и важный: шаг library грузится уже внутри сборки, поэтому глобальные переменные из vars (шаги) появятся только ПОСЛЕ его вызова в том же script-блоке. Аннотация в этом смысле чище, когда версия известна заранее.

Отдельный приём - подтянуть код из произвольного SCM, не регистрируя библиотеку глобально. Полезно для разовых экспериментов:

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

library identifier: 'adhoc@main', retriever: modernSCM([
    $class: 'GitSCMSource',
    remote: 'https://git.cyberlake.ru/devops/jenkins-lib.git',
    credentialsId: 'git-readonly'
])
Доверенные и недоверенные: где грабли безопасности

Тут кроется главная путаница новичков. Библиотека, объявленная глобально в Manage Jenkins (Global Trusted Pipeline Libraries), - доверенная. Её код выполняется БЕЗ песочницы Groovy, ему можно всё: лезть в Jenkins API, в файловую систему контроллера, дёргать любые методы Java. Поэтому право менять её репозиторий надо держать в узких руках - это фактически root-доступ к контроллеру.

А вот библиотеки, заданные на уровне папки (Folder-level, в настройках конкретного folder), - всегда недоверенные. Их код крутится в Groovy Sandbox: разрешён только белый список безопасных методов, и любой шаг в сторону требует ручного approval администратора через In-process Script Approval. Это сделано специально: команды могут подключать свои библиотеки, не получая ключи от всего сервера.

Запомни правило: доверяй коду ровно настолько, насколько контролируешь, кто его меняет. Если в проде завязан implicit на ветку main доверенной библиотеки - один кривой коммит может сломать или скомпрометировать весь Jenkins.

Кстати, в GitLab CI и GitHub Actions та же задача переиспользования решается иначе: include в .gitlab-ci.yml и reusable workflows плюс composite actions в Marketplace. Идея общая - не копировать пайплайны, но shared library даёт полноценный Groovy-код, а не только декларативные включения.

Типичные грабли
  • Забыл символ _ или import после @Library - аннотация молча игнорируется, шаги "не находятся". Лечится подчёркиванием в конце строки.
  • Подключил библиотеку по ветке main и удивляешься, почему прод-сборки разные. Прибивай к тегу.
  • Файл в vars назвал DeployApp.groovy, а зовёшь deployApp - имя шага чувствительно к регистру и совпадает с именем файла.
  • Меняешь src-класс и не видишь эффекта - Jenkins кеширует, помогает чистый чекаут или смена версии. На общих переменных vars кеш мягче.
  • Сложил секреты в resources - libraryResource их спокойно отдаст в лог. Секреты только через credentials.
Мини-лаба

Повтори руками:
  • Создай Git-репозиторий с файлом vars/hello.groovy и методом call(String name), который пишет echo.
  • Зарегистрируй его в Manage Jenkins -> System как jenkins global library с именем lab-lib и default version main, implicit выключен.
  • Сделай пайплайн с @Library('lab-lib@main') _ и вызови hello('cyberlake').
  • Поставь тег v1.0 в репозитории, переключи Jenkinsfile на @lab-lib@v1.0 и убедись, что изменения в main больше не влияют на сборку.
  • Перепиши подключение через шаг library() в script-блоке с версией из параметра сборки.
Контрольные вопросы
  • Чем отличается каталог vars от src в структуре общей библиотеки и как из них вызывать код?
  • Почему после @Library нужен символ _ или import, и что будет, если его не поставить?
  • В каком случае выбирают шаг library вместо аннотации @Library?
  • Почему folder-level библиотеки всегда недоверенные, а глобальные - доверенные, и чем это грозит?
Итог

Shared library убирает копипаст из пайплайнов: общий код живёт в одном Git-репозитории, а проекты подключают его строкой @Library с прибитой версией. Глобальную библиотеку регистрируют в Manage Jenkins (лучше через JCasC), для статики версии хватает аннотации, для динамики - шага library. И помни про безопасность: глобальные библиотеки доверенные и всесильные, folder-level - в песочнице. Всегда фиксируй версию по тегу, и прод-сборки станут предсказуемыми.
👍3 ❤️1 🔥 😄 🤔3
Аватара пользователя
rabbit_fan
Сообщения: 1
Зарегистрирован: 27 май 2026, 13:37

Re: Подключение и загрузка общих библиотек

Сообщение rabbit_fan »

Долго не мог понять почему шаги из vars не находятся, оказалось забыл подчёркивание после @Library. Спасибо, теперь работает.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
rioja3000
Сообщения: 1
Зарегистрирован: 19 май 2026, 17:55

Re: Подключение и загрузка общих библиотек

Сообщение rioja3000 »

А подскажите, если default version в библиотеке main, но в Jenkinsfile я указал тег - что победит? По уроку понял что тег, но хочу убедиться что override надо включать в настройках.
👍 ❤️1 🔥 😄 🤔2
Ответить
← Предыдущая глава
Общие библиотеки Jenkins: Shared Libraries
Следующая глава →
Шаги оболочки: sh, bat, powershell и коды возврата

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

Поделиться темой: ✈ Telegram VK

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

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

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