Основы: Workflow, Jobs и Steps. Вся автоматизация в GitHub Actions описывается в YAML-файлах, которые размещаются в директории `.github/workflows/` вашего репозитория. Базовые понятия:
- **Workflow**: Один автоматизированный процесс. Он активируется событием (event), например, push или pull request.
- **Job**: Набор шагов, которые выполняются на одном раннере (виртуальной машине). Jobs могут выполняться последовательно или параллельно.
- **Step**: Отдельная задача, которая может выполнять команды shell или запускать экшн (action).
Шаг 1: Триггеры (events) — гибкость и контроль. Глубокое понимание триггеров — ключевая особенность. Помимо стандартных `push` и `pull_request`, можно использовать:
- `schedule`: Запуск по расписанию (cron-синтаксис), идеально для ночных сборок или периодических задач.
- `workflow_dispatch`: Ручной запуск из интерфейса GitHub с возможностью передачи входных параметров (inputs).
- `repository_dispatch`: Запуск извне через API GitHub.
- События issues, releases, labels.
Шаг 2: Выбор раннера и матрица сборок. Вы можете использовать GitHub-hosted раннеры (на Ubuntu, Windows, macOS) или настроить собственные (self-hosted) для специфических требований (например, аппаратного ускорения). Мощный инструмент — `matrix strategy`. Он позволяет запустить один job в нескольких конфигурациях параллельно. Например, протестировать ваше приложение на разных версиях Node.js, Python или в разных операционных системах одним определением. Это drastically увеличивает покрытие тестов без дублирования кода workflow.
Шаг 3: Экшены (Actions) — сила сообщества. Экшены — это переиспользуемые компоненты, которые можно включать в свои steps. На Marketplace тысячи экшенов для самых разных задач: деплой на AWS/Azure/Google Cloud, отправка сообщений в Slack/Telegram, управления Docker, линтинга кода и т.д. Лайфхак: Всегда указывайте версию экшена с помощью тега (например, `actions/checkout@v3`) или SHA-коммита, а не ветки `@main`. Это гарантирует стабильность и воспроизводимость вашего пайплайна.
Шаг 4: Управление секретами и переменными. Никогда не храните пароли, токены или ключи API прямо в YAML-файле. Используйте Secrets (`Settings -> Secrets and variables -> Actions`) для конфиденциальных данных и Variables для несекретных значений (например, домена приложения). Лайфхак: Для self-hosted раннеров в корпоративной среде используйте HashiCorp Vault или AWS Secrets Manager вместе с экшенами для их интеграции, чтобы централизованно управлять секретами.
Шаг 5: Кэширование зависимостей — главный лайфхак для скорости. Самая большая трата времени в CI — повторная установка одних и тех же зависимостей (npm, pip, Maven packages). GitHub Actions предоставляет встроенный механизм кэширования через экшен `actions/cache`. Вы можете закэшировать директории вроде `node_modules`, `~/.cache/pip` или `~/.m2`. Ключ кэша должен включать хэш файла с зависимостями (например, `package-lock.json`), чтобы инвалидировать кэш при их изменении. Это может сократить время выполнения job с минут до секунд.
Шаг 6: Артефакты и зависимости между Jobs. Часто результат одного job (например, собранный бинарник или отчет о тестировании) нужен в другом job. Для этого используйте `upload-artifact` и `download-artifact`. Важно понимать концепцию `needs`, которая определяет зависимости между jobs. Job B с `needs: [job-a]` начнется только после успешного завершения Job A. Это позволяет создавать сложные, но четко структурированные пайплайны: lint -> build -> test on matrix -> deploy.
Шаг 7: Отладка и мониторинг. Когда workflow падает, логи могут быть объемными. Используйте `act` — утилиту для локального запуска GitHub Actions, чтобы отлаживать сложные сценарии на своей машине перед коммитом. В самом GitHub используйте аннотации: вы можете выводить предупреждения или ошибки прямо в интерфейсе пул-реквеста с помощью специальных команд в выводе скриптов. Для мониторинга частоты и длительности workflow используйте встроенные графики в Insights репозитория или интегрируйте с внешними дашбордами.
Продвинутые лайфхаки:
- **Reusable Workflows**: Вынесите общую логику (например, сборку Docker-образа) в отдельный workflow и вызывайте его из других с помощью `uses`. Это устраняет дублирование.
- **Вложенные матрицы и динамические конфигурации**: Генерируйте матрицу job'ов динамически с помощью вывода шага, используя `fromJson`. Это полезно для тестирования против списка сред, полученного из внешнего API.
- **Оптимизация стоимости**: Для приватных репозиториев минуты выполнения лимитированы. Используйте `if: github.event_name == 'pull_request'` для запуска легковесных проверок, а полную сборку — только при мерже в main. Отменяйте старые запуски при новом коммите с помощью `concurrency`.
- **Кастомные раннеры с Docker**: Запускайте steps внутри специфических Docker-контейнеров, указав `container:` в job. Это обеспечивает идеально воспроизводимое окружение.
Комментарии (13)