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

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


  1. ivankudryavtsev
    26.07.2025 10:34

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


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

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


  1. SSranked
    26.07.2025 10:34

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

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

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


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

      Искренне сочувствую людям, которые «не умеют» пользоваться ИИ или не используют вопреки каким-то принципам… Я считаю, что это прекрасный инструмент, как помощник для разного рода задач. На мой взгляд, отрицать использование ИИ или, наоборот, использовать его как «сделай под ключ» — очень глупо

      Действительно, мой написанный текст проходил через ИИ, чтобы придать ему «вид статьи»

      Спасибо за комментарий


      1. Zulu0
        26.07.2025 10:34

        Это обычная палка, которой ищут место применения. Одна проблема, надо сначала понять размеры и информацию о палке, а потом применять. А бездумно тыкать палкой куда придется, это про глупость. Я надеюсь вы уловили суть?



    1. noidol
      26.07.2025 10:34

      Блин, Я только сейчас понял к чему подобные комментарии))) На днях с deepseek познакомился. Реально и стиль и форматирование скопированы полностью))) Статьи про основы очень любят на Хабре, но теперь в таких маленьких заметках нет смысла, тк можно сразу к нейронке обращаться, там будет даже удобнее, можно тему развивать, задавать уточняющие вопросы)))
      Минусы за статью считаю оправданными)
      PS: Никого Диниска не смущает? Спамящий заметками о новых инструмантах, появивщихся в интернете... Ладно бы дайджест делал или обзор какой за неделю, а то просто спам однотипных заметок.. И карма 1к, рейтинг высокий)) Может это местный контент мейкер, знает кто?)



  1. sWitched0ff
    26.07.2025 10:34

    Пример выглядит немного сложным
    1) для чего нужен шаг install ssh keys если для настройки экшенов нам нужно сгенерить ключи на сервере? Как вообще агент получит доступ для генерации этих ключей не имея ключей? И что делает команда install -m 600 -D /dev/null?

    2) Зачем после подключения отправлять << 'EOF'? Чекаутиться на ветку конечно хорошая идея на всякий случай, но вот докер же совсем не обязательная часть?


  1. adv-it
    26.07.2025 10:34

    Очень похоже на ChatGPT