Триггеры сборки: webhook от GitHub, SCM polling и расписание

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

Триггеры сборки: webhook от GitHub, SCM polling и расписание

Сообщение 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 и сидит, тыкает кнопку "Build Now". Или, что хуже, ушёл пить кофе, а сборка так и не стартовала, потому что её никто не запустил руками. Конвейер, который надо толкать пальцем, - это не CI, это дорогой блокнот с кнопкой. Весь смысл непрерывной интеграции в том, чтобы код проверялся сам, сразу после коммита, без участия человека. В этом уроке разберёмся, как заставить Jenkins реагировать на события автоматически: мгновенно по пушу через webhook, по расписанию через cron, по завершении других сборок и по внешнему вызову с токеном.

Почему jenkins webhook победил, а pollSCM устаревает

Исторически Jenkins умел узнавать о новых коммитах одним способом - опросом. Это режим pollSCM: Jenkins по таймеру лезет в репозиторий и спрашивает "ну что, изменилось что-нибудь?". Если изменилось - запускает сборку, если нет - ждёт следующего тика. Работает, но представь сотню джоб, каждая дёргает git раз в минуту. Это лишний трафик, лишняя нагрузка на контроллер и на сам git-сервер, и при этом задержка: запушил в 10:00:10, а опрос был в 10:00:00, значит ждёшь почти минуту до старта.

Современный подход переворачивает логику. Не Jenkins спрашивает GitHub, а GitHub сам стучится в Jenkins, как только произошёл push. Это и есть jenkins webhook: GitHub отправляет HTTP POST на специальный URL твоего Jenkins, тот понимает, какой репозиторий обновился, и запускает связанные джобы. Никакого опроса, никакой задержки, нулевой холостой трафик. Сборка стартует через секунду после пуша.
Правило 2026: webhook - выбор по умолчанию для всех проектов, которые видят твой Jenkins из интернета или из внутренней сети с доступом до контроллера. pollSCM оставляй только там, где webhook физически не настроить - например, Jenkins за NAT без публичного адреса и без прокси.
В декларативном конвейере оба способа задаются в блоке triggers. Вот как выглядит современный jenkins trigger по пушу из GitHub:

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

pipeline {
    agent any

    triggers {
        // Запуск по webhook от GitHub: GitHub сам уведомляет Jenkins
        githubPush()
    }

    stages {
        stage('Build') {
            steps {
                sh 'make build'
            }
        }
        stage('Test') {
            steps {
                sh 'make test'
            }
        }
    }
}
А вот тот же смысл, но через устаревающий опрос. Обрати внимание на cron-строку внутри - Jenkins будет опрашивать git каждые пять минут:

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

pipeline {
    agent any

    triggers {
        // Устаревающий способ: Jenkins сам опрашивает репозиторий
        pollSCM('H/5 * * * *')
    }

    stages {
        stage('Build') {
            steps { sh 'make build' }
        }
    }
}
Важный нюанс: чтобы триггер из Jenkinsfile вообще зарегистрировался, конвейер должен сначала собраться хотя бы один раз вручную. Jenkins читает блок triggers только после первого прогона - до этого он просто не знает, что джоба чего-то ждёт. Это классическая ловушка новичка: "почему мой githubPush не работает?" - а он ещё ни разу не запускался руками.

Изображение

Настройка github webhook: со стороны GitHub и со стороны Jenkins

Чтобы jenkins github webhook заработал, нужно свести две стороны. Начнём с GitHub. Заходишь в репозиторий, Settings -> Webhooks -> Add webhook. Заполняешь:
  • Payload URL - адрес твоего Jenkins с хвостом /github-webhook/. Например http://jenkins.cyberlake.ru/github-webhook/. Слэш на конце обязателен, без него прилетит 404.
  • Content type - выбирай application/json.
  • Secret - произвольная секретная строка. GitHub подпишет ей запрос, а Jenkins проверит подпись и отбросит чужие POST-ы. Не пропускай этот шаг на проде.
  • Which events - для большинства задач хватает "Just the push event". Если нужны сборки по pull request, добавь соответствующие события.
Со стороны Jenkins должен стоять плагин GitHub (он же тянет GitHub API и обработчик того самого /github-webhook/). В настройках джобы, если это не Pipeline-from-SCM, включается галка "GitHub hook trigger for GITScm polling" - название историческое и немного путает, но это и есть приём webhook-ов. В декларативном Jenkinsfile, как мы видели выше, достаточно githubPush().

Если у тебя GitLab, логика та же самая, меняется только плагин (GitLab Plugin) и директива триггера - gitlabPush() или generic webhook. Суть одна: внешняя система пушит событие, Jenkins ловит.

В духе 2026 эти настройки удобно держать не кликами в UI, а в коде через Configuration as Code (JCasC). Тогда новый Jenkins поднимается с уже прописанными кредами и эндпоинтами. Кусок jenkins.yaml для GitHub-сервера выглядит так:

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

unclassified:
  gitHubPluginConfig:
    configs:
      - name: "cyberlake-github"
        apiUrl: "https://api.github.com"
        manageHooks: true
        credentialsId: "github-token"
Расписание по cron, H для размазывания и сборка по цепочке

Не всё запускается по пушу. Ночные прогоны тяжёлых тестов, еженедельная пересборка образов, регулярная очистка - это работа по расписанию. Jenkins использует cron-синтаксис из пяти полей: минута, час, день месяца, месяц, день недели.

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

