Привет, Хабр! Меня зовут Микаэль Оганесян, я 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, убедитесь, что у вас есть:

  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 или уведомлений.

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

  • Внутренние: 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

  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 один раз, вы избавите себя от рутинных задач и уменьшите количество ошибок, связанных с ручным деплоем.

Дальнейшие шаги:

  • Изучите официальную документацию.

  • Экспериментируйте с разными Actions и настройками.

  • Автоматизируйте другие задачи: тестирование, линтинг, уведомления.

Если у вас есть вопросы или дополнения — пишите в комментарии! Буду рад обсудить ваш опыт использования GitHub Actions. ?

Комментарии (3)


  1. ivankudryavtsev
    26.07.2025 10:34

    Мне кажется что "полное руководство" это некоторое преувеличение...


    1. MikaJanBales Автор
      26.07.2025 10:34

      подправил, спасибо за комментарий


  1. SSranked
    26.07.2025 10:34

    На Хабре теперь написанные ИИ статьи без модерации публикуются?

    Ради интереса попросил deepseek «Напиши статью для Хабра. Заголовок»

    Всё то же самое, в пределах погрешности выбора токенов… Даже сигнатурную эмодзи ракеты, которую так обожают подобные llm, автор пользователь, опубликовавший текст, решил не убирать.