Gymterview
senior

Что такое 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 через:

  1. Manage Jenkins -> Configure System -> Global Pipeline Libraries — доступна всем проектам.
  2. Folder-level Libraries — доступна проектам внутри папки.
  3. Можно загрузить динамически через 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), способы подключения и версионирования, а также зачем это нужно в масштабе организации. Покажите, что понимаете проблему дублирования логики пайплайнов между проектами.