pipeline {
    agent any
    triggers {
        // Каждую ночь между 2:00 и 2:59 - точную минуту выберет Jenkins
        cron('H 2 * * *')
    }
    stages {
        stage('Nightly') {
            steps { sh './run-nightly-suite.sh' }
        }
    }
}
Главная фишка Jenkins - символ H ("hash"). Если ты напишешь cron('0 2 * * *') на пятидесяти джобах, все они стартанут ровно в 2:00:00 и положат агентов одним залпом. Символ H говорит Jenkins: "выбери минуту сам, но стабильно для этой джобы, на основе её имени". В итоге одна джоба пойдёт в 2:07, другая в 2:43 - нагрузка размазана. Используй H везде, где точная минута не критична: H/15 * * * * - примерно раз в 15 минут, H H(0-7) * * * - случайно выбранное время ночью.

Отдельный класс - сборка после других проектов. Если проект B должен собираться только после успешной сборки проекта A (upstream/downstream), это задаётся триггером upstream:

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

triggers {
    // Запуск после успешного завершения сборки проекта A
    upstream(upstreamProjects: 'project-a', threshold: hudson.model.Result.SUCCESS)
}
Так строятся цепочки: собрали библиотеку - автоматически пересобрали зависящий от неё сервис.

И ещё два инструмента. Первый - запуск по удалённому вызову. В настройках джобы включаешь "Trigger builds remotely" и задаёшь токен. После этого сборку дёргает простой curl, что удобно для интеграции со сторонними системами:

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

curl -X POST "https://jenkins.cyberlake.ru/job/my-job/build?token=MY_SECRET_TOKEN"
Второй - период тишины (quiet period). Это пауза между срабатыванием триггера и реальным стартом сборки. Зачем? Чтобы склеить серию быстрых пушей в один прогон. Запушил пять коммитов за минуту - получишь одну сборку, а не пять. Глобально настраивается в Manage Jenkins, а для конкретной джобы переопределяется в options:

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

pipeline {
    agent any
    options {
        quietPeriod(30)   // ждать 30 секунд после триггера
    }
    triggers { githubPush() }
    stages {
        stage('Build') { steps { sh 'make' } }
    }
}
Для сравнения с конкурентами: в GitHub Actions и GitLab CI триггеры зашиты в сам YAML-пайплайн (on: push, on: schedule, rules), webhook между платформой и раннером настраивать не надо - он встроен. Это проще на старте, но Jenkins выигрывает гибкостью, когда у тебя зоопарк из разных SCM, внешних систем и хитрых цепочек джоб.

Типичные грабли
  • githubPush() не срабатывает, а джоба ни разу не запускалась руками. Запусти один раз вручную, чтобы Jenkins прочитал блок triggers.
  • Забыл слэш в Payload URL. Нужно ровно /github-webhook/, иначе GitHub получает 404. Проверь во вкладке Recent Deliveries на стороне GitHub - там виден код ответа.
  • Jenkins за NAT, GitHub не достучаться. Либо публичный адрес/реверс-прокси, либо как временное решение - ngrok для теста, либо честно остаёшься на pollSCM.
  • Все ночные джобы в 0 минут. Меняй на H - размажешь пик нагрузки.
  • Поставил и webhook, и pollSCM "на всякий случай". Не надо: получишь двойные сборки и лишний опрос. Выбери один способ.
Мини-лаба
  • Создай Pipeline-джобу из своего GitHub-репозитория с githubPush() в Jenkinsfile и запусти её один раз руками.
  • Настрой webhook на стороне GitHub (Payload URL с /github-webhook/, secret, push event). Сделай коммит и убедись, что сборка стартовала сама.
  • Открой Recent Deliveries на GitHub и посмотри код ответа на доставку хука.
  • Добавь вторую джобу с cron('H 3 * * *') и сравни, на какую минуту Jenkins её поставил.
  • Свяжи две джобы через upstream и проверь, что вторая стартует после первой.
Контрольные вопросы
  • Чем webhook принципиально отличается от pollSCM и почему первый предпочтительнее в 2026?
  • Что нужно указать в Payload URL на стороне GitHub и почему важен слэш на конце?
  • Зачем нужен символ H в cron-строке и чем он лучше явной минуты?
  • Что делает quiet period и в какой ситуации он экономит сборки?
Итог

Автоматический запуск - это сердце CI. Запомни главное: webhook от GitHub или GitLab толкает сборку мгновенно по пушу и не грузит систему холостым опросом - это стандарт по умолчанию. pollSCM остаётся аварийным вариантом для сетей, где webhook не настроить. Cron с символом H закрывает регулярные задачи без пиков нагрузки, upstream строит цепочки джоб, токен даёт внешний запуск, а quiet period склеивает пачку пушей в одну сборку. Настрой это один раз правильно - и забудешь про кнопку "Build Now" навсегда.
👍3 ❤️1 🔥2 😄 🤔
Аватара пользователя
golangaddict
Сообщения: 1
Зарегистрирован: 11 май 2026, 06:00

Re: Триггеры сборки: webhook от GitHub, SCM polling и расписание

Сообщение golangaddict »

Наконец-то дошло, почему githubPush() молчал - джоба ни разу не запускалась руками, и Jenkins просто не прочитал triggers. Запустил вручную - всё полетело. Спасибо за этот момент, час убил вчера.
👍 ❤️1 🔥1 😄 🤔
Аватара пользователя
hhoops
Сообщения: 1
Зарегистрирован: 15 май 2026, 02:04

Re: Триггеры сборки: webhook от GitHub, SCM polling и расписание

Сообщение hhoops »

А подскажите, если Jenkins внутри корпоративной сети без белого ip, webhook вообще никак не прикрутить кроме pollSCM? Или реверс-прокси наружу нормальная практика для прода?
👍 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Условное выполнение when и блок post
Следующая глава →
Параметры сборки и пользовательский ввод

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

Поделиться темой: ✈ Telegram VK
  • Похожие темы
Похожие запросы: webhook от github в jenkins как настроить триггер сборки

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

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

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