用 npm script 实现服务自动化运维

需要事先说明的是,本节部分内容涉及到非前端的话题,比如服务的部署、日志,但会从前端项目管理开始,比如依赖管理、版本管理等。即使对自己定位是纯粹前端开发的同学,也建议阅读下,因为技不压身,了解整个前端项目交付流程中需要考量的点能让我们更有大局观。

通常来说,项目构建完成之后,就成为待发布的版本,因此版本管理需要考虑,甚至做成自动化的,然后,最新的代码需要部署到线上机器才能让所有用户访问到,部署环节涉及到服务的启动、重启、日志管理等需要考虑。

下面我们介绍 npm script 在服务运维时的几个用途:

使用 npm script 进行版本管理

每次构建完的代码都应该有新的版本号,修改版本号直接使用 npm 内置的 version 自命令即可,如果是简单粗暴的版本管理,可以在 package.json 中添加如下 scripts:

+    "release:patch": "npm version patch && git push && git push --tags",
+    "release:minor": "npm version minor && git push && git push --tags",
+    "release:major": "npm version major && git push && git push --tags","precommit": "lint-staged",

这 3 条命令遵循 semver 的版本号规范来方便你管理版本,patch 是更新补丁版本,minor 是更新小版本,major 是更新大版本。在必要的时候,可以通过运行 npm run version:patch 来升补丁版本,运行输出如下:

如果要求所有的版本号不超过 10,即 0.0.9 的下个版本是 0.1.0 而不是 0.0.10,可以编写简单的 shell 脚本来实现(注意这样会破坏 semver 的约定),具体步骤如下:

首先,在 scripts 目录下新增 bump.sh(别忘了文件的可执行权限:chmod a+x scripts/bump.sh):

#!/usr/bin/env bash# get major/minor/patch version to change
version=`cat package.json| grep version | grep -v release | awk -F\" '{print $4}'`
components=($(echo $version | tr '.' '\n'))
major=${components[0]}
minor=${components[1]}
patch=${components[2]}release='patch';# decide which version to increment
if [ $patch -ge 9 ]; thenif [ $minor -ge 9 ]; thenrelease='major'elserelease='minor'fi
elserelease='patch'
fiecho "major=$major, minor=$minor, patch=$patch, release=$release"# upgrade version
npm run release:$release

然后,在 package.json 中新增 bump 子命令:

     "release:major": "npm version major && git push && git push --tags",
+    "bump": "scripty","precommit": "lint-staged",

在必要的时候执行 npm run bump,输出示例如下:

使用 npm script 进行服务进程和日志管理

在生产环境的服务进程和日志管理领域,pm2 是当之无愧的首选,功能很强大,使用简单,开发环境常用的是 nodemon。

在我们的项目中使用 npm script 进行服务进程和日志管理的基本步骤如下:

1. 准备 http 服务

在使用 npm script 作为构建流水线的基础上,我们在项目中引入了 express 和 morgan,并使用如下脚本启动 http 服务器方便用户访问我们的网页(morgan 使用来记录用户的访问日志的):

先安装依赖:

npm i express morgan -D
# npm install express morgan --save-dev
# yarn add express morgan -D

然后在根目录下创建文件 server.js,内容如下:

