Мониторинг и откат развертывания приложения Node.js с помощью Shipit в CentOS 7

Shipit – это универсальный инструмент для автоматизации и развертывания приложений, разработанных на Node.js. Он поддерживает поток задач, основанный на популярном пакете Orchestrator, логин и интерактивные SSH-команды по OpenSSH, а также расширяемый API. Разработчики могут использовать Shipit для автоматизации рабочих процессов сборки и развертывания широкого спектра приложений Node.js.

Рабочий процесс Shipit позволяет разработчикам не только настраивать задачи, но и указывать среду порядок их выполнения; Shipit может выполнять их синхронно или асинхронно.

В предыдущей части этого мануала вы узнали, как установить и настроить Shipit для развертывания приложения Node.js из локальной среды разработки в производственную среду. Эта часть посвящена мониторигну и откату вашего развертывания.

Примечание: Поскольку этот мануал является продолжением мануала Автоматизация развертывания приложения Node.js в производство с помощью Shipit в CentOS 7, требования и инструкции по настройке базовой среды вы найдете в первой части.

1: Мониторинг приложения

PM2 – отличный инструмент для управления вашими удаленными процессами, который также предоставляет функции для мониторинга производительности этих процессов.

Подключитесь к вашему удаленному серверу app через SSH с помощью команды:

ssh deployer@your_app_server_ip

Чтобы получить информацию о ваших управляемых процессах PM2, выполните команду:

pm2 list

Вы получите такой результат:

┌─────────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬──────┬───────────┬──────────┬──────────┐
│ App name    │ id │ version │ mode │ pid  │ status │ restart │ uptime │ cpu  │ mem       │ user     │ watching │
├─────────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼──────┼───────────┼──────────┼──────────┤
│ hello       │ 0  │ 0.0.1   │ fork │ 3212 │ online │ 0       │ 62m    │ 0.3% │ 45.2 MB   │ deployer │ enabled  │
└─────────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴──────┴───────────┴──────────┴──────────┘

Вы увидите сводную информацию, которую собрал PM2. Чтобы получить подробную информацию, вы можете запустить такую команду:

pm2 show hello

Этот расширенный вывод включает базовую информацию, которую вы уже видели, а также предоставляет информацию о ряде вспомогательных команд и расположении лога:

Describing process with id 0 - name hello
┌───────────────────┬─────────────────────────────────────────────────────────────┐
│ status            │ online                                                      │
│ name              │ hello                                                       │
│ version           │ 1.0.0                                                       │
│ restarts          │ 0                                                           │
│ uptime            │ 82s                                                         │
│ script path       │ /home/deployer/example.com/releases/20190531213027/hello.js │
│ script args       │ N/A                                                         │
│ error log path    │ /home/deployer/.pm2/logs/hello-error.log                    │
│ out log path      │ /home/deployer/.pm2/logs/hello-out.log                      │
│ pid path          │ /home/deployer/.pm2/pids/hello-0.pid                        │
│ interpreter       │ node                                                        │
│ interpreter args  │ N/A                                                         │
│ script id         │ 0                                                           │
│ exec cwd          │ /home/deployer                                              │
│ exec mode         │ fork_mode                                                   │
│ node.js version   │ 4.2.3                                                       │
│ node env          │ production                                                  │
│ watch & reload    │ ✔                                                           │
│ unstable restarts │ 0                                                           │
│ created at        │ 2019-05-31T21:30:48.334Z                                    │
└───────────────────┴─────────────────────────────────────────────────────────────┘
Revision control metadata
┌──────────────────┬────────────────────────────────────────────────────┐
│ revision control │ git                                                │
│ remote url       │ N/A                                                │
│ repository root  │ /home/deployer/example.com/releases/20190531213027 │
│ last update      │ 2019-05-31T21:30:48.559Z                           │
│ revision         │ 62fba7c8c61c7769022484d0bfa46e756fac8099           │
│ comment          │ Our first commit                                   │
│ branch           │ master                                             │
└──────────────────┴────────────────────────────────────────────────────┘
Divergent env variables from local env
┌───────────────────────────┬───────────────────────────────────────┐
│ XDG_SESSION_ID            │ 15                                    │
│ HOSTNAME                  │ N/A                                   │
│ SELINUX_ROLE_REQUESTED    │                                       │
│ TERM                      │ N/A                                   │
│ HISTSIZE                  │ N/A                                   │
│ SSH_CLIENT                │ 44.222.77.111 58545 22                │
│ SELINUX_USE_CURRENT_RANGE │                                       │
│ SSH_TTY                   │ N/A                                   │
│ LS_COLORS                 │ N/A                                   │
│ MAIL                      │ /var/mail/deployer                    │
│ PATH                      │ /usr/local/bin:/usr/bin               │
│ SELINUX_LEVEL_REQUESTED   │                                       │
│ HISTCONTROL               │ N/A                                   │
│ SSH_CONNECTION            │ 44.222.77.111 58545 209.97.167.252 22 │
└───────────────────────────┴───────────────────────────────────────┘
. . .

