Эксплуатация Jenkins: бэкап, обновление, масштабирование

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

Эксплуатация Jenkins: бэкап, обновление, масштабирование

Сообщение 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
Когда конвейер становится сервисом, который нельзя ронять

Пока ты возишься с Jenkins на ноутбуке, потеря данных - это неприятность на пять минут. В проде все иначе. Если контроллер - это единственное место, где живут описания всех джоб, история билдов, креды и настройки плагинов, то он мгновенно превращается в критичную инфраструктуру. Падает Jenkins - встают релизы, не катятся хотфиксы, команда сидит без CI. И самое обидное, что чаще всего Jenkins умирает не от хакеров, а от банальных вещей: кончилось место на диске, кривое обновление снесло половину плагинов, кто-то руками поправил конфиг и забыл. Это и есть jenkins администрирование в реальной жизни - не клики по UI, а бэкап, обновление и масштабирование под нагрузкой.

В этом уроке разберем три кита эксплуатации Jenkins в продакшене. Как делать jenkins backup так, чтобы из него реально можно было восстановиться. Как проводить jenkins обновление контроллера и плагинов без сюрпризов. И как делать jenkins масштабирование, не убивая контроллер лишней работой. Свяжем все это с Configuration as Code из урока 6 - именно JCasC превращает хрупкий сервер в воспроизводимую систему.

Сразу про версии, чтобы ты ориентировался в 2026 году. Апрельская LTS-линейка 2.555.x требует Java 21 или Java 25, поддержка Java 17 в ней уже выпилена (январская 2.541.x была последней с Java 17). Так что перед любым апгрейдом первым делом смотри на свою JVM. Blue Ocean окончательно в статусе legacy - команда его забросила, и для визуализации конвейеров теперь штатный Pipeline Graph View прямо в основном UI. Строить на Blue Ocean новое не надо.

Изображение

Jenkins backup: что именно бэкапить

Все состояние Jenkins живет в одной директории - JENKINS_HOME (обычно /var/jenkins_home в контейнере). Это не база данных, а просто дерево XML-файлов и каталогов. Хорошая новость: бэкап концептуально прост. Плохая: там лежит абсолютно все, включая мусор, который раздувает архив до десятков гигабайт.

