Когда дело доходит до настройки конвейера развертывания, я считаю, что количество решений в дикой природе бесчисленное множество. Если мы находимся на AWS, мы можем использовать код развертывание, Heroku, Zeit сейчас и NetLify предоставляет свои собственные решения, и, конечно, одним из популярных является делегирование задачи на ваш сервер CI/CD (Travis, Circle CI и т. Д.), Чтобы справиться с ней. Если вы используете контейнеры Docker, лучшие инструменты Orchestrator для использования — это AWS ECS, Swarm и Kubernetes. Скорее всего, если вы работаете с более крупной командой, у вас есть товарищи по команде Dev-Ops, чтобы справиться с этим, и вы можете воспринимать свою инфраструктуру как выданную! 😐 Однако, если, как и я, вы присоединились к стартапу, и процесс развертывания был ручным (SSH для сервера, GIT PULL и т. Д.), И вы написали несколько сценариев, чтобы сделать это для них, вы можете принять свой внутренний ботаник и выровнять свой Игра в развертывание. В этом случае автоматически запуск ваших сценариев Bash после слияния запроса на притяжение на GitHub сделает все счастливыми, и это не ракетостроение, так что давайте сделаем это!
Цель
Для автоматического развертывания вашего кода после слияния запросов на вытягивание в Branches Dev и Master.
Вещи, которые мы используем
- Узел JS
- Сценарии Bash
- Github Webhooks
- Командная строка SSH
Начиная
Допустим, у нас есть две версии нашего веб -сайта, которые нам нужно автоматически развернуть. Один называется Стадия
и представляет последние объединенные коммиты. Эти изменения часто являются глюми и не надежны, поэтому мы хотим, чтобы только внутренняя команда имела доступ к ней. «Сцена» представляет наш Dev
ветвь в GitHub. Вторая версия веб -сайта называется «Prod» и будет пересекать Мастер
ветвь в GitHub. Этот филиал (надежда) стабильна и прошел команду QA и считается безопасным для конечных пользователей. Эта версия — та, которую все за пределами компании знают в качестве URL нашего веб -сайта.
Шаг 1: клон Ваши репозитории GIT
Если у вас уже нет репозиториев GitHub, клонированных на сервере, вы должны это сделать.
Сделайте два каталога под названием: Prod
и Стадия
Анкет
mkdir live stage git clone git@github.com:p0o/your_repo.git cp -a your_repo/. ./prod/your_repo cp -a your_repo/. ./stage/your_repo rm -rf ./your_repo
Обязательно добавьте дополнительное Анкет
После your_repo это особенное CP
Синтаксис, который позволяет копировать скрытые файлы и папки в вашей папке (нам также нужно, чтобы копировать .git также).
Дикое предположение: Я предполагаю, что вы знакомы с основами управления сервером и вы можете запустить свои веб -сайты в желаемом URL -адресе с помощью надлежащего сертификата SSL. Я использую Nginx для этой цели Но я не собираюсь объяснять эти шаги в посте. Вы можете искать, если не уверены.
Шаг 2: Сделайте сценарии Bash
Нам нужно иметь два сценария Bash для обработки развертывания для каждого из этих случаев. Если вам нужно создать свои файлы, и давайте создадим каталог в домашнем каталоге нашего сервера и начнем оттуда. Я называю этот каталог сценарии
:
cd ~/ mkdir scripts cd scripts
Хорошо, давайте приступим к созданию файлов BASH:
touch ./deploy_stage touch ./deploy_prod
Дайте им разрешение на выполнение:
chmod +x ./deploy_stage chmod +x ./deploy_prod
(Спасибо Darksmile92 за указание на это)
Я помесчу пример кода для одного из них, другой — это просто другая папка и может иметь разные переменные среды в соответствии с зависимостью вашего проекта.
#!/bin/bash echo "Deploying stage your_repo" cd ~/stage/your_repo \ && git checkout dev \ && git pull \ && npm i \ && npm run build \ && (pm2 stop your_repo_stage || true) \ && echo 'Installing: done.' \ && (pm2 delete your_repo_stage || true) \ && NODE_ENV=development pm2 --name your_repo_stage start npm -- start \ && echo "your_repo deployed successfully"
Этот скрипт Bash в основном принесет последний код из GitHub, установите зависимости, создайте скрипт (если требуется) и запустит его, используя PM2 Анкет Если вы не знакомы, PM2 — очень полезный инструмент управления процессами, и вы можете легко установить его с помощью NPM.
Также приятно упомянуть, что я приковал весь свой процесс с логическим и (&&), потому что я хотел бы выйти из выполнения в случае, если один из процессов не удастся.
Шаг 3: Записать код для обработки событий WebHook
Чтобы получить уведомление в любое время, когда что -то происходит в GitHub, мы должны подписаться на их API Webhook, что по сути означает предоставление некоторых URL -адресов GitHub, чтобы они отправили в нее некоторую информацию. Эти URL -адреса должны быть публичными, и они могут запускать сценарии, которые приведут к развертыванию вашего кода, поэтому их доступные для всех, кроме серверов GitHub, будут иметь серьезные последствия для безопасности (например, атака отказа в обслуживании).
GitHub использует подпись SH1 HMAC для проверки объекта JSON, который он отправляет вам. У нас будет этот фирменный хэш в X-Hub-Signature
ценность заголовка. Поскольку позаботиться обо всем это немного сложно, мы можем использовать Github-Webhook-Handler Package который создан точно для той же цели.
Нам также необходимо запустить наши файлы сценариев Bash из узла. Мы можем сделать это с помощью собственных функций, но я предпочитаю использовать shelljs ради простоты.
Ладно достаточно разглагольствовать, вот код, который вам нужен:
const http = require('http'); const createHandler = require('github-webhook-handler'); const shell = require('shelljs'); // We avoid to hardcode the secret in the code, you should provide it with an ENV variable before running this script const { MY_SECRET } = process.env; // You might use the same script for multiple repositories, this is only one of them const REPO_NAME = 'my_repo'; // port is default on 6767 const PORT = process.env.PORT || 6767; var handler = createHandler({ path: '/', secret: MY_SECRET }) http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404 res.end('no such location') }) }).listen(PORT); handler.on('error', function (err) { console.error('Error:', err.message) }) handler.on('pull_request', function (event) { const repository = event.payload.repository.name; const action = event.payload.action; console.log('Received a Pull Request for %s to %s', repository, action); // the action of closed on pull_request event means either it is merged or declined if (repository === REPO_NAME && action === 'closed') { // we should deploy now shell.cd('..'); shell.exec('~/scripts/deploy_stage'); } });
Сохраните его в папке где -то на вашем сервере и установите зависимости:
npm init npm i github-webhook-handler shelljs --save
А затем просто запустите его с переменной среды навсегда, используя PM2:
MY_SECRET=MyGithubWebhookSecret pm2 --name github-deployer start node -- ./index.js
Это все!
Шаг 4: Настройте GitHub Webhook
Теперь нам просто нужно перейти в GitHub и представить наш крючок в GitHub. Но обратите внимание на то, что на предыдущем шаге мы запустили веб -крюк на порту 6767 без HTTPS. Таким образом, вам нужно настроить Nginx и дать ему правильный домен с HTTPS. Вы можете просто поставить его на путь в своем основном домене, но объяснение того, что процесс не в сфере этой статьи. К счастью, в Интернете есть несколько статей для вас.
Перейдите на вкладку «Настройка своего репозитория» и нажмите на веб -крючки. В правой стороне страницы нажмите кнопку «Добавить webhook».
Введите URL, который вы ввели в свой Nginx для приложения Node JS, которое мы запустили. Допустим, это https://yourdomain.com/webhook
Выберите Приложение/JSON
Для типа контента и введите секрет, с которым мы использовали наш сервис. В моем примере это было «mygithubwebhooksecret».
В разделе «Какие события вы хотели бы вызвать этот веб -крюк?» Нажмите «Позвольте мне выбрать отдельные события» и найти запросы на привлечение и проверьте их:
Убедитесь, что все остальное не контролировано, и нажмите «Добавить webhook», чтобы сохранить его. Мы все готовы сейчас 🦸
Шаг 5: Проверьте и проверяйте
Используйте PM2 для мониторинга журналов для приложения Node JS, которое мы сделали только сейчас. Войти:
pm2 log github_deployer
Теперь вы можете увидеть, произойдут ли какие -либо изменения! Зайдите в свой репозиторий и измените что -то в новой ветви. Отправьте запрос на привлечение и объедините его. Вы должны увидеть, как ваш скрипт Bash в журнале выполнит развертывание, и после этого ваши изменения должны быть отражены на веб -сайте. Если у вас была ошибка, вы можете увидеть ее здесь, в журнале и хорошо … сделайте что -нибудь с этим 😂
Вывод
Несмотря на то, что я думаю, что предлагаемое решение в этой статье довольно простое, это не лучшее решение для этой конкретной проблемы. Даже мой Личный блог использует Zeit Теперь интеграция GitHub для развертывания! Однако другие решения полагаются на сторонние приложения, а иногда и не доступны для определенных команд в соответствии с их ресурсами. В моем случае, сценарии развертывания уже были там, репозитории не использовали Docker, и у меня было очень ограниченное время, чтобы потратить на эту проблему. Содействуйте с ним, если вы также оказались в одной лодке!
Эта статья первоначально опубликована в моем блоге с названием Автоматическое развертывание от GitHub на ваш сервер Не стесняйтесь проверить это, чтобы узнать больше постов! 👀 Вы также можете найти меня в Twitter => @p0oker
Оригинал: «https://dev.to/p0oker/automatic-deployment-from-github-to-your-server-with-no-third-party-app-3f5j»