Почему GitHub Actions cron не запускается автоматически
Диагностика проблем с cron в GitHub Actions: workflow не стартует по расписанию, но работает вручную. Причины — ветка по умолчанию, неактивность 60 дней, нагрузка. Пошаговое исправление YAML для keep-alive Streamlit.
Почему запланированный workflow в GitHub Actions с cron не запускается, но работает при ручном вызове workflow_dispatch?
У меня есть workflow в GitHub Actions, который должен автоматически запускаться по расписанию каждые 2 часа (cron: “0 */2 * * *”), но он не срабатывает вообще. При ручном запуске через workflow_dispatch всё работает идеально.
Workflow предназначен для создания пустого коммита, чтобы поддерживать Streamlit-приложение в активном состоянии (keep-alive).
Вот содержимое файла workflow (.github/workflows/…yml):
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 workflows
- Проверка ветки по умолчанию и активности репозитория
- Диагностика проблем с github actions cron: шаги по шагам
- Исправление workflow yml для надёжного запуска
- Альтернативы и лучшие практики для keep-alive в github actions
- Частые ошибки и FAQ по github actions jobs и schedule
- Источники
- Заключение
Почему 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:
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).
Альтернативы:
- External cron: Cron-job.org → webhook в github actions (on: repository_dispatch).
- GitHub App: Создайте app для scheduled pinger.
- Self-hosted runner: Но для keep-alive overkill.
- 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 просто.
Источники
- Events that trigger workflows — Описание событий schedule и ограничений cron в GitHub Actions: https://docs.github.com/en/actions/learn-github-actions/events-that-trigger-workflows
- Events that trigger workflows: schedule — Детали триггера schedule, ветка по умолчанию и неактивность 60 дней: https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule
- GitHub cron not working — Обсуждение синтаксиса cron и проверки workflow: https://github.com/orgs/community/discussions/158654
- Cron workflows not running — Примеры задержек cron и диагностики в Actions: https://github.com/orgs/community/discussions/134086
- События, запускающие рабочие процессы — Русскоязычная документация по 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.
Событие schedule в github actions запускается только на ветке по умолчанию, иначе cron не срабатывает, хотя workflow_dispatch работает. В публичных репозиториях github workflows с cron отключаются без активности 60 дней. Пиковые нагрузки в начале часа могут задерживать или пропускать задачи; проверьте недавнюю активность и статус в Actions → Scheduled.
Расписанные github actions workflow с cron “0 */2 * * *” работают только на default branch (main/master). В публичных репозиториях без активности 60 дней cron отключается автоматически. Чтобы избежать сбоев от пиковой нагрузки GitHub, сдвиньте запуск на минуту вроде “5 */2 * * *” и убедитесь в недавних коммитах для активации github cron.
В github actions cron-выражение требует точного синтаксиса без ведущих нулей (например, “0 4 * * *” вместо “0 4 08 5 *”); файл workflow должен быть на default branch за 24 часа до запуска. Проверьте на crontab.guru и документацию github workflows. Для ежедневного запуска используйте “0 4 * * *”, чтобы github cron срабатывал стабильно.
GitHub Actions schedule не запускает cron, если workflow не на ветке по умолчанию или репозиторий публичный без активности 60 дней. Задержки от нагрузки в начале часа — норма; диагностируйте в Actions → Scheduled, добавьте коммиты и смените время cron для github actions run.
Похожая проблема с cron “*/5 * * * *” в github workflows решалась проверкой логов Actions: задачи запускались успешно, несмотря на ожидания пользователя. Убедитесь в активности репозитория и правильной ветке; github actions cron может работать с задержкой, как видно в summary Actions.