Автоматический деплой NodeJS приложения

  • вторник, 1 января 2019 г. в 17:06:00

На данный момент я занимаюсь разработкой своего проекта TryCode и для деплоя, я использую два разных сервера. Каждый раз мне приходится пушить изменения на GitLab, потом заходить на SSH, делать git pull и перезапускать нодовское приложение.

В целлом, на все эти действия уходит около 2-3 минут. Однако, когда часто вносишь изменения и заливаешь их на прод, это всё начинает надоедать.

Хочу отметить, что я слышал про Docker и на момент написания этой статьи узнал ещё про какие-то сервисы, для автоматического деплоя. Например, DeployBot. Скажу честно, было лень изучать докер и настраивать его. Я решил написать несколько скриптов и NPM-команд, для автоматического деплоя и сборки приложения на проде.

Задача

Требуется оптимизировать процесс деплоя приложения на прод и сохранить драгоценные 3 минуты моей жизни.

Решение

Для начала, надо разобраться с NPM-скриптами (командами). В моём случае, для деплоя на продакшн нужно:

  1. Очищать последнюю сборку приложения.
  2. Запускать сборку приложения.
  3. Пушить всё в репозиторий.
  4. Зайти на SSH-сервер, перейти в директорию /var/www/trycode.pw и выполнить git pull.
  5. Рестарнуть запущенное приложение на проде с помощью pm2.

Советую вам разбить на команды все действия, а потом выполнять их поочерёдно. В моём случае, я написал следующие NPM-скрипты.

С помощью NPM-команды prod-deploy, происходит всё перечисленное выше. Команда prod-build запускает нодовский скрипт prebuild.js, который хранится в отдельной папке scripts.

Содержимое скрипта выглядит так:


_10
const exec = require('child_process').exec;
_10
_10
async function run() {
_10
await exec('rm -rf ./src/.next');
_10
await exec('npm run build');
_10
}
_10
_10
run();

Выполняется команда удаления папки с собранным приложением (в вашем случае это может быть build, dist) и запускается сборка приложения.

Далее происходит деплой всех изменений на GitLab с помощью NPM-команды deploy. Команда поочередно выполняет добавление изменений, коммит и пуш.

После пуша изменений на GitLab, запускается нодовский скрипт pull.js, который подключается к SSH-серверу и скачивает последние изменения.


_43
const node_ssh = require('node-ssh');
_43
const ssh = new node_ssh();
_43
_43
ssh
_43
.connect({
_43
host: '144.88.19.48',
_43
username: 'root',
_43
privateKey: '/Users/archakov/.ssh/id_rsa',
_43
})
_43
.then(() => {
_43
ssh.execCommand('git pull origin master', { cwd: '/var/www/trycode.pw' }).then(function() {
_43
console.log('✅ Changes successfully pulled!');
_43
ssh.execCommand('yarn', { cwd: '/var/www/trycode.pw' }).then(function() {
_43
console.log('✅ Dependecies installed');
_43
ssh.execCommand('pm2 restart server', { cwd: '/var/www/trycode.pw' }).then(function() {
_43
console.log('? Server restarted!');
_43
process.exit();
_43
});
_43
});
_43
});
_43
});
_43
_43
// ИЛИ с async / await
_43
_43
const node_ssh = require('node-ssh');
_43
const ssh = new node_ssh();
_43
_43
async function run() {
_43
await ssh.connect({
_43
host: '144.88.19.48',
_43
username: 'root',
_43
privateKey: '/Users/archakov/.ssh/id_rsa',
_43
});
_43
await ssh.execCommand('git pull origin master', { cwd: '/var/www/trycode.pw' });
_43
console.log('✅ Changes successfully pulled!');
_43
await ssh.execCommand('yarn', { cwd: '/var/www/trycode.pw' });
_43
console.log('✅ Dependecies installed.');
_43
await ssh.execCommand('pm2 restart server', { cwd: '/var/www/trycode.pw' });
_43
console.log('? Server restarted!');
_43
process.exit();
_43
}
_43
_43
run();

Для подключения к SSH-серверу, используется библиотека node-ssh. Создайте ssh-ключ для подключения к серверу без пароля и укажите путь к этому файлу в свойстве privateKey.

  • host — указываем адрес SSH-сервера.
  • username — логин на вашем SSH-сервере.
  • privateKey — SSH-ключ для подключения к серверу без пароля. (также можно указать пароль по желанию, заменив на password и в значении указав пароль).

После успешного подключения, скрипт переходит в папку /var/www/trycode.pw и выполняет ряд команд:

  1. Скачивание изменений с репозитория.
  2. Установка новых зависимостей командой yarn (альтернатива npm install).
  3. Рестарт нодовского приложения.

Работает всё отлично и деплоить приложение на прод уже не так больно. Перфектли!

P.S.: Буду рад, если расскажете в комментах или поделитесь ссылкой, как вы решаете подобный деплой или как сделать то же самое на докере.

#nodejs#digitalocean#trycode#docker#gitlab#deploy#heroku#npm