Назад к реестру заметок
DevOps 12 минут 30 Jun 2026

CI/CD пайплайны: автоматизация деплоя с помощью GitHub Actions

Полное руководство по настройке процессов непрерывной интеграции и доставки (CI/CD) с использованием GitHub Actions. От прогона тестов до деплоя в production.

Инженеры Zirki UZ 421

# CI/CD пайплайны: автоматизация деплоя с помощью GitHub Actions

Эпоха ручного деплоя, копирования файлов по FTP и длительных слияний кода ушла в прошлое. В современной разработке ключевым фактором успеха является скорость и надежность доставки изменений. Концепция CI/CD (Continuous Integration / Continuous Deployment) позволяет автоматизировать процессы тестирования, сборки и развертывания приложения.

Существует множество инструментов для CI/CD (Jenkins, GitLab CI, CircleCI), но в последние годы **GitHub Actions** стал настоящим стандартом благодаря тесной интеграции с кодовой базой и огромной экосистеме готовых компонентов.

В этой статье мы разберем, как построить полноценный CI/CD пайплайн с помощью GitHub Actions.

Что такое CI/CD?

- **Continuous Integration (Непрерывная интеграция):** Практика слияния рабочих копий кода всех разработчиков в общую основную ветку (main/master) несколько раз в день. Основная цель CI — раннее обнаружение ошибок интеграции с помощью автоматического запуска линтеров и тестов при каждом пуш-реквесте (Pull Request). - **Continuous Delivery / Deployment (Непрерывная доставка/развертывание):** Практика автоматического развертывания проверенного кода в различные среды (тестовую, staging, production). Delivery подразумевает ручное нажатие кнопки перед выходом в прод, а Deployment означает полную автоматизацию процесса вплоть до конечного пользователя.

Основы GitHub Actions

GitHub Actions позволяет автоматизировать рабочие процессы прямо в вашем репозитории. Основные понятия:

- **Workflows (Рабочие процессы):** Конфигурируемые автоматизированные процессы (пайплайны), состоящие из одной или нескольких задач. Определяются в YAML файлах в директории `.github/workflows/`. - **Events (События):** Триггеры, которые запускают Workflow (например, `push` в ветку `main`, создание Pull Request, расписание `cron`). - **Jobs (Задачи):** Набор шагов, которые выполняются на одном сервере-раннере (Runner). Задачи по умолчанию выполняются параллельно, но могут зависеть друг от друга. - **Steps (Шаги):** Отдельные команды (shell скрипты) или Actions, выполняемые внутри Job. - **Actions (Действия):** Повторно используемые блоки кода для выполнения сложных задач (например, `actions/checkout@v4` для клонирования репозитория).

Создание базового пайплайна (CI)

Начнем с настройки CI для типичного Node.js приложения. Этот пайплайн будет запускаться при каждом Pull Request и при пушах в `main`.

Создайте файл `.github/workflows/ci.yml`:

```yaml name: Node.js CI

# Триггеры on: push: branches: [ "main" ] pull_request: branches: [ "main" ]

jobs: build-and-test: runs-on: ubuntu-latest

strategy: matrix: node-version: [18.x, 20.x] # Тестирование на разных версиях

steps: # 1. Клонирование репозитория - name: Checkout code uses: actions/checkout@v4

# 2. Установка Node.js - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' # Автоматическое кэширование зависимостей

# 3. Установка зависимостей - name: Install dependencies run: npm ci

# 4. Линтинг кода - name: Run linter run: npm run lint

# 5. Запуск юнит-тестов - name: Run tests run: npm test ```

Этот Workflow гарантирует, что в главную ветку не попадет код, который не компилируется, содержит ошибки стиля или ломает существующие тесты.

Секреты и переменные окружения

Для деплоя и интеграции со сторонними сервисами вашему пайплайну понадобятся конфиденциальные данные (SSH ключи, токены доступа AWS, пароли к базам данных).

**Никогда не храните секреты в коде!** Используйте механизм GitHub Secrets: 1. Зайдите в настройки репозитория (Settings -> Secrets and variables -> Actions). 2. Добавьте новый секрет, например `SERVER_SSH_KEY`. 3. Используйте его в Workflow: `${{ secrets.SERVER_SSH_KEY }}`.

Настройка деплоя (CD)

Добавим пайплайн для автоматического развертывания приложения. Для примера рассмотрим деплой Docker-контейнера на сервер по SSH.

Создайте файл `.github/workflows/deploy.yml`:

```yaml name: Deploy to Production

on: push: branches: [ "main" ] # Запуск только при изменениях в главной ветке

jobs: deploy: runs-on: ubuntu-latest # Деплой зависит от успешного прохождения CI (опционально, если CI и CD в одном файле)

steps: - name: Checkout code uses: actions/checkout@v4

# Сборка и отправка Docker образа в реестр (например, GitHub Container Registry) - name: Log in to the Container registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true tags: ghcr.io/${{ github.repository }}:latest

# Подключение к серверу и обновление контейнера - name: Deploy via SSH uses: appleboy/ssh-action@master with: host: ${{ secrets.SERVER_HOST }} username: ${{ secrets.SERVER_USERNAME }} key: ${{ secrets.SERVER_SSH_KEY }} script: | docker pull ghcr.io/${{ github.repository }}:latest docker stop myapp || true docker rm myapp || true docker run -d --name myapp -p 80:3000 ghcr.io/${{ github.repository }}:latest ```

Продвинутые практики

1. **Окружения (Environments):** Используйте GitHub Environments для защиты ветвей (например, требование ручного одобрения (Approval) перед деплоем на production). 2. **Кэширование (Caching):** Кэшируйте зависимости (`node_modules`, `~/.npm`, Docker слои), чтобы сократить время выполнения пайплайнов. 3. **Оптимизация Docker:** Используйте многоэтапные сборки (multi-stage builds) для уменьшения размера итогового образа. 4. **Уведомления:** Настройте отправку уведомлений о результатах пайплайна в Slack или Telegram.

Заключение

Внедрение CI/CD — это инвестиция, которая окупается очень быстро. GitHub Actions предоставляет мощный, гибкий и бесплатный (в рамках лимитов) инструмент для автоматизации всего жизненного цикла разработки. Настройте тесты, автоматизируйте деплой и позвольте вашей команде сосредоточиться на написании кода, а не на рутинных операциях.

Поделиться: