Задача (job) в Jenkins может быть настроена на периодическую сборку из declarative pipeline, т.е. Jenkinsfile, с помощью директивы triggers
и синтаксиса cron (с небольшими отличиями), например triggers{cron('0 */3 * * *')}
.
В этой заметке показаны примеры того, как настроить периодическое выполнение задач в Jenkins, сборку multi-branch пайплайнов, а также периодическую сборку с параметрами.
Также показан синтаксис cron в Jenkins с примерами.
Дельный Совет: Условное назначение переменных в Jenkins! Читать далее →
Сборка по Расписанию в Jenkins
Планирование периодической сборки в Jenkins:
// Собирать раз в день CRON_SETTINGS = '''H H * * *''' // Multi-branch pipeline. Собирать раз в день только из "master"-ветки CRON_SETTINGS = BRANCH_NAME == "master" ? '''H H * * *''' pipeline { agent any triggers { cron(CRON_SETTINGS) } stages { stage ("Example") { steps { echo "Hello World" } } } }
Parameterized Scheduler: Для настройки периодической сборки в Jenkins с параметрами, необходимо использовать плагин parameterized-scheduler (ищите в «Manage Jenkins» → «Manage Plugins» → «Parameterized Scheduler»).
Планирование периодической сборки в Jenkins с параметрами:
// Собирать раз в день с параметрами CRON_SETTINGS = '''H H * * * % ENV=DEV''' : "" // Сборка с несколькими параметрами CRON_SETTINGS = '''H H * * * % ENV=DEV;TARGET=FRONT''' : "" // Multi-branch pipeline. Собирать раз в день только из "develop"-ветки CRON_SETTINGS = BRANCH_NAME == "develop" ? '''H H * * * % ENV=DEV;TARGET=FRONT H H * * * % ENV=DEV;TARGET=BACK''' : "" pipeline { agent any triggers { parametrizedCron(CRON_SETTINGS) } stages { stage ("Example") { steps { echo "Hello World" } } } }
Jenkins UI: Чтобы запланировать периодическую сборку с параметрами через Jenkins UI, задача (job) должена иметь параметры заранее, так как плагин отображается только в задачах в которых уже присутсвуют параметры.
Синтаксис Cron в Jenkins
Схема для лучшего понимания формата cron в Jenkins:
.---------------- минута (0 - 59) | .-------------- час (0 - 23) | | .------------ день месяца (1 - 31) | | | .---------- месяц (1 - 12) ИЛИ jan,feb,mar ... | | | | .-------- день недели (0 - 6) (Воскресенье=0 или 7) ИЛИ sun,mon,tue ... | | | | | * * * * * команда для выполнения
Существует насколько предопределенных значений, которыми можно заменять время выполнения задания в Jenkins:
Значение | Описание | Эквивалент |
---|---|---|
@yearly |
Выполнять ежегодно в любое время | H H H H * |
@annually |
Выполнять ежегодно в любое время | H H H H * |
@monthly |
Выполнять раз в месяца в любое время | H H H * * |
@weekly |
Выполнять раз в неделю в любое время | H H * * H |
@daily |
Выполнять раз в день в любое время | H H * * * |
@midnight |
Выполнять ежедневно с 00:00 до 2:59 | |
@hourly |
Выполнять раз в час в любое время | H * * * * |
Для того, чтобы периодически выполняемые по расписанию задачи могли производить равномерную нагрузку на систему, по возможности следует использовать символ
H
(обозначающий «хэш»). Например, использование0 0 * * *
для дюжины ежедневных задач вызовет большой скачок нагрузки в полночь. Для сравнения, при использованииH H * * *
, задачи по-прежнему будут выполняться раз в день, но не все в одно и то же время, что приведет к лучшему использованию ограниченных ресурсов.
Символ
H
может восприниматься как случайное значение в диапазоне, но на самом деле — это хэш имени задачи (job name), а не случайная функция, так что время выполнения задачи остается постоянным для любого проекта.
Вот самые распространенные примеры расписаний cron заданий, которые могут быть найдены практически в любом crontab
в Linux (используйте H
в примерах ниже, чтобы равномерно распределить нагрузку в Jenkins):
Рассписание | Задание |
---|---|
* * * * * |
echo «Запуск cron задания каждую минуту» |
*/5 * * * * |
echo «Запуск cron задание каждые 5 минут» |
*/30 * * * * |
echo «Запуск cron задания каждые 30 минут» |
0 * * * * |
echo «Запуск cron задания каждый час» |
0 */3 * * * |
echo «Запуск cron задания каждые 3 часа» |
0 13 * * * |
echo «Запуск cron задания каждый день в 13:00» |
30 2 * * * |
echo «Запуск cron задания каждый день в 2:30» |
0 0 * * * |
echo «Выполнять задание каждый день в полночь» |
0 0 * * 0 |
echo «Запуск cron задания каждое Воскресенье» |
0 0 * * 1 |
echo «Запуск cron задания каждый Понедельник» |
0 0 1 * * |
echo «Запуск cron задания в первый день каждого месяца» |
0 0 1 1 * |
echo «Запуск cron задания каждый год первого Января» |
Дельный Совет: Отключение автоматической сборки в Jenkins при сканировании новых веток из SCM! Читать далее →