# GitHub Actions

> Встроенная в GitHub система CI/CD и автоматизации — запускает рабочие процессы из YAML-файлов в репозитории по событиям push, pull request, расписанию и другим.

Источник: https://llmdocs.ru/wiki/github-actions/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Тип**: платформа CI/CD и автоматизации
- **Разработчик**: GitHub (Microsoft)
- **Анонс**: октябрь 2018
- **Общая доступность**: ноябрь 2019
- **Описание процессов**: YAML в каталоге .github/workflows/
- **Раннеры**: Linux, Windows, macOS (облачные) и self-hosted
- **Каталог готовых действий**: GitHub Marketplace
- **Бесплатно**: публичные репозитории; лимит минут для приватных
**GitHub Actions** — система автоматизации, встроенная в [GitHub](https://llmdocs.ru/wiki/github.md): она запускает **рабочие процессы** (*workflows*), описанные в YAML-файлах прямо в репозитории, в ответ на события — push, открытие [pull request](https://llmdocs.ru/wiki/pull-request.md), публикацию релиза, расписание или ручной запуск.[1] Чаще всего Actions используют для [CI/CD](https://llmdocs.ru/wiki/ci-cd.md): собрать проект, прогнать тесты и линтеры, собрать и опубликовать [образ](https://llmdocs.ru/wiki/oci-image.md), развернуть приложение. Но это и универсальный инструмент: разметка задач, генерация документации, публикация сайта на 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](https://llmdocs.ru/wiki/docker.md)-контейнер или составное действие из шагов. Хранится в репозитории и подключается по ссылке `владелец/репо@версия`.
- **Runner** — машина, исполняющая задание: облачная виртуальная машина GitHub (`ubuntu-latest`, `windows-latest`, `macos-latest`) или собственная (*self-hosted*).

## Пример

```yaml
# .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](https://llmdocs.ru/wiki/gitlab-ci.md) или другую систему требует переписывания.

## См. также

- [CI/CD](https://llmdocs.ru/wiki/ci-cd.md)
- [GitLab CI](https://llmdocs.ru/wiki/gitlab-ci.md)
- [Управление секретами](https://llmdocs.ru/wiki/secrets-management.md)
- [Семантическое версионирование](https://llmdocs.ru/wiki/semver.md)

## Источники

1. [GitHub Docs — GitHub Actions](https://docs.github.com/en/actions)
2. [GitHub Docs — Workflow syntax for GitHub Actions](https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions)
3. [GitHub Docs — Events that trigger workflows](https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows)
4. [GitHub Docs — Security hardening for GitHub Actions](https://docs.github.com/en/actions/security-for-github-actions/security-guides/security-hardening-for-github-actions)
5. [GitHub Docs — About security hardening with OpenID Connect](https://docs.github.com/en/actions/security-for-github-actions/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
6. [GitHub Blog — GitHub Actions now supports CI/CD, free for public repositories (2019)](https://github.blog/news-insights/product-news/github-actions-now-supports-ci-cd/)
7. [CISA — Supply chain compromise of tj-actions/changed-files (CVE-2025-30066)](https://www.cisa.gov/news-events/alerts/2025/03/18/supply-chain-compromise-third-party-tj-actionschanged-files-cve-2025-30066-and-reviewdogaction)
