Автоматизация деплоя с помощью GitHub Actions: руководство для чайников

В этой статье мы разберём, как автоматизировать процесс деплоя вашего приложения, что сэкономит ваше время и уменьшит количество ошибок при ручном деплое.

Введение в GitHub Actions

GitHub Actions — это мощная платформа для автоматизации рабочих процессов, интегрированная прямо в GitHub. Она позволяет автоматизировать сборку, тестирование и деплой вашего приложения, реагируя на события в репозитории (например, push или pull request).

Преимущества автоматизации деплоя:

  • Экономия времени: Автоматизация устраняет рутинные задачи.
  • Уменьшение ошибок: Снижается вероятность человеческих ошибок.
  • Повышение надежности: Стандартизированный процесс деплоя обеспечивает консистентность.
  • Ускорение цикла разработки: Быстрый деплой позволяет чаще выпускать обновления.

Основные понятия

Прежде чем переходить к практике, давайте разберём ключевые термины:

  • Workflow: YAML-файл (.github/workflows/your_workflow.yml), определяющий последовательность задач (jobs). Запускается при событиях в репозитории (например, push в ветку).
  • Job: Группа шагов (steps), выполняемых на одном виртуальном сервере (runner). Jobs могут зависеть друг от друга.
  • Step: Отдельная задача в рамках job. Это может быть команда shell, скрипт или использование готового Action.
  • Action: Переиспользуемый модуль для выполнения задач (например, сборка проекта или деплой).
  • Secrets: Зашифрованные переменные для хранения конфиденциальных данных (пароли, ключи API).
  • SSH Keys: Ключи шифрования для безопасного подключения к серверу.

Подготовка к работе

Прежде чем настраивать CI/CD, убедитесь, что у вас есть:

  1. Аккаунт GitHub — для создания репозитория и настройки GitHub Actions.
  2. Сервер — Linux-сервер или облачный сервис (AWS, GCP, Azure).
  3. SSH-доступ к серверу.
  4. Docker и docker-compose — установите их на сервере:sudo apt install docker.io && sudo apt install docker-compose && sudo usermod -aG docker $USER && sudo chmod 666 /var/run/docker.sock
  5. Access Token — создайте в GitHub (Settings → Developer settings → Personal access tokens).
  6. Клонирование репозитория на сервер:git clone https://<username>:<ваш_токен>@github.com/<path_to_repo/repo_title>.git
  7. Переменные окружения — создайте файл .env в репозитории:cd <repo_title>
    touch .env
    echo "<var_title>=<var_value>" >> .env

Как работает GitHub Actions?

Процесс можно описать в несколько этапов:

  1. Событие (push, PR, schedule и др.) инициирует запуск workflow.
  2. GitHub ищет нужный workflow-файл (.github/workflows/*.yml).
  3. Выделяется runner (GitHub-Hosted или Self-Hosted).
  4. Выполняются jobs (параллельно или последовательно).
  5. В рамках jobs выполняются steps (последовательно).
  6. Используются Actions или команды shell.
  7. Обрабатываются Secrets (зашифровано и замаскировано в логах).
  8. Результат (успех/неудача) и, опционально, создание Artifacts или уведомлений.

Типы событий:

  • Внутренниеpushpull_requestscheduleworkflow_dispatch (ручной запуск).
  • Внешние: через GitHub API (для интеграции с внешними сервисами).

Виды runners:

  • GitHub-Hosted: Предоставляются GitHub (Linux, Windows, macOS). Бесплатны для публичных репозиториев.
  • Self-Hosted: Разворачиваются и управляются вами. Полезны для специфических требований.

Практический пример: деплой с Docker

Рассмотрим пример workflow для автоматического деплоя приложения на сервер с использованием Docker.

1. Настройка сервера

  • Генерация SSH-ключей (без пароля):ssh-keygen -t rsa -b 4096
  • Добавление публичного ключа в authorized_keys:cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
  • Копирование приватного ключа (понадобится для GitHub Secrets):cat ~/.ssh/id_rsa

2. Настройка GitHub Secrets

  1. Перейдите в репозиторий: Settings → Secrets and variables → Actions.
  2. Создайте secrets:
    • SSH_PRIVATE_KEY — значение из приватного ключа (шаг 1.3).
    • SSH_HOST — IP-адрес сервера.
    • SSH_USER — пользователь сервера.
    • PROJECT_FOLDER — название репозитория.

3. Создание workflow-файла

Создайте файл .github/workflows/main.yml с содержимым:

on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]

jobs:
run_pull:
name: run pull
runs-on: ubuntu-latest

steps:
- name: install ssh keys
run: |
install -m 600 -D /dev/null ~/.ssh/id_rsa
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
ssh-keyscan -H ${{ secrets.SSH_HOST }} > ~/.ssh/known_hosts

- name: connect, pull and run
run: |
ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'EOF'
cd ${{ secrets.PROJECT_FOLDER }}
git checkout main
git pull origin main
docker-compose down
docker-compose up --build -d
EOF

Что делает этот workflow?

  1. При пуше в ветку main или создании PR запускается job run_pull.
  2. Устанавливаются SSH-ключи для доступа к серверу.
  3. Подключается к серверу, обновляет код из репозитория и перезапускает Docker-контейнеры.

Заключение

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