GitHub Actions
| Тип | платформа CI/CD и автоматизации |
|---|---|
| Разработчик | GitHub (Microsoft) |
| Анонс | октябрь 2018 |
| Общая доступность | ноябрь 2019 |
| Описание процессов | YAML в каталоге .github/workflows/ |
| Раннеры | Linux, Windows, macOS (облачные) и self-hosted |
| Каталог готовых действий | GitHub Marketplace |
| Бесплатно | публичные репозитории; лимит минут для приватных |
GitHub Actions — система автоматизации, встроенная в GitHub: она запускает рабочие процессы (workflows), описанные в YAML-файлах прямо в репозитории, в ответ на события — push, открытие pull request, публикацию релиза, расписание или ручной запуск.[1] Чаще всего Actions используют для CI/CD: собрать проект, прогнать тесты и линтеры, собрать и опубликовать образ, развернуть приложение. Но это и универсальный инструмент: разметка задач, генерация документации, публикация сайта на GitHub Pages, обновление зависимостей.
История
GitHub анонсировал Actions в октябре 2018 года как средство автоматизации, а в ноябре 2019 года выпустил с полноценной поддержкой CI/CD и бесплатными минутами для публичных репозиториев.[6] Благодаря интеграции в саму платформу и каталогу готовых действий (Marketplace) сервис быстро потеснил внешние CI-системы — Travis CI, CircleCI — в открытых проектах.
Устройство
- Workflow — YAML-файл в
.github/workflows/. В репозитории их может быть сколько угодно. - Событие (
on:) — что запускает процесс:push,pull_request,schedule(cron),workflow_dispatch(кнопка),releaseи десятки других.[3] - Job — набор шагов, выполняемых на одной машине. Задания идут параллельно, если не связаны через
needs:. - Step — шаг: либо команда оболочки (
run:), либо готовое действие (uses:). - Action — переиспользуемый компонент: JavaScript-код, Docker-контейнер или составное действие из шагов. Хранится в репозитории и подключается по ссылке
владелец/репо@версия. - Runner — машина, исполняющая задание: облачная виртуальная машина GitHub (
ubuntu-latest,windows-latest,macos-latest) или собственная (self-hosted).
Пример
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python: ["3.12", "3.13"]
steps:
- uses: actions/checkout@v4
- uses: astral-sh/setup-uv@v6
- run: uv sync --python ${{ matrix.python }}
- run: uv run pytest
deploy:
needs: test
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- run: ./deploy.sh
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
Матрица (strategy.matrix) запускает задание для каждого сочетания параметров — версий языка, операционных систем. Выражения ${{ ... }} дают доступ к контексту: ветке, событию, секретам, выходам предыдущих шагов.[2]
Секреты и права
Секреты задаются в настройках репозитория, окружения или организации и попадают в процесс через secrets.*; в логах они маскируются. Каждый запуск получает временный токен GITHUB_TOKEN для работы с API репозитория — его права стоит сужать блоком permissions:. Окружения (environments) добавляют свои секреты и правила: обязательное одобрение человеком, ограничение веток.
Вместо долгоживущих ключей облаков рекомендуется OIDC: процесс получает подписанный токен от GitHub и обменивает его на временные учётные данные у провайдера, который доверяет конкретному репозиторию и ветке.[5]
Безопасность
Actions — частая цель атак на цепочку поставок:[4]
- Фиксируйте сторонние действия по хешу коммита, а не по тегу: тег можно перенаправить. В марте 2025 года злоумышленники переписали теги популярного действия
tj-actions/changed-files, и в логах тысяч репозиториев оказались секреты.[7] - Событие
pull_request_targetвыполняется с секретами и правами целевого репозитория — запускать в нём код из чужого PR опасно. - Не подставляйте недоверенные данные (заголовок PR, имя ветки) в
run:через${{ }}— это инъекция команд; передавайте их через переменные окружения. - Self-hosted раннеры в публичных репозиториях позволяют любому, кто откроет PR, выполнить код на вашей машине.
Переиспользование
- Составные действия (
runs.using: composite) — набор шагов в отдельномaction.yml. - Переиспользуемые workflow (
on: workflow_call) — целый процесс, вызываемый из других репозиториев. - Кеш (
actions/cache, встроенный кеш в setup-действиях) и артефакты (actions/upload-artifact) ускоряют сборки и передают файлы между заданиями.
Отладка локально возможна утилитой act, которая запускает workflow в Docker; статус и логи удобно смотреть через gh run list и gh run watch.
Ограничения
Облачные раннеры ограничены по времени задания (6 часов) и бесплатным минутам для приватных репозиториев; минуты macOS и Windows тарифицируются дороже Linux. YAML-логика с выражениями быстро становится трудночитаемой, а процесс жёстко привязан к GitHub — переезд на GitLab CI или другую систему требует переписывания.
См. также
Источники
- GitHub Docs — GitHub Actions
- GitHub Docs — Workflow syntax for GitHub Actions
- GitHub Docs — Events that trigger workflows
- GitHub Docs — Security hardening for GitHub Actions
- GitHub Docs — About security hardening with OpenID Connect
- GitHub Blog — GitHub Actions now supports CI/CD, free for public repositories (2019)
- CISA — Supply chain compromise of tj-actions/changed-files (CVE-2025-30066)