CI/CD конвейеры на примере GitHub Actions
Вы только что сделали коммит, а теперь вручную запускаете тесты, собираете приложение и загружаете файлы на сервер. Это работает, но медленно, чревато ошибками и не масштабируется. Здесь на помощь приходят CI/CD конвейеры.
В этом руководстве мы разберём концепции CI/CD и покажем, как построить реальный конвейер с помощью GitHub Actions. К концу вы поймёте, как автоматизировать тестирование, сборку и развёртывание для любого проекта.
Что такое CI/CD?
CI (непрерывная интеграция) — это практика автоматического тестирования и слияния изменений кода в общую ветку. Каждый push запускает сборку и тесты, позволяя выявлять проблемы интеграции на раннем этапе.
CD (непрерывная доставка/развёртывание) расширяет CI, автоматически подготавливая (и, опционально, развёртывая) ваше приложение в production. Непрерывная доставка означает, что код всегда готов к развёртыванию; непрерывное развёртывание — что он развёртывается автоматически.
Вместе CI/CD образуют конвейер: последовательность автоматизированных шагов, которые проводят ваш код от коммита до production.
Почему стоит использовать GitHub Actions для CI/CD?
GitHub Actions — это платформа CI/CD, встроенная в GitHub. Она бесплатна для публичных репозиториев и предлагает щедрые минуты для приватных. Ключевые преимущества:
- Интеграция: не нужен внешний сервис; workflow живут в вашем репозитории.
- Событийная модель: запускайте workflow по push, pull request, расписанию или вручную.
- Расширяемость: тысячи готовых actions в GitHub Marketplace.
- Матричные сборки: легко тестируйте на разных ОС и версиях языков.
Основные концепции GitHub Actions
Прежде чем писать свой первый workflow, ознакомьтесь с этими терминами:
| Термин | Описание |
|---|---|
| Workflow | Автоматизированный процесс, определённый в YAML-файле в .github/workflows/. |
| Event | Триггер, запускающий workflow (например, push, pull_request). |
| Job | Набор шагов, выполняемых на одном runner. Jobs по умолчанию запускаются параллельно. |
| Step | Отдельная задача внутри job. Может выполнять команду или использовать action. |
| Action | Переиспользуемая единица кода (например, actions/checkout), которую можно включить в step. |
| Runner | Виртуальная машина, выполняющая jobs (Ubuntu, Windows, macOS). |
Создание вашего первого CI-конвейера
Давайте создадим базовый CI workflow для проекта на Node.js. Он будет запускать тесты при каждом push и pull request в основную ветку.
Создайте .github/workflows/ci.yml:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v4
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
- run: npm test
Этот workflow:
- Запускается при push и PR в
main. - Выполняет job с именем
testна последнем Ubuntu runner. - Использует матрицу для тестирования на Node.js 18 и 20.
- Клонирует код, настраивает Node, устанавливает зависимости и запускает тесты.
Запушьте этот файл и откройте вкладку Actions. Вы увидите два параллельных job (по одному на версию Node). Если какой-либо тест упадёт, workflow завершится с ошибкой, и GitHub уведомит вас.
Добавление непрерывного развёртывания
CI — это здорово, но CD — где автоматизация сияет. Давайте расширим workflow, чтобы развёртывать на сервер после успешных тестов в основной ветке.
Мы добавим job deploy, который зависит от test и выполняется только при push в main.
deploy:
needs: test
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USER }}
key: ${{ secrets.SSH_KEY }}
script: |
cd /var/www/myapp
git pull origin main
npm ci --production
pm2 restart myapp
Ключевые моменты:
needs: testгарантирует, что развёртывание запустится только если тесты прошли.- Условие
ifограничивает развёртывание пушами вmain. - Секреты (
SSH_HOST,SSH_USER,SSH_KEY) хранятся в настройках репозитория GitHub и безопасно подставляются.
Этот шаблон подходит для многих целей развёртывания: SSH, Docker-реестры, облачные платформы (AWS, Vercel, Netlify) или Kubernetes.
Лучшие практики CI/CD с GitHub Actions
- Делайте workflow быстрыми: кэшируйте зависимости (например,
actions/cache), чтобы сократить время сборки. - Fail fast: запускайте быстрые проверки (линтеры) перед более медленными тестами.
- Используйте environments: настраивайте правила защиты для production-развёртываний.
- Защищайте секреты: никогда не хардкодьте учётные данные; используйте GitHub Secrets.
- Мониторинг и оповещения: настройте уведомления о неудачных workflow.
Отладка неудачных workflow
Когда workflow падает, GitHub показывает логи для каждого шага. Распространённые проблемы:
- Отсутствующие зависимости: убедитесь, что
npm ciили аналог выполняется перед тестами. - Неправильные секреты: перепроверьте имена и значения.
- Ошибки прав: проверьте права runner и SSH-ключи.
Также можно включить отладочное логирование, установив секрет репозитория ACTIONS_STEP_DEBUG в true.
FAQ
В чём разница между CI и CD?
CI автоматизирует тестирование и интеграцию изменений кода. CD автоматизирует доставку или развёртывание этих изменений в среду. CI обеспечивает качество кода; CD — быстрое и надёжное попадание кода к пользователям.
GitHub Actions бесплатен?
GitHub Actions бесплатен для публичных репозиториев. Для приватных репозиториев вы получаете ежемесячный лимит бесплатных минут (например, 2 000 минут для бесплатных аккаунтов) и платите за дополнительное использование. Также возможны self-hosted runners.
Можно ли использовать GitHub Actions для проектов не на GitHub?
Да, GitHub Actions может запускать любые инструменты командной строки. Вы можете использовать его для сборки и развёртывания проектов, размещённых в другом месте, если код находится на GitHub или вы используете actions для его получения.
Готовы оптимизировать свой CI/CD? Начните с автоматизации тестов с помощью GitHub Actions. Для быстрого анализа логов развёртывания попробуйте наш Nginx Log Analyzer, чтобы выявлять ошибки и проблемы производительности после каждого деплоя.