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

JenkinsBeginner
Практиковаться сейчас

Введение

Общие библиотеки 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.