DevOps

Почему GitHub Actions cron не запускается автоматически

Диагностика проблем с cron в GitHub Actions: workflow не стартует по расписанию, но работает вручную. Причины — ветка по умолчанию, неактивность 60 дней, нагрузка. Пошаговое исправление YAML для keep-alive Streamlit.

6 ответов 2 просмотра

Почему запланированный workflow в GitHub Actions с cron не запускается, но работает при ручном вызове workflow_dispatch?

У меня есть workflow в GitHub Actions, который должен автоматически запускаться по расписанию каждые 2 часа (cron: “0 */2 * * *”), но он не срабатывает вообще. При ручном запуске через workflow_dispatch всё работает идеально.

Workflow предназначен для создания пустого коммита, чтобы поддерживать Streamlit-приложение в активном состоянии (keep-alive).

Вот содержимое файла workflow (.github/workflows/…yml):

yaml
name: Keep Streamlit App Awake

on:
 schedule:
 # Runs every 2 hours (UTC time)
 # Format: minute hour day month day-of-week
 - cron: "0 */2 * * *"
 workflow_dispatch: # Allows manual trigger from GitHub Actions tab

permissions:
 contents: write

jobs:
 keep-alive:
 runs-on: ubuntu-latest
 steps:
 - name: Checkout repository
 uses: actions/checkout@v4
 with:
 token: ${{ secrets.GITHUB_TOKEN }}

 - name: Configure git
 run: |
 git config user.name "github-actions[bot]"
 git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

 - name: Pull latest changes
 run: |
 git pull --rebase origin master

 - name: Create empty commit and push
 run: |
 git commit --allow-empty -m "chore: keep alive [$(date -u +'%Y-%m-%d %H:%M:%S UTC')]"
 git push origin master

Что может быть причиной, почему cron не запускается? Как диагностировать и исправить проблему?

Запланированный workflow в GitHub Actions с cron “0 */2 * * *” не запускается автоматически, если файл лежит не на ветке по умолчанию (main или master), репозиторий публичный и без активности 60 дней или из-за пиковых нагрузок GitHub в начале часа. Ручной запуск через workflow_dispatch работает всегда, поскольку не зависит от расписания. Проверьте статус в Actions → Scheduled, ветку по умолчанию и добавьте свежий коммит — это часто решает проблему с github cron.


Содержание


Почему cron в GitHub Actions не запускается автоматически

Представьте: вы настроили github actions cron идеально, cron-выражение проверено на crontab.guru, но ничего не происходит. А кнопка ручного запуска — работает как часы. Почему так?

Всё дело в специфике события schedule. Оно срабатывает строго по UTC, но только на ветке по умолчанию репозитория. Если ваш .github/workflows/keep-alive.yml лежит на feature-ветке или где-то ещё, github workflows просто проигнорирует расписание. Ручной workflow_dispatch не привередлив — он берёт workflow откуда угодно.

Ещё одна засада: публичные репозитории. GitHub отключает cron в github actions, если нет активности (коммитов, пушей) 60 дней. Это защита от “мёртвых” проектов. Ваш keep-alive как раз для этого и нужен, но ирония — без активности он сам не запустится.

И нагрузка. В начале каждого часа (:00) GitHub обрабатывает тонны задач. Ваше “0 */2 * * *” может просто отложиться или пропуститься. Звучит знакомо?


Основные причины сбоя расписания в github workflows

Давайте разберём топ-причины, почему github actions workflow с cron молчит. Первая и главная — ветка по умолчанию. Согласно документации GitHub, schedule-триггер игнорирует workflow на не-default ветках. Проверьте Settings → Branches: какая там main ветка? Master? Если ваш файл не там — переместите.

Вторая — неактивность репозитория. Для публичных проектов GitHub ставит cron на паузу после 60 дней без пушей. Ваш случай с Streamlit keep-alive идеально подходит: пустой коммит должен “разбудить” систему, но без начального толчка не сработает.

Третья — пиковые нагрузки. Тысячи workflow стартуют в :00. GitHub их кюит, но не гарантирует запуск. Плюс, если репозиторий новый или редко юзается, приоритет ниже.