Что обязательно входит в jenkins backup:
  • config.xml - глобальная конфигурация контроллера
  • jobs/*/config.xml - описания всех джоб (для пайплайнов из SCM сам Jenkinsfile в Git, но настройки джобы тут)
  • plugins/ - установленные плагины и их версии (либо бэкапь, либо фиксируй список через plugins.txt - см. ниже)
  • users/, secrets/, credentials.xml - пользователи и креды. Без файлов из secrets/ зашифрованные креды не расшифруются, имей в виду
  • nodes/ - конфигурация статических агентов
Что почти всегда можно НЕ бэкапить и тем самым ужать архив в разы: builds/ (история и логи билдов), workspace/ (рабочие копии репозиториев, они восстанавливаются из Git), caches/ и war/.

Простейший рабочий вариант - снапшот всего тома средствами инфраструктуры. На железе это tar по расписанию, в k8s - VolumeSnapshot для PVC. Главное правило: бэкапить консистентно. Лучше всего на остановленном Jenkins или хотя бы в режиме Prepare for Shutdown (новые билды не стартуют). Скрипт-минимум:

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

#!/usr/bin/env bash
set -euo pipefail
JENKINS_HOME=/var/jenkins_home
DEST=/backup/jenkins-$(date +%F-%H%M).tar.gz

tar -czf "$DEST" \
  --exclude="$JENKINS_HOME/workspace" \
  --exclude="$JENKINS_HOME/builds" \
  --exclude="$JENKINS_HOME/caches" \
  --exclude="$JENKINS_HOME/war" \
  -C "$JENKINS_HOME" .

# держим только 14 последних архивов
ls -1t /backup/jenkins-*.tar.gz | tail -n +15 | xargs -r rm -f
echo "backup ready: $DEST"
Альтернатива для тех, кто не хочет лезть в файловую систему - плагин ThinBackup. Его в 2026 community подтянул до актуального состояния, он жив. ThinBackup умеет бэкапить только конфиги (без билдов), чистить старые архивы по расписанию и делать full/diff бэкапы прямо из UI. Удобно для классической установки на VM. Но в мире Kubernetes и Configuration as Code ThinBackup нужен реже - там воспроизводимость достигается иначе, об этом в финале.

Jenkins обновление: контроллер и плагины без боли

Тут кроется главная ловушка эксплуатации. Обновлять Jenkins надо - в нем регулярно чинят дыры в безопасности. Но именно jenkins обновление чаще всего и роняет прод. Причина почти всегда одна: несовместимость плагинов. Ядро уехало вперед, а какой-нибудь старый плагин рассчитан на прежний API и при старте отваливается, утаскивая за собой половину функциональности.

Дисциплина обновления в 2026:
  • Сиди на LTS-линейке, не на weekly. LTS выходит раз в 12 недель и собирает уже обкатанные фиксы.
  • Перед апгрейдом проверь требования к Java. Прыжок на 2.555.x без Java 21/25 просто не стартует.
  • Никогда не обновляйся сразу в проде. Подними стейдж - копию контроллера из свежего бэкапа - и накати обновление сначала туда.
  • Сначала ядро, потом плагины (или наоборот - но по очереди и с проверкой). Читай Update Center: он подсвечивает плагины, несовместимые с целевой версией ядра.
  • Фиксируй версии плагинов. Обновление "все сразу на последнее" - это лотерея. Поднимай по группам.
Сам smoke-тест стейджа удобно держать как отдельный Jenkinsfile - дернул базовые шаги после апгрейда и убедился, что агенты коннектятся, креды читаются, сборка проходит:

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

pipeline {
    agent { label 'linux' }
    options { timeout(time: 10, unit: 'MINUTES') }
    stages {
        stage('Sanity') {
            steps {
                sh 'java -version'
                sh 'echo "agent online: $(hostname)"'
            }
        }
        stage('Creds check') {
            steps {
                withCredentials([string(credentialsId: 'smoke-token', variable: 'TOK')]) {
                    sh 'test -n "$TOK" && echo "creds OK"'
                }
            }
        }
        stage('Build probe') {
            steps {
                git url: 'https://git.example.com/team/sample.git', branch: 'main'
                sh 'make build'
            }
        }
    }
    post {
        failure { echo 'Апгрейд сломал базовый сценарий - откатываемся' }
    }
}
И обязательно держи путь отката. На VM это бэкап JENKINS_HOME плюс зафиксированная прежняя версия .war. В контейнерах - предыдущий тег образа: если новый стартанул криво, ты просто откатываешь Deployment на старый image, и том с данными остается прежним.

Jenkins масштабирование: разгружаем контроллер

Главный принцип масштабирования Jenkins звучит так: контроллер не должен ничего собирать. Его задача - оркестрация, веб-морда, хранение конфигов и распределение работы. Любая реальная сборка должна уходить на агента. Если у тебя стоит executor на самом контроллере и на нем что-то компилируется - это первое, что надо выключить. Перегруженный контроллер тормозит весь jenkins prod: UI лагает, очередь растет, агенты отваливаются по таймауту.

Дальше есть два пути.

Статические агенты - выделенные машины (VM или железо), которые постоянно подключены к контроллеру. Просто, предсказуемо, но ты платишь за простой: ночью агенты стоят без дела, а в час пик их не хватает.

Эфемерные агенты в Kubernetes - современный стандарт 2026. Через kubernetes-плагин Jenkins под каждый билд поднимает отдельный pod, который живет ровно столько, сколько идет сборка, а потом уничтожается. Никаких "грязных" окружений от прошлых билдов, оплата только за фактическое время, автоматическое масштабирование вместе с кластером. podTemplate описывается прямо в Jenkinsfile:

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

pipeline {
    agent {
        kubernetes {
            yaml '''
apiVersion: v1
kind: Pod
spec:
  containers:
  - name: maven
    image: maven:3.9-eclipse-temurin-21
    command: ["sleep"]
    args: ["infinity"]
    resources:
      requests:
        cpu: "500m"
        memory: "1Gi"
      limits:
        cpu: "2"
        memory: "2Gi"
'''
        }
    }
    stages {
        stage('Build') {
            steps {
                container('maven') {
                    sh 'mvn -B clean package'
                }
            }
        }
    }
}
Контейнер jnlp, через который агент общается с контроллером, kubernetes-плагин подставляет сам - вручную его добавлять не нужно. Ты описываешь только рабочие контейнеры со своими тулчейнами.

Без k8s тоже есть варианты эфемерности: docker-плагин (контейнер на билд на Docker-хосте) или облачные агенты на спотах. Идея та же - не держать парк машин в простое.

Мониторинг и здоровье контроллера

Масштабировать вслепую нельзя - нужны метрики. Базовый набор для jenkins администрирование в проде: длина очереди сборок, число занятых executor'ов, время в очереди, использование heap JVM, статус подключения агентов. Стандартный инструмент 2026 - плагин Prometheus metrics: он отдает эндпоинт /prometheus, Prometheus его скрейпит, а ты строишь дашборды и алерты в Grafana.

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

# prometheus.yml - scrape job для Jenkins
scrape_configs:
  - job_name: 'jenkins'
    metrics_path: '/prometheus'
    scheme: http
    static_configs:
      - targets: ['jenkins.internal:8080']
На что вешать алерты в первую очередь: растущая длина очереди при свободных агентах (значит, упёрлись в executor'ы контроллера или в коннект), heap под потолком (грозит OOM и падением), отвалившиеся агенты, заканчивающееся место на томе JENKINS_HOME. Дисковое место - вообще причина номер один внезапных смертей Jenkins, следи за ним отдельно.

Контроллер как код: JCasC + plugins.txt + Docker

Вот где сходятся все три темы урока. Если контроллер описан кодом, то бэкап упрощается (бэкапить надо в основном данные, а не конфигурацию), обновление становится предсказуемым (версии плагинов зафиксированы), а disaster recovery - это пересборка образа, а не ручное восстановление по памяти.

Рецепт воспроизводимого контроллера из трех файлов. Первый - plugins.txt с зафиксированными версиями:

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

configuration-as-code:1932.v17e874b_4a_a_99
kubernetes:4306.va_da_66c6e9a_29
git:5.7.0
workflow-aggregator:608.v67378e9d3db_1
prometheus:2.6.0
Второй - jenkins.yaml с конфигурацией JCasC (из урока 6). Тут описываются глобальные настройки, облако Kubernetes, security realm. Контроллер при старте сам приводит себя в это состояние:

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

jenkins:
  systemMessage: "Managed by JCasC - do not edit via UI"
  numExecutors: 0
  clouds:
    - kubernetes:
        name: "k8s"
        serverUrl: "https://kubernetes.default:443"
        namespace: "jenkins-agents"
        jenkinsUrl: "http://jenkins.jenkins.svc:8080"
        containerCapStr: "20"
unclassified:
  location:
    url: "https://jenkins.example.com/"
Обрати внимание на numExecutors: 0 - тот самый запрет на сборку на контроллере, заданный кодом.

Третий - Dockerfile, который запекает плагины в образ. Никакого скачивания плагинов на старте, никакого дрейфа версий:

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

FROM jenkins/jenkins:2.555.1-lts-jdk21

COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/plugins.txt

COPY jenkins.yaml /var/jenkins_home/casc_configs/jenkins.yaml
ENV CASC_JENKINS_CONFIG=/var/jenkins_home/casc_configs
Теперь disaster recovery выглядит так: berешь этот образ, поднимаешь его, монтируешь том с данными из бэкапа - и контроллер вернулся ровно в то состояние, что был. Конфигурация воспроизводится из кода, данные - из снапшота. Это и есть зрелая эксплуатация.

Типичные грабли
  • Бэкап без папки secrets/ - креды после восстановления превращаются в нечитаемый мусор.
  • Апгрейд сразу в проде "потому что окошко мигало". Стейдж не роскошь, а страховка.
  • Сборка на контроллере. Один тяжелый билд - и UI у всей команды лагает.
  • "Update all plugins" одной кнопкой без фиксации версий. Несовместимый плагин роняет старт.
  • Прыжок на новую LTS без проверки Java. 2.555.x на Java 17 не запустится в принципе.
  • Нет алерта на свободное место - JENKINS_HOME забивается логами билдов, и контроллер тихо умирает.
Мини-лаба
  • Напиши bash-скрипт бэкапа JENKINS_HOME с исключением builds/ и workspace/ и ротацией. Проверь, что secrets/ и credentials.xml в архиве.
  • Подними тестовый контроллер из Dockerfile с plugins.txt и jenkins.yaml. Убедись, что numExecutors там 0, заданный через JCasC.
  • Опиши podTemplate в Jenkinsfile и прогони сборку на эфемерном агенте в k8s (или на docker-плагине, если нет кластера).
  • Установи плагин Prometheus metrics, открой /prometheus, найди метрику длины очереди и метрику heap.
  • Сэмулируй апгрейд: подними копию из бэкапа как стейдж, накати новую LTS, прогони smoke-Jenkinsfile.
Контрольные вопросы
  • Какие каталоги внутри JENKINS_HOME критичны для восстановления, а какие можно безопасно исключить из бэкапа?
  • Почему нельзя обновлять прод-Jenkins напрямую и из чего состоит безопасная процедура апгрейда?
  • В чем преимущество эфемерных агентов в Kubernetes перед статическими и зачем контроллеру numExecutors: 0?
  • Как связка plugins.txt + jenkins.yaml + Dockerfile упрощает disaster recovery по сравнению с ручной настройкой через UI?
Итог

Эксплуатация Jenkins в проде держится на трех вещах. Бэкап - снапшот JENKINS_HOME с обязательными secrets/ и кредами, без лишних билдов и workspace. Обновление - только через стейдж, с фиксацией версий плагинов и проверкой требований к Java (в 2026 это уже Java 21/25 на свежих LTS). Масштабирование - выноси сборки с контроллера на агентов, а лучше на эфемерные pod'ы в Kubernetes, и смотри за метриками через Prometheus. А связующее звено - контроллер как код: JCasC, plugins.txt и Docker превращают хрупкий сервер с кучей ручных настроек в систему, которую можно пересобрать с нуля за минуты. Это та зрелость, ради которой Jenkins вообще стоит держать в продакшене.
👍1 ❤️1 🔥 😄 🤔2
Аватара пользователя
shelby63
Сообщения: 1
Зарегистрирован: 23 май 2026, 02:02

Re: Эксплуатация Jenkins: бэкап, обновление, масштабирование

Сообщение shelby63 »

Наконец-то кто-то объяснил, что secrets/ надо бэкапить отдельно. У меня как раз креды после восстановления не читались, неделю голову ломал. Спасибо.
👍1 ❤️ 🔥1 😄 🤔
Аватара пользователя
semper_fy2009
Сообщения: 1
Зарегистрирован: 30 май 2026, 00:02

Re: Эксплуатация Jenkins: бэкап, обновление, масштабирование

Сообщение semper_fy2009 »

Вопрос по numExecutors 0 - а если у меня маленький контроллер на одной VM без k8s, совсем без сборок на нем тоже жить? Или для пары легких джоб можно оставить 1-2 executor?
👍 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Типичные ошибки конвейера: сериализация и неутверждённый код
Следующая глава →
Конвертация и миграция: от Freestyle к Jenkinsfile

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

Поделиться темой: ✈ Telegram VK
Похожие запросы: что такое jenkins простыми словамипервичная настройка jenkins после установкикакие плагины jenkins нужны новичкукак настроить агенты jenkins для сборкиcicd для начинающих с чего начать на jenkinsjenkinsfile declarative или scripted что выбрать

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

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

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