PM2 также предоставляет встроенный инструмент мониторинга, который вы можете запустить с помощью команды:

pm2 monit

Эта команда выведет интерактивный дашборд, в котором pm2 соберет информацию о процессах и журналах в реальном времени, метрики и метаданные. Это поможет вам в мониторинге ресурсов и логов ошибок:

─ Process list ────────────────┐┌─ Global Logs ─────────────────────────────────────────────────────────────┐

│[ 0] hello     Mem:  22 MB     ││                                                                           │


│                               ││                                                                           │


│                               ││                                                                           │


└───────────────────────────────┘└───────────────────────────────────────────────────────────────────────────┘


┌─ Custom metrics (http://bit.l─┐┌─ Metadata ────────────────────────────────────────────────────────────────┐


│ Heap Size              10.73  ││ App Name              hello                                               │


│ Heap Usage             66.14  ││ Version               N/A                                                 │


│ Used Heap Size          7.10  ││ Restarts              0                                                   │


│ Active requests            0  ││ Uptime                55s                                                 │


│ Active handles             4  ││ Script path           /home/asciant/hello.js                              │


│ Event Loop Latency      0.70  ││ Script args           N/A                                                 │


│ Event Loop Latency p95        ││ Interpreter           node                                                │


│                               ││ Interpreter args      N/A                                                 │


└───────────────────────────────┘└───────────────────────────────────────────────────────────────────────────┘

Теперь вы знаете, как контролировать процессы с помощью PM2. Давайте посмотрим, как Shipit может откатить приложение к предыдущему рабочему развертыванию.

Завершите сеанс SSH на сервере app, выполнив команду exit.

2: Откат развертывания

Иногда после развертывания всплывают непредвиденные ошибки или проблемы, которые приводят к сбою сайта. Разработчики и сопровождающие компании Shipit предусмотрели такие ситуации и предоставили вам возможность откатиться к предыдущему (рабочему) развертыванию вашего приложения.

Чтобы сохранить конфигурации PM2, добавьте еще один прослушиватель событий в файл shipitfile.js в событии rollback:

. . .
shipit.on('rollback', () => {
shipit.start('npm-install', 'copy-config');
});

Прослушиватель, добавленный к событию rollback, будет запускать задачи npm-install и copy-config. Это необходимо, потому что обновленное событие не запускается жизненным циклом Shipit при откате развертывания (в отличие от опубликованного события). Добавление этого прослушивателя событий гарантирует, что ваш менеджер процессов PM2 будет направлен на самое последнее развертывание, даже в случае отката.

Этот процесс похож на развертывание с небольшим изменением команды. Чтобы попытаться вернуться к предыдущему развертыванию, вы можете выполнить эту команду:

npx shipit production rollback

Как и команда deploy, rollback предоставляет подробную информацию о процессе отката и выполняемых задачах:

Running 'rollback:init' task...
Get current release dirname.
Running "if [ -h /home/deployer/example.com/current ]; then readlink /home/deployer/example.com/current; fi" on host "centos-ap-app.asciant.com".
@centos-ap-app.asciant.com releases/20190531213719
Current release dirname : 20190531213719.
Getting dist releases.
Running "ls -r1 /home/deployer/example.com/releases" on host "centos-ap-app.asciant.com".
@centos-ap-app.asciant.com 20190531213719
@centos-ap-app.asciant.com 20190531213519
@centos-ap-app.asciant.com 20190531213027
Dist releases : ["20190531213719","20190531213519","20190531213027"].
Will rollback to 20190531213519.
Finished 'rollback:init' after 3.96 s
Running 'deploy:publish' task...
Publishing release "/home/deployer/example.com/releases/20190531213519"
Running "cd /home/deployer/example.com && if [ -d current ] && [ ! -L current ]; then echo "ERR: could not make symlink"; else ln -nfs releases/20190531213519 current_tmp && mv -fT current_tmp current; fi" on host "centos-ap-app.asciant.com".
Release published.
Finished 'deploy:publish' after 1.8 s
Running 'pm2-server' task...
Running "pm2 delete -s hello || :" on host "centos-ap-app.asciant.com".
Running "pm2 start /home/deployer/example.com/shared/ecosystem.config.js --env production --watch true" on host "centos-ap-app.asciant.com".
@centos-ap-app.asciant.com [PM2][WARN] Node 4 is deprecated, please upgrade to use pm2 to have all features
@centos-ap-app.asciant.com [PM2][WARN] Applications hello not running, starting...
@centos-ap-app.asciant.com [PM2] App [hello] launched (1 instances)
@centos-ap-app.asciant.com ┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────────┬──────────┐
@centos-ap-app.asciant.com │ App name │ id │ version │ mode │ pid  │ status │ restart │ uptime │ cpu │ mem      │ user     │ watching │
@centos-ap-app.asciant.com ├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────────┼──────────┤
@centos-ap-app.asciant.com │ hello    │ 0  │ 1.0.0   │ fork │ 4289 │ online │ 0       │ 0s     │ 0%  │ 4.5 MB   │ deployer │ enabled  │
@centos-ap-app.asciant.com └──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────────┴──────────┘
@centos-ap-app.asciant.com  Use `pm2 show <id|name>` to get more details about an app
Finished 'pm2-server' after 5.55 s
Running 'deploy:clean' task...
Keeping "5" last releases, cleaning others
Running "(ls -rd /home/deployer/example.com/releases/*|head -n 5;ls -d /home/deployer/example.com/releases/*)|sort|uniq -u|xargs rm -rf" on host "centos-ap-app.asciant.com".
Finished 'deploy:clean' after 1.82 s
Running 'rollback:finish' task...
Finished 'rollback:finish' after 615 μs
Finished 'rollback' [ rollback:init, deploy:publish, deploy:clean, rollback:finish ]

Вы настроили Shipit для хранения 5 релизов через конфигурацию keepReleases: 5 в файле shipitfile.js. Shipit следит за этими релизами, чтобы при необходимости обеспечить возможность отката. Shipit также предоставляет удобный способ идентификации релизов – каталог с меткой времени (ГГГГММДДЧЧммсс; например, /home/deployer/your-domain/releases/20190420210548).

Если вы хотите дополнительно настроить процесс отката, вы можете прослушивать события, относящиеся к этой операции. Затем вы можете использовать эти события для выполнения задач, которые дополнят ваш откат. Вы можете обратиться к списку событий жизненного цикла Shipit и настроить задачи и прослушиватели в своем файле shipitfile.js.

Имея возможность откатить обновление до предыдущего развертывания, вы всегда можете предоставить пользователям работоспособную версию приложения, даже если при новом развертывании возникли непредвиденные ошибки.

Заключение

В этом мануале вы научились настраивать рабочий процесс, с помощью которого можно получить гибкую альтернативу «платформе как сервису». Он также дает возможность пользовательской настройки развертывания и конфигурации, поддерживает мониторинг через PM2, масштабирование и откаты.

Читайте также:

Tags: , , , ,