Простой бекенд для принятия webhook'ов от Github с последующим деплоем на сервере.
На самом сервере понадобиться pm2 (для запуска проектов) и git. git не сможет копировать приватные репозитории, поэтому может потребовать авторизация в аккаунте (по команде gh auth login)
Пример для Ubuntu установки пакетов:
npm install pm2@latest -g
apt-get install git
Для установки gh в Ubuntu:
type -p curl >/dev/null || (sudo apt update && sudo apt install curl -y)
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg \
&& sudo chmod go+r /usr/share/keyrings/githubcli-archive-keyring.gpg \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& sudo apt update \
&& sudo apt install gh -y- Копируем репозиторий с бекендом:
git clone https://github.com/reyzitwo/autodeploy-git.git <dir-name>
- Устанавливаем зависимости в проекте:
npm i
- Создаем файл
.envпо примеру из.env.example, в качестве ключа указываем любую строку. Пригодится нам для проверки, что запрос действительно был отправлен от лица Github. - Запускаем бекенд:
npm start:prod
- Готово! Бекенд будет работать по адресу
{SERVER}/autodeploy-git, а конкретно по ручке/deploy.
Сам сервер поднимется по порту 3000, но это можно поменять в файле ./src/main.ts
- Переходим во вкладку Settings -> Webhooks
- Создаем новый webhook, указав наш сервер с поднятым бекендом (
‼️ обязательно указатьsecretкак на сервере) - Настраиваем, какие события будем принимать от Github (рекомендую выбрать только
Pushes) - ✅ Profit!
На указанный нами URL будут отправляться POST запросы, которые будут вызывать скрипт ./src/scripts/deploy.sh
Скрипт в качестве параметров принимает имя папки проекта на сервере и путь до репозитория Github (например: reyzitwo/autodeploy-git). Все это уже настроено в коде, ничего указывать самостоятельно для вызова не нужно.
А сам принцип работы:
а) Если папки проекта на сервере нет:
- Копируется репозиторий проекта в папку
$HOME/git/$PROJECT_NAME - Установка зависимостей проекта
- Старт проекта через
pm2по командеnpm run autodeploy-gh(соответственно, для проектов можно настроить как будет происходить запуск вpackage.json)
б) Если папка проекта уже имеется на сервере:
- Остановка проекта в
pm2 - Подтягивание изменений с Github:
git pull - Установка зависимостей проекта
- Старт проекта через
pm2