Jenkins: Cron — Периодическая Сборка — Параметры

Задача (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 * * * *

Из документация Jenkins-кода:

Для того, чтобы периодически выполняемые по расписанию задачи могли производить равномерную нагрузку на систему, по возможности следует использовать символ 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! Читать далее →