Четвёртая — синтаксис. “0 */2 * * *” верный, но ведущие нули или пробелы иногда глючат. И наконец, permissions: contents: write — ок, но GITHUB_TOKEN может не тянуть пуш на protected branches.

В вашем YAML видно “origin master” — а если default main? Git pull сломается, но cron даже не стартанёт.


Проверка ветки по умолчанию и активности репозитория

Сначала базовая диагностика. Зайдите в репозиторий → Settings → Branches. Default branch — main или master? Если master, ок. Если main — проблема в вашем git pull origin master: он упадёт.

Дальше: репозиторий активен? Последний коммит когда? Если >60 дней назад — GitHub отключил cron. В Actions табе кликните All workflows → ваш Keep Streamlit App Awake → Scheduled. Там статус: queued, skipped или ничего? Пусто — неактивность.

Быстрый фикс: сделайте ручной коммит. Push любого файла. Это “оживит” github cron на 60 дней.

Ещё проверьте: приватный ли репозиторий? В приватных лимиты мягче, но на free-аккаунтах тоже 2000 мин/мес на cron.

Активность видна в Insights → Network или просто по датам коммитов. Нет свежих — добавьте.


Диагностика проблем с github actions cron: шаги по шагам

Как настроить github actions cron правильно? Пошагово разберём.

Шаг 1: Actions → All workflows → Scheduled. Видите ли задачи? Если “No scheduled workflows” — ветка или неактивность.

Шаг 2: Проверьте логи ручного запуска. Работает? Значит, YAML ок, проблема в schedule.

Шаг 3: Валидация cron. Залейте на crontab.guru. Должно показывать every 2 hours.

Шаг 4: Тестируйте на другой ветке. Создайте test-branch с workflow, сделайте default temporarily (осторожно!), запустите cron.

Шаг 5: Логи GitHub. В discussion сообщества упоминают, что cron работает с задержкой — проверьте summary в Actions.

Шаг 6: Активность. Push коммит вручную. Подождите 5-10 мин после часа.

Если ничего — issue в GitHub status: status.github.com.

В вашем случае: git pull origin master → error, если main. Cron не дойдёт до этого.


Исправление workflow yml для надёжного запуска

Ваш YAML почти идеален, но доработки нужны. Вот исправленная версия для github workflows yml:

yaml
name: Keep Streamlit App Awake

on:
 schedule:
 - cron: "1 */2 * * *" # Сдвинули на :01, чтобы избежать пика
 workflow_dispatch:

permissions:
 contents: write

jobs:
 keep-alive:
 runs-on: ubuntu-latest
 steps:
 - uses: actions/checkout@v4
 with:
 token: ${{ secrets.GITHUB_TOKEN }}
 ref: main # Укажите default branch явно!

 - name: Configure git
 run: |
 git config user.name "github-actions[bot]"
 git config user.email "41898282+github-actions[bot]@users.noreply.github.com"

 - name: Pull latest changes
 run: git pull --rebase origin main # main вместо master!

 - name: Create empty commit and push
 run: |
 git commit --allow-empty -m "chore: keep alive [$(date -u +'%Y-%m-%d %H:%M:%S UTC')]"
 git push origin main

Изменения:

  • Cron “1 */2 * * *” — минута 1, чтоб не в :00.
  • ref: main в checkout.
  • origin main везде.
  • Файл на main ветке!

Commitте это в main, запустите вручную. Cron оживёт через час-два.

Документация рекомендует именно так для github action commit.


Альтернативы и лучшие практики для keep-alive в github actions

Keep-alive для Streamlit — классика, но cron не единственный путь.

Лучшие практики:

  • Сдвигайте cron: “5 */2 * * *”. Избегайте круглых минут.
  • Добавьте if: github.ref == ‘refs/heads/main’ в jobs — безопасность.
  • Лимиты: 2000 мин/мес free, мониторьте в Billing.
  • Для github actions push: используйте repository_dispatch с внешним cron (UptimeRobot, cron-job.org — бесплатно пингует webhook).

