Мониторинг GitHub Actions по расписанию
Триггер schedule превращает GitHub Actions в бесплатный cron, и многие команды гоняют на нём ночные синхронизации, отчёты и очистку. Но у него есть особенности, которые легко упустить, а запуск, который не состоялся, нигде не отображается как ошибка.
Что нужно знать о workflow по расписанию
- Время — в UTC.
0 9 * * *запускается в 09:00 по UTC, то есть в 12:00 по Москве. - Запуски опаздывают или теряются. В документации GitHub сказано, что запуски по расписанию могут задерживаться при высокой нагрузке на Actions, причём начало каждого часа — одно из самых загруженных времён, а при достаточно высокой нагрузке часть задач из очереди может быть отброшена.
- Отключаются в неактивных репозиториях. В публичном репозитории workflow по расписанию автоматически отключаются после 60 дней без активности.
- Работают с основной ветки. Расписание берётся из файла workflow в основной ветке; изменения в других ветках ни на что не влияют.
- Минимальный интервал — 5 минут.
Выбирайте нечётную минуту, например 17 вместо 0, чтобы не попадать в самый загруженный момент часа.
Workflow, который отчитывается
Сохраните адрес пинга проверки в секрет репозитория HEARTCRON_URL (Settings → Secrets and variables → Actions) и сообщайте о старте и результате:
name: Nightly sync
on:
schedule:
- cron: "17 3 * * *" # 03:17 UTC, 06:17 по Москве
workflow_dispatch:
jobs:
sync:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Report the start
run: curl -fsS -m 10 --retry 3 -o /dev/null "${{ secrets.HEARTCRON_URL }}/start" || true
- name: Sync
run: ./scripts/sync.sh
- name: Report the result
if: always()
run: curl -fsS -m 10 --retry 3 -o /dev/null "${{ secrets.HEARTCRON_URL }}/${{ job.status == 'success' && '0' || 'fail' }}"
if: always()выполняет последний шаг даже при падении синхронизации и отправляет/0при успехе или/failпри ошибке.timeout-minutesостанавливает зависший запуск; вместе с/startэто видно как сбой, а не как загадка.workflow_dispatchпозволяет запустить workflow вручную и проверить всю цепочку.|| trueу пинга о старте не даст workflow упасть, если сервис мониторинга ненадолго недоступен.
Настройте проверку
Задайте то же выражение 17 3 * * * с часовым поясом UTC. Запас времени ставьте щедрый, потому что запуски часто опаздывают: для ночной задачи разумно 30–60 минут. Алерт придёт, если запуск упал, не завершился или не состоялся вовсе — в том числе в день, когда GitHub отключит расписание в неактивном репозитории.
Много workflow по расписанию
Заведите для каждого workflow свою проверку с именем по файлу workflow и храните адреса в отдельных секретах. Тогда в кабинете Heartcron сразу видно, какие расписания отработали сегодня и сколько длился каждый запуск.