Если вы устали от ручного деплоя, бесконечных тестов и сборок, пора знакомиться с GitHub Actions — мощным инструментом автоматизации прямо в вашем репозитории. В этой статье мы разберем не просто теорию, а конкретные, рабочие примеры workflow, которые вы сможете адаптировать под свои проекты уже сегодня.
Что такое GitHub Actions и зачем он нужен?
GitHub Actions — это платформа для автоматизации рабочих процессов (workflow) прямо на GitHub. Вы создаете YAML-файлы, которые описывают последовательность действий (jobs) и шагов (steps), выполняемых при определенных событиях (push, pull request, schedule). Это ваш личный робот-помощник для CI/CD, тестирования, уведомлений и многого другого.
Ключевые концепции: Workflow — файл .yml в папке .github/workflows. Job — набор шагов, выполняемых на одном раннере. Step — отдельная команда или действие. Action — переиспользуемый компонент, «строительный блок» workflow.
Базовый пример: Запуск тестов при каждом пуше
Самый распространенный сценарий — автоматический запуск тестового набора. Создайте файл .github/workflows/run-tests.yml:
name: Run Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- run: npm ci
- run: npm test
Этот workflow сработает при любом push или создании pull request. Он «чекаутит» код, устанавливает Node.js, зависимости и запускает тесты. Просто, но невероятно эффективно для поддержания качества кода.
Продвинутый пример: Сборка и деплой статического сайта
Допустим, у вас есть статический сайт на React/Vue или генераторе типа Hugo. Его можно автоматически собирать и деплоить на GitHub Pages.
name: Deploy to GitHub Pages
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build
run: |
npm ci
npm run build
- name: Deploy
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
Обратите внимание на secrets.GITHUB_TOKEN. Это автоматически создаваемый токен для аутентификации workflow. Для деплоя на внешние сервисы (VPS, S3) используйте секреты репозитория (Settings -> Secrets and variables -> Actions).
Пример с матрицей: Тестирование на разных версиях и ОС
Мощная фича GitHub Actions — матрицы (matrix). Они позволяют запустить один job в нескольких конфигурациях. Например, протестировать код на разных версиях Python и в разных операционных системах.
name: Test Matrix
on: [push]
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
python-version: ['3.9', '3.10', '3.11']
steps:
- uses: actions/checkout@v3
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
- run: pip install -r requirements.txt
- run: pytest
Этот workflow создаст 6 параллельных jobs (2 ОС * 3 версии Python) и выполнит тесты в каждом окружении. Идеально для обеспечения кросс-платформенной совместимости.
Пример с кэшированием: Ускорение сборок
Установка зависимостей (npm install, pip install) часто занимает много времени. Кэширование позволяет сохранять папки node_modules или pip-кеш между запусками workflow.
name: Build with Cache
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Cache Node modules
uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- run: npm run build
Ключ кэша зависит от хэша package-lock.json. Если файл не менялся, workflow восстановит кэш и пропустит долгую установку зависимостей.
Полезные шаблоны и советы
1. Запуск по расписанию (cron)
Можно запускать workflow по расписанию, например, для ежедневного обновления данных или запуска тяжелых интеграционных тестов ночью.
on:
schedule:
- cron: '0 2 * * *' # Каждый день в 02:00 UTC
2. Ручной запуск (workflow_dispatch)
Добавьте возможность запускать workflow вручную из интерфейса GitHub.
on:
workflow_dispatch:
inputs:
environment:
description: 'Environment to deploy to'
required: true
default: 'staging'
3. Условное выполнение шагов
Используйте if: для выполнения шагов только при определенных условиях.
- name: Notify on Failure
if: failure()
run: ./scripts/send-alert.sh
FAQ: Часто задаваемые вопросы
Где хранятся файлы workflow?
В папке .github/workflows/ в корне вашего репозитория. Можно создать несколько YAML-файлов для разных задач.
Есть ли лимиты на использование?
Для публичных репозиториев и тарифа Free на приватных — да. Например, 2000 минут выполнения в месяц на бесплатном тарифе. Детали — в документации GitHub.
Можно ли использовать свои собственные раннеры?
Да! Вы можете настроить self-hosted runners на своих серверах или даже локальных машинах для полного контроля над окружением.
Как отлаживать падающий workflow?
Используйте вкладку «Actions» в вашем репозитории. Там видны все запуски, логи каждого шага. Добавляйте отладочный вывод через echo или включайте debug-логирование с помощью секретов.
Можно ли повторно использовать шаги между workflow?
Да, для этого создавайте собственные Composite Actions или используйте публичные Actions из Marketplace. Это лучшая практика для стандартизации процессов.