Привет, Хабр! Меня зовут Микаэль Оганесян, я backend-разработчик, и сегодня хочу поделиться с вами опытом настройки CI/CD с использованием 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, убедитесь, что у вас есть:
Аккаунт GitHub — для создания репозитория и настройки GitHub Actions.
Сервер — Linux-сервер или облачный сервис (AWS, GCP, Azure).
SSH-доступ к серверу.
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
Access Token — создайте в GitHub (Settings → Developer settings → Personal access tokens).
Клонирование репозитория на сервер:
git clone https://<username>:<ваш_токен>@github.com/<path_to_repo/repo_title>.git
Переменные окружения — создайте файл
.env
в репозитории:cd <repo_title>
touch .env
echo "<var_title>=<var_value>" >> .env
Как работает GitHub Actions?
Процесс можно описать в несколько этапов:
Событие (push, PR, schedule и др.) инициирует запуск workflow.
GitHub ищет нужный workflow-файл (
.github/workflows/*.yml
).Выделяется runner (GitHub-Hosted или Self-Hosted).
Выполняются jobs (параллельно или последовательно).
В рамках jobs выполняются steps (последовательно).
Используются Actions или команды shell.
Обрабатываются Secrets (зашифровано и замаскировано в логах).
Результат (успех/неудача) и, опционально, создание Artifacts или уведомлений.
Типы событий:
Внутренние:
push
,pull_request
,schedule
,workflow_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
Перейдите в репозиторий:
Settings → Secrets and variables → Actions
.Создайте 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?
При пуше в ветку
main
или создании PR запускается jobrun_pull
.Устанавливаются SSH-ключи для доступа к серверу.
Подключается к серверу, обновляет код из репозитория и перезапускает Docker-контейнеры.
Заключение
GitHub Actions — это мощный инструмент для автоматизации деплоя, который значительно упрощает жизнь разработчика. Настроив CI/CD один раз, вы избавите себя от рутинных задач и уменьшите количество ошибок, связанных с ручным деплоем.
Дальнейшие шаги:
Изучите официальную документацию.
Экспериментируйте с разными Actions и настройками.
Автоматизируйте другие задачи: тестирование, линтинг, уведомления.
Если у вас есть вопросы или дополнения — пишите в комментарии! Буду рад обсудить ваш опыт использования GitHub Actions. 🚀