用 npm script 实现服务自动化运维
用 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 实现服务自动化运维相关推荐
- 看DLI服务4核心如何提升云服务自动化运维
DLI是支持多模引擎的Serverless大数据计算服务,免运维也是其作为Serverless云服务面向客户时的一个重要的特性.那么对于服务本身我们是如何实现整个服务的运维呢?今天我们来说说DLI是如 ...
- 基于Kubernetes的微服务自动化运维
作者:禅与计算机程序设计艺术 基于Kubernetes的微服务自动化运维 本文将介绍如何使用Kubernetes进行微服务自动化运维,提高团队的工作效率和服务的可靠性.本文将阐述微服务自动化运维的实现 ...
- 自动化运维之 安装部署 Ansible 服务
Ansible 概述 由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统方式进行维护使得工作效率低下.这是,部署自动化运维就可以尽可能的安全.高效地完成 ...
- WebHook入门教程:快速实现自动化运维,如自动热部署、自动重启服务、自动备份数据库等等
WebHook入门教程 当我们向Github仓库(其他支持webhook的Git仓库都可以)Push代码后,可以通过webhook向特定URL发起一次Post请求,本篇文章所说的WebHook,就是运 ...
- LinuxProbe 0x21 使用Ansible服务实现自动化运维
Ansible是最近几年特别火的一款开源运维自动化工具,它能够帮助运维人员肉眼可见地提高工作效率,并减少人为失误.Ansible有上千个功能丰富且实用的模块,而且有详尽的帮助信息可供查阅,因此即便是小 ...
- saltstack自动化运维部署--安装apache\原码安装nginx服务
对saltstack自动化运维部署的认识 原理 SaltStack 是一种基于 C/S 架构的服务器基础架构集中化管理平台,管理端称为 Master,客户端称为 Minion.SaltStack 具备 ...
- 大型企业中如何批量管理千万台服务器之ansible自动化运维工具详解 [⭐建议收藏⭐]
文章目录 ansible 自动化运维工具 详解 关于作者 作者介绍 一.ansible 概述 1.1 ansible 概述 1.2 是什么要使用 ansible 1.3 ansible 功能 1.4 ...
- 自动化运维—saltstack
2019独角兽企业重金招聘Python工程师标准>>> 自动化运维--saltstack .ansible 一.自动化运维介绍 传统运维:传统运维效率低,大多工作需要人工完成,工作繁 ...
- 自动化运维工具----ansible
自动化运维工具----ansible ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置.批量程序的部署.批量运行命令等功能. 主要模块以及功能 ...
最新文章
- 2019金融科技风往哪儿吹?蚂蚁金服联合20余家金融机构预测新年热点:5G、区块链上榜...
- python爬百度翻译-教大家用python爬取百度翻译,超简单
- USTC English Club Note20211108
- 建议收藏!最新的(2019年)电子/计算机领域SCI期刊影响因子大全
- POJ_1062_(dijkstra)
- 深度解读Microsoft Build 2020:提升开发效率,优化开发环境
- shiro学习(24):Spring的transaction-manager的用法
- Magento教程 4:主机环境准备
- idea debug调试_IDEA中debug调试(非多线程)
- 使用c#调用XMLHTTP(XMLHTTPClass) ,发送和返回 json
- IIS7下访问ashx页面,显示404
- laravel访问路由在nginx服务器上无法处理
- 收银机收款机USB通讯接口(341驱动) 可以用于客显 小票打印机
- laravel的elixir和gulp用来对前端施工
- android 百度地图骑行路线颜色及宽度更改
- hashCode() vs equals() vs ==
- python做飞机大战游戏_python实现飞机大战游戏
- 7-6 吃鱼还是吃肉 (20 分)
- 从伯努利分布到交叉熵(一)
- Android编程权威指南第3版 源代码