Рубрики
Uncategorized

Автоматическое развертывание от GitHub на ваш сервер без приложения NO

Когда дело доходит до настройки конвейера развертывания, я считаю, что количество решений в дикой природе Tagged с DevOps, Node, JavaScript, GitHub.

Когда дело доходит до настройки конвейера развертывания, я считаю, что количество решений в дикой природе бесчисленное множество. Если мы находимся на 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»