const express = require('express');
const morgan = require('morgan');const app = express();
const port = process.env.PORT || 8080;app.use(express.static('./dist'));
app.use(morgan('combined'));app.listen(port, err => {if (err) {console.error('server start error', err); // eslint-disable-lineprocess.exit(1);}console.log(`server started at port ${port}`);  // eslint-disable-line
});

2. 准备日志目录

为简单起见,我们项目中创建日志存储目录 logs,有些公司可能不会把日志存在项目部署目录下:

mkdir logs
touch logs/.gitkeep
git add logs/.gitkeep
git commit -m 'add logs folder'

并且设置该目录为 git 忽略的,再改动 .gitignore:

 dist
+logs

TIP#21:这里加 logs/.gitkeep 空文件的目的是为了能把 logs 目录提交到 git 里面,但是我们故意忽略 logs 目录里面的内容,这是在 git 中提交目录结构而忽略其中内容的常见做法。

3. 安装和配置 pm2

安装 pm2 作为依赖:

npm i pm2 -D
# npm install pm2 --save-dev
# yarn add pm2 -D

然后添加服务启动配置到项目根目录下 pm2.json,更多配置项可以参照文档:

{"apps": [{"name": "npm-script-workflow","script": "./server.js","out_file": "./logs/stdout.log","error_file": "./logs/stderr.log","log_date_format": "YYYY-MM-DD HH:mm:ss","instances": 0,"exec_mode": "cluster","max_memory_restart": "800M","merge_logs": true,"env": {"NODE_ENV": "production","PORT": 8080,}}]
}

上面的配置指定了服务脚本为 server.js,日志输出文件路径,日志时间格式,进程数量 = CPU 核数,启动方式为 cluster,以及两个环境变量。

4. 配置服务部署命令

在没有集成 CI 服务之前,我们的部署命令应该是下面这样的:

     "release:major": "npm version major && git push && git push --tags",
+    "predeploy": "yarn && npm run build",
+    "deploy": "pm2 restart pm2.json","bump": "scripty",

即在部署前需要安装最新的依赖,重新构建,然后使用 pm2 重新启动服务即可,如果你有多台机器跑通1个服务,建议有个集中的 CI 服务器专门负责构建,而部署时就不需要运行 build 了。

每次需要部署服务时只需要运行 npm run deploy 就行了,运行成功输出如下:

5. 配置日志查看命令

至于日志,虽然 pm2 提供了内置的 logs 管理命令,如果某台服务器上启动了多个不同的服务进程,那么 pm2 logs 会展示所有服务的日志,个人建议使用如下命令查看当前服务的日志:

+    "logs": "tail -f logs/*","bump": "scripty",

需要查看日志时,直接运行 npm run logs,运行输入如下:

当然如果你有更复杂的日志查看需求,直接用 cat、grep 之类的命令好了。

到这里,小册的内容基本结束了,接下来的一周,我会准备好视频版教程,在圣诞节的时候放出来给大家。如果你对内容有任何疑问,欢迎留言或者在读者群里面交流


本节用到的代码见 GitHub,想边看边动手练习的同学可以拉下来自己改,注意切换到正确的分支 13-use-npm-script-for-devops


视频版教程已经录制完毕,下载地址:链接: https://pan.baidu.com/s/1gfeZ619 密码: xx8j,请享用


上一篇:实战篇 04:用 npm script 实现构建流水线

用 npm script 实现服务自动化运维相关推荐

  1. 看DLI服务4核心如何提升云服务自动化运维

    DLI是支持多模引擎的Serverless大数据计算服务,免运维也是其作为Serverless云服务面向客户时的一个重要的特性.那么对于服务本身我们是如何实现整个服务的运维呢?今天我们来说说DLI是如 ...

  2. 基于Kubernetes的微服务自动化运维

    作者:禅与计算机程序设计艺术 基于Kubernetes的微服务自动化运维 本文将介绍如何使用Kubernetes进行微服务自动化运维,提高团队的工作效率和服务的可靠性.本文将阐述微服务自动化运维的实现 ...

  3. 自动化运维之 安装部署 Ansible 服务

    Ansible 概述 由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统方式进行维护使得工作效率低下.这是,部署自动化运维就可以尽可能的安全.高效地完成 ...

  4. WebHook入门教程:快速实现自动化运维,如自动热部署、自动重启服务、自动备份数据库等等

    WebHook入门教程 当我们向Github仓库(其他支持webhook的Git仓库都可以)Push代码后,可以通过webhook向特定URL发起一次Post请求,本篇文章所说的WebHook,就是运 ...

  5. LinuxProbe 0x21 使用Ansible服务实现自动化运维

    Ansible是最近几年特别火的一款开源运维自动化工具,它能够帮助运维人员肉眼可见地提高工作效率,并减少人为失误.Ansible有上千个功能丰富且实用的模块,而且有详尽的帮助信息可供查阅,因此即便是小 ...

  6. saltstack自动化运维部署--安装apache\原码安装nginx服务

    对saltstack自动化运维部署的认识 原理 SaltStack 是一种基于 C/S 架构的服务器基础架构集中化管理平台,管理端称为 Master,客户端称为 Minion.SaltStack 具备 ...

  7. 大型企业中如何批量管理千万台服务器之ansible自动化运维工具详解 [⭐建议收藏⭐]

    文章目录 ansible 自动化运维工具 详解 关于作者 作者介绍 一.ansible 概述 1.1 ansible 概述 1.2 是什么要使用 ansible 1.3 ansible 功能 1.4 ...

  8. 自动化运维—saltstack

    2019独角兽企业重金招聘Python工程师标准>>> 自动化运维--saltstack .ansible 一.自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁 ...

  9. 自动化运维工具----ansible

    自动化运维工具----ansible ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能. 主要模块以及功能 ...

最新文章

  1. 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜...
  2. python爬百度翻译-教大家用python爬取百度翻译,超简单
  3. USTC English Club Note20211108
  4. 建议收藏!最新的(2019年)电子/计算机领域SCI期刊影响因子大全
  5. POJ_1062_(dijkstra)
  6. 深度解读Microsoft Build 2020:提升开发效率,优化开发环境
  7. shiro学习(24):Spring的transaction-manager的用法
  8. Magento教程 4:主机环境准备
  9. idea debug调试_IDEA中debug调试(非多线程)
  10. 使用c#调用XMLHTTP(XMLHTTPClass) ,发送和返回 json
  11. IIS7下访问ashx页面,显示404
  12. laravel访问路由在nginx服务器上无法处理
  13. 收银机收款机USB通讯接口(341驱动) 可以用于客显 小票打印机
  14. laravel的elixir和gulp用来对前端施工
  15. android 百度地图骑行路线颜色及宽度更改
  16. hashCode() vs equals() vs ==
  17. python做飞机大战游戏_python实现飞机大战游戏
  18. 7-6 吃鱼还是吃肉 (20 分)
  19. 从伯努利分布到交叉熵(一)
  20. Android编程权威指南第3版 源代码

热门文章

  1. 软件库网站源码+附手机版
  2. C# 系统服务 删除后禁用 ,删除不彻底;删除后无法重装问题解决方案
  3. 中医与佛教共同推出的养生秘诀 100 条
  4. Linux: chm转HTML How to Convert chm files to HTML or PDF files
  5. 【jQuery插件】textSlider 文字滚动插件
  6. Network Embedding中方法回顾
  7. 搭建php docker环境日记
  8. linux设置date-hwclock-clock
  9. linux work queue
  10. shell学习过程中的错误集锦