GitHub Actions: Простой способ развернуть множество стендов фронтенд-приложения
Деплоим с поддержкой ветвления без навыков DevOps на примере Vue
Грубо говоря, GitHub Actions – это написанные пользователем сценарии, выполнение которых можно затриггерить по определенным действиям в репозитории (например, новый коммит).
Можно выделить следующие преимущества GitHub Actions среди других CI инструментов:
- модульность – сообществом поддерживаются пакеты для узких задач, избавляющие вас от дублирования кода и написания длинных скриптов (примеры: сборка Docker контейнера, передача файла на сервер, оповещение в Telegram и тысячи других)
- цена – бесплатный тарифный план покроет нужды небольших проектов
- скорость – быстрее бесплатных аналогов исходя из личного опыта
В статье описана реализация следующего сценария, который поможет упростить тестирование и разработку вашего приложения:
- Пользователь вносит изменения в ветку
- Автоматически запускается отвечающий за сборку скрипт
- Собранное приложение доставляется на сервер и доступно по адресу <имя_ветки>.app.example.ru
Подготовка сервера
Все действия будут выполнены на OC Ubuntu 20.04. Также нам понадобится доступ к NS-записям домена.
Подойдет cамая минимальная конфигурация, достаточная для раздачи статики. Остальную работу на себя возьмут серверы Гитхаба.
P.S.: Читателям статьи VScale предоставили купон VCGUIDE на 250 рублей.
Авторизуемся сгенерированным паролем с помощью командной строки или любого SSH клиента:
Установка необходимых пакетов
Установим nginx – он будет отвечать за раздачу файлов приложения:
Далее создадим SSH-ключ, который понадобится нам для деплоя приложения на сервер:
Нам будет предложено задать секретный пароль, пропустим этот шаг (Enter).
Добавим ключ в доверенные:
И перезапустим сервис sshd для применения изменений:
Настройка репозитория
Secrets (Settings > Secrets)
Подходит для хранения приватной информации – например, нашего SSH-ключа. Значения этих переменных будут скрыты из вывода в консоль и будут доступны только нам.
Задаем следующие переменные в настройках:
- DEPLOY_SERVER_HOST – IP вашего сервера
- DEPLOY_SERVER_PORT – SSH порт (по умолчанию 22)
- DEPLOY_SERVER_USERNAME – Имя пользователя (по умолчанию root)
- DEPLOY_SERVER_KEY – Секретная часть сгенерированного ранее ключа (посмотреть можно командой cat ~/deploy)
Github Actions: Создаем Workflow
Создадим в нашем репозитории шаблон для задачи, отвечающей за деплой:
Следующего содержания:
В примере выше используется созданный пользователем пакет appleboy/scp-action, выполняющий функцию архивирования файлов, передачу созданного архива по SSH и его распаковку на удаленном сервере.
Настройка фронтенда
Автообновляемые бесплатные SSL-сертификаты
Для начала нужно привязать имеющийся домен к серверу.
В панеле управления доменом зададим DNS-серверы/NS-записи ns1.vscale.io и ns2.vscale.io
В настройках домена добавим новую запись *.example.ru, указывающую на IP нашего сервера:
Установим клиент ACME.sh для работы с Let's Encrypt:
Для получения и продления wildcard-сертификатов нужно добавлять специальную текстовую запись для домена. Создадим API токен с полными правами, чтобы не делать это каждый раз вручную.
Добавим полученный токен в переменные окружения сервера:
Следующая команда инициирует создание сертификатов для доменов *.example.ru и *.app.example.ru соответственно:
Ждем окончания проверки, в случае успеха получаем такое сообщение:
Настройка nginx
При каждом коммите в ветку, GitHub Action собирает приложение и отправляет его в директорию /var/www/app/<branch_name>/ у нас на сервере.
Нужно настроить сервер так, чтобы запросы к поддомену <branch_name>.app.example.ru указывали на соответствующую директорию.
Создадим/заменим стандартную конфигурацию nginx (/etc/nginx/sites-available/default):
С помощью регулярного выражения проверяется директива server_name: при соответствии правилу, значение поддомена подставляется в качестве имени root-директории, в которой находится уже собранное приложение.
Для применения изменений перезагружаем nginx:
Проверяем, всё ли получилось:
Также можно дополнить конфигурацию следующим правилом:
Теперь app.example.ru будет отображать состояние master-ветки.