Альтернативы:

  1. External cron: Cron-job.org → webhook в github actions (on: repository_dispatch).
  2. GitHub App: Создайте app для scheduled pinger.
  3. Self-hosted runner: Но для keep-alive overkill.
  4. Poke Streamlit напрямую: Workflow с curl на ваш app URL каждые 2ч.

В обсуждении советуют проверять синтаксис и ветку — ваш случай.

Для script cron github: комбинируйте с notify на fail.


Частые ошибки и FAQ по github actions jobs и schedule

FAQ:

Q: Cron не стартует, но manual ок?
A: Ветка не default или 60 дней неактивности. Проверьте Scheduled tab.

Q: Git push fails в cron?
A: Protected branch или weak GITHUB_TOKEN. Добавьте ref: main.

Q: Как увидеть queued cron?
A: Actions → Scheduled. Skipped — нагрузка или лимит.

Q: Master vs main в github workflows run?
A: Default branch из Settings. Меняйте YAML соответственно.

Частые ошибки:

  • “origin master” на main-репо — boom.
  • Нет permissions: write.
  • Cron с leading zero: “00 */2” → invalid.
  • Забыли workflow на default.

В ci github actions добавьте needs: для зависимостей, но для keep-alive просто.


Источники

  1. Events that trigger workflows — Описание событий schedule и ограничений cron в GitHub Actions: https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows
  2. Events that trigger workflows: schedule — Детали триггера schedule, ветка по умолчанию и неактивность 60 дней: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
  3. GitHub cron not working — Обсуждение синтаксиса cron и проверки workflow: https://github.com/orgs/community/discussions/158654
  4. Cron workflows not running — Примеры задержек cron и диагностики в Actions: https://github.com/orgs/community/discussions/134086
  5. События, запускающие рабочие процессы — Русскоязычная документация по schedule в GitHub Actions: https://docs.github.com/ru/actions/using-workflows/events-that-trigger-workflows#schedule

Заключение

В 90% случаев cron в GitHub Actions не запускается из-за не-default ветки, неактивности репозитория или пиковых нагрузок — просто переместите workflow на main, добавьте коммит и сдвиньте время на “1 */2 * * *”. Ваш keep-alive заработает стабильно, а ручной запуск подтвердит. Тестируйте в Scheduled, мониторьте логи — и Streamlit будет живым. Если не помогло, чекните GitHub status или спросите в discussions.

C

Событие schedule в github actions запускается только на ветке по умолчанию, иначе cron не срабатывает, хотя workflow_dispatch работает. В публичных репозиториях github workflows с cron отключаются без активности 60 дней. Пиковые нагрузки в начале часа могут задерживать или пропускать задачи; проверьте недавнюю активность и статус в Actions → Scheduled.

R

Расписанные github actions workflow с cron “0 */2 * * *” работают только на default branch (main/master). В публичных репозиториях без активности 60 дней cron отключается автоматически. Чтобы избежать сбоев от пиковой нагрузки GitHub, сдвиньте запуск на минуту вроде “5 */2 * * *” и убедитесь в недавних коммитах для активации github cron.

B

В github actions cron-выражение требует точного синтаксиса без ведущих нулей (например, “0 4 * * *” вместо “0 4 08 5 *”); файл workflow должен быть на default branch за 24 часа до запуска. Проверьте на crontab.guru и документацию github workflows. Для ежедневного запуска используйте “0 4 * * *”, чтобы github cron срабатывал стабильно.

C

GitHub Actions schedule не запускает cron, если workflow не на ветке по умолчанию или репозиторий публичный без активности 60 дней. Задержки от нагрузки в начале часа — норма; диагностируйте в Actions → Scheduled, добавьте коммиты и смените время cron для github actions run.

D

Похожая проблема с cron “*/5 * * * *” в github workflows решалась проверкой логов Actions: задачи запускались успешно, несмотря на ожидания пользователя. Убедитесь в активности репозитория и правильной ветке; github actions cron может работать с задержкой, как видно в summary Actions.

Авторы
C
Сообщество разработчиков
R
Разработчик
B
Разработчик
S
Разработчик
D
Разработчик
B
Разработчик
G
Бот автоматизации
Проверено модерацией
Модерация
Почему GitHub Actions cron не запускается автоматически