Что такое Shared Libraries в Jenkins
Shared Libraries — это механизм Jenkins, позволяющий выносить общую логику пайплайнов в отдельный Git-репозиторий и переиспользовать её в нескольких проектах, обеспечивая единообразие CI/CD-процессов и централизованное управление.
Аналогия: Shared Library — это как общий шаблон договора в юридическом отделе. Вместо того чтобы каждый проект писал свой пайплайн с нуля, команда DevOps создает «библиотеку шаблонов», и проекты просто указывают, какой шаблон использовать.
Структура Shared Library
Пример
shared-library-repo/
├── vars/ # Глобальные переменные и функции
│ ├── buildJavaApp.groovy # Вызывается как buildJavaApp() в Jenkinsfile
│ ├── deployToNexus.groovy
│ └── notifyTeam.groovy
├── src/ # Groovy-классы (полноценный ООП)
│ └── com/
│ └── company/
│ └── Pipeline.groovy
└── resources/ # Ресурсы (конфиги, шаблоны)
└── settings.xml
vars/— содержит глобальные функции. Каждый файл<name>.groovyстановится доступен как шаг<name>()в Jenkinsfile.src/— содержит классы Groovy с полноценной ООП-логикой. Используется для сложных сценариев.resources/— статические ресурсы (конфиги, шаблоны), доступные черезlibraryResource().
Пример функции в vars/buildJavaApp.groovy
buildJavaApp.groovy
def call(Map config = [:]) {
def mavenVersion = config.mavenVersion ?: 'Maven-3.9'
def jdkVersion = config.jdkVersion ?: 'JDK-17'
def skipTests = config.skipTests ?: false
pipeline {
agent { label 'java' }
tools {
maven mavenVersion
jdk jdkVersion
}
stages {
stage('Build') {
steps { sh 'mvn clean compile' }
}
stage('Test') {
when { expression { !skipTests } }
steps { sh 'mvn test' }
}
stage('Package') {
steps { sh 'mvn package -DskipTests' }
}
}
}
}
Использование в Jenkinsfile проекта
Простейший вариант — вызов готового пайплайна одной строкой:
Пример
@Library('my-shared-library') _
buildJavaApp(mavenVersion: 'Maven-3.9', jdkVersion: 'JDK-17')
Использование отдельных функций из библиотеки:
Пример
@Library('my-shared-library') _
pipeline {
agent any
stages {
stage('Build') {
steps { sh 'mvn clean package' }
}
stage('Publish') {
steps { deployToNexus(artifactId: 'my-app', version: '1.0.0') }
}
}
post {
failure { notifyTeam(channel: '#builds', status: 'FAILED') }
}
}
Подключение Shared Library к Jenkins
Shared Library регистрируется в Jenkins через:
- Manage Jenkins -> Configure System -> Global Pipeline Libraries — доступна всем проектам.
- Folder-level Libraries — доступна проектам внутри папки.
- Можно загрузить динамически через
library():
Пример
library identifier: 'my-shared-library@main',
retriever: modernSCM([
$class: 'GitSCMSource',
remote: 'https://git.company.com/devops/shared-library.git',
credentialsId: 'git-creds'
])
Версионирование Shared Library
Пример
@Library('my-shared-library@v2.1.0') _ // Конкретный тег
@Library('my-shared-library@main') _ // Ветка
@Library('my-shared-library@abc1234') _ // Конкретный коммит
Вывод
Shared Libraries особенно полезны в банковской среде, где десятки микросервисов используют одинаковый CI/CD-процесс. Они позволяют стандартизировать пайплайны, централизованно управлять ими и обеспечивать единообразие проверок (security scan, quality gate, деплой).
На собеседовании: Shared Libraries — это тема уровня senior/DevOps. Ключевые вопросы: структура библиотеки (vars vs src), способы подключения и версионирования, а также зачем это нужно в масштабе организации. Покажите, что понимаете проблему дублирования логики пайплайнов между проектами.