Использование общих библиотек Jenkins (Shared Libraries)

Beginner

Введение

Общие библиотеки Jenkins (Shared Libraries) позволяют командам повторно использовать код Pipeline во множестве заданий. Стандартная структура библиотеки предполагает размещение простых пользовательских шагов в каталоге vars/. После этого Pipeline может загрузить библиотеку и вызывать эти шаги как обычные функции Pipeline.

В этой лабораторной работе вы подготовите локальную общую библиотеку с файлом vars/sayHello.groovy, зарегистрируете её как Global Pipeline Library в панели управления Jenkins, создадите задание Pipeline, которое вызывает sayHello, и проверите результат выполнения в Jenkins.

Подготовка репозитория общей библиотеки

На этом этапе вы подготовите локальный Git-репозиторий для общей библиотеки Jenkins. Каталог vars/ является особенным: каждый файл .groovy в нем становится шагом Pipeline с тем же именем.

Выполните эту команду, чтобы создать vars/sayHello.groovy внутри контейнера Jenkins:

docker exec jenkins bash -lc '
set -e
rm -rf /var/jenkins_home/shared-lib-src /var/jenkins_home/shared-lib.git
mkdir -p /var/jenkins_home/shared-lib-src/vars
cd /var/jenkins_home/shared-lib-src
git init -b main
git config user.email "jenkins@example.com"
git config user.name "Jenkins Shared Library"
cat > vars/sayHello.groovy <<'"'"'EOF'"'"'
def call(String name = "LabEx") {
    echo "Shared library says hello to ${name}"
}
EOF
git add vars/sayHello.groovy
git commit -m "Add sayHello shared library step"
'

Теперь опубликуйте репозиторий как локальный «голый» (bare) Git-репозиторий и откройте к нему доступ через git://localhost/shared-lib.git:

docker exec jenkins bash -lc '
set -e
cd /var/jenkins_home/shared-lib-src
git init --bare --initial-branch=main /var/jenkins_home/shared-lib.git
git remote add origin /var/jenkins_home/shared-lib.git
git push origin main
touch /var/jenkins_home/shared-lib.git/git-daemon-export-ok
if [ -f /tmp/shared-lib-git-daemon.pid ]; then
  kill "$(cat /tmp/shared-lib-git-daemon.pid)" 2>/dev/null || true
  rm -f /tmp/shared-lib-git-daemon.pid
fi
git daemon --reuseaddr --base-path=/var/jenkins_home --export-all --detach --pid-file=/tmp/shared-lib-git-daemon.pid /var/jenkins_home
'

Запишите ветку репозитория, которую будет использовать Jenkins:

docker exec jenkins git ls-remote git://localhost/shared-lib.git refs/heads/main | tee /home/labex/project/shared-library-repository.txt

Вывод должен содержать refs/heads/main.

Регистрация Global Pipeline Library

На этом этапе вы зарегистрируете репозиторий как глобальную библиотеку Jenkins под названием labex-shared-lib. Pipeline сможет загрузить её с помощью директивы @Library.

Откройте интерфейс рабочего стола. Firefox автоматически откроет Jenkins. Если этого не произошло, перейдите по адресу http://localhost:8080.

В панели управления Jenkins:

Нажмите Manage Jenkins (Управление Jenkins), затем выберите System (Система).

Прокрутите страницу до раздела Global Trusted Pipeline Libraries или Global Pipeline Libraries. Нажмите Add (Добавить).

Заполните поля библиотеки следующими значениями:

  • Name: labex-shared-lib
  • Default version: main
  • Установите флажок Allow default version to be overridden
  • Оставьте Load implicitly невыбранным
  • Retrieval method: Modern SCM
  • Source Code Management: Git
  • Project Repository: git://localhost/shared-lib.git
  • Credentials: - none -

Нажмите Save (Сохранить).

Настройка Global Pipeline Library в Jenkins

Выполните эту команду, чтобы сохранить конфигурацию библиотеки:

docker exec jenkins sh -lc "grep -n -E '<name>labex-shared-lib</name>|git://localhost/shared-lib.git|<defaultVersion>main</defaultVersion>' /var/jenkins_home/org.jenkinsci.plugins.workflow.libs.GlobalLibraries.xml" | tee /home/labex/project/shared-library-config-lines.txt

Создание Pipeline, загружающего библиотеку

На этом этапе вы создадите задание Pipeline с именем shared-library-demo. Pipeline будет загружать labex-shared-lib и вызывать пользовательский шаг sayHello('LabEx') из файла vars/sayHello.groovy.

В панели управления Jenkins:

Нажмите New Item (Создать задание), введите shared-library-demo, выберите Pipeline, затем нажмите OK.

Прокрутите до раздела Pipeline. Оставьте Definition как Pipeline script.

Введите следующий скрипт:

@Library('labex-shared-lib@main') _

node {
    stage('Use Library') {
        sayHello('LabEx')
    }
}

Нажмите Save (Сохранить).

Pipeline Jenkins с использованием общей библиотеки

Выполните эту команду, чтобы сохранить скрипт Pipeline:

docker exec jenkins sh -lc "grep -n -E '@Library|sayHello' /var/jenkins_home/jobs/shared-library-demo/config.xml" | tee /home/labex/project/shared-library-job-config.txt

Запуск Pipeline с общей библиотекой

На этом этапе вы запустите задание Pipeline. Jenkins получит общую библиотеку из локального Git-репозитория, загрузит vars/sayHello.groovy и выполнит пользовательский шаг.

На странице задания shared-library-demo нажмите Build Now (Собрать сейчас).

Когда сборка #1 появится в истории, дождитесь её завершения. Успешная сборка означает, что Jenkins успешно загрузил библиотеку и выполнил скрипт Pipeline.

Результат сборки Jenkins с общей библиотекой

Выполните эту команду, чтобы сохранить результат сборки:

curl -fsS http://localhost:8080/job/shared-library-demo/1/api/json | tr ',' '\n' | grep '"result":"SUCCESS"' | tee /home/labex/project/shared-library-build-result.txt

Проверка вывода общей библиотеки

На этом этапе вы проверите вывод консоли Jenkins. Ключевым доказательством является строка, выведенная файлом sayHello.groovy.

Откройте сборку #1, затем нажмите Console Output (Вывод консоли).

В консоли должно быть видно, как Jenkins загружает labex-shared-lib и выводит:

Shared library says hello to LabEx

Вывод консоли Jenkins с общей библиотекой

Выполните эту команду, чтобы сохранить подтверждение из консоли:

curl -fsS http://localhost:8080/job/shared-library-demo/1/consoleText | grep 'Shared library says hello to LabEx' | tee /home/labex/project/shared-library-console-lines.txt

Резюме

Вы подготовили репозиторий общей библиотеки Jenkins, зарегистрировали его как Global Pipeline Library через панель управления, создали задание Pipeline, которое загружает эту библиотеку, и убедились в успешном выполнении пользовательского шага из каталога vars/ по выводу в консоли Jenkins.