实现一个自动化部署自己的简历服务

473 阅读5分钟

前言

每一次自己在公司写完代码之后,都是通过公司的CI-CD的工具去点点点部署代码的,小菜鸡的我为了弄懂里面原理,然后就。。。

步骤

  • 1.本地构建一个express服务
  • 2.把本地文件上传到服务器
  • 3.在服务器安装node环境,并用pm2来部署nodeJs项目
  • 4.编写自动构建脚本
  • 5.测试

1.在本地构建起一个express项目

首先我们需要npm init -y 新建一个package.json文件,并安装express npm install -S express,然后新建一个app.js

 //  app.js
 let express = require('express');
  let app = express();
  app.use(express.static('assets'));
  app.listen(8888,()=>{
      console.log('server is run 8888')
  });

在项目中新建assets目录,该目录是用于静态资源,我们这里就把自己的简历模板的html文件放在里面,下图是项目目录 接下来我们node app.js启动本地服务我们就可以通过http:localhost:8888访问我们的index.html

2.把本地文件上传到服务器

我们通过ssh命令远程登录到自己的服务器,ssh root@ip(自己的服务器),这里你也可以进行配置免密登录,这里就不详细说了,想学习的可以看blog.csdn.net/u014568993/…

然后在服务器新建一个demo的文件夹,接下来回到我们本地利用scp命令远程的把本地的文件上传到服务器 scp 本地文件路径 root@ip:服务器文件夹路径

3.在服务器安装node环境,并用pm2来部署nodeJs项目

如果你的服务器一开始没有安装node环境的话是需要先安装node环境的,我自己的服务器是centos7的,下面我们来安装node环境

  • sudo yum -y update 更新源
  • 在CentOS 7和Fedora 31/30/29上安装Node.js 12 LTS

要在CentOS 7和Fedora 31/30/29上安装Node.js 12.x LTS,请使用NodeSource二进制发行版:curl -sL rpm.nodesource.com/setup_12.x | sudo bash -

然后

sudo yum clean all && sudo yum makecache fast

sudo yum install -y gcc-c++ make

sudo yum install -y nodejs

最后执行node -v来检查一下是否安装node环境成功

下面我们安装pm2,并利用pm2来部署node服务 首先让我们一下pm2到底是什么?

pm2 是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的(但是又不是完美的,后面我会另外下一篇介绍一下pm2的缺点,并去解决)。

我需要先在服务器全局安装pm2

sudo npm install -g pm2

安装完之后我们启动pm2 如果想了解pm2更多只是也可以去官网学习pm2.keymetrics.io/

然后我们启动服务 pm2 start app.js 这样子我们就启动成功了

然后访问http://58.87.69.242:3000/ 就可以访问到我们的服务啦

是不是瞬间觉得自己是最靓的仔,以后你出去面试的时候直接就附上链接给面试官看你的简历,是不是和别人有那么一点与众不同。

4.编写自动构建脚本(重点)

下面我们在项目新建一个bin文件夹新建index.js文件

#!/usr/bin/env node
const shell = require('shelljs'); //  编写脚本的库
const path = require("path");
const chokidar = require('chokidar')  //  监听文件变动的库

const from =  path.join(__dirname, '../assets/index.html') //  需要上传文件的路径
const to = "root@58.87.69.242:/root/demo/assets" //  上传到服务器的路径
const password = "服务器密码"
const expectPath = path.join(__dirname, '../expect.exp')  //这个工具会模拟我们访问服务器的时候需要我们输入密码的操作,还可以设置免密登录就不需要这个文件的编写了。

const watcher = chokidar.watch(process.cwd())
watcher.on('change', function(filePath){
	//  监听文件变化
    console.log('filePath',filePath)
    shell.exec(`expect ${expectPath} ${from} ${to} ${password}`)
   
})

1.chokidar 是什么?

chokidar 是封装 Node.js 监控文件系统文件变化功能的库

2.Node.js 原生的监控功能不好用吗?为什么要进行这样的封装?

Node.js 原生的监控功能还真有问题,根据 chokidar 的介绍,有如下问题:

  • Node.js fs.watch:

    1.在 MacOS 上不报告文件名变化
    
    2.在 MacOS 上使用 Sublime 等编辑器时,不报告任何事件
    
    3.经常报告两次事件
    
    4.把多数事件通知为 rename
    
    5.没有便捷的方式递归监控文件树
    
  • Node.js fs.watchFile

    1.事件处理有大量问题
    
    2.不提供递归监控文件树功能
    
    3.导致 CPU 占用高
    

所以我们采用chokidar来监听文件变动。

//  expect.exp

#!/usr/bin/expect

set from [lindex $argv 0]
set to [lindex $argv 1]
set password [lindex $argv 2]
set timeout 30
spawn bash -c "scp $from $to"
expect {
    "*password:" { send "$password\r" }
}
interact

最后在package.json设置bin命令,记得npm link软连接一下

//  package.json
{
  "name": "demo",
  "version": "1.0.0",
  "bin": {
    "cli": "./bin/index.js"
  },
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "express": "^4.17.1",
    "chokidar": "^3.3.1",
    "shelljs": "^0.8.3"
  },
  "scripts": {
    "dev": "node ./app.js"
  }
}

好了,下面我们来启动我们的项目,在命令行输入 cli就开始了监听,然后修改我们的index.html文件,把张三李四888改成张三李四666 在命令行就自动执行帮上传文件到我们的服务器,我们再来访问一下我们的页面

最后成功的看到我们改变文件内容的效果。

总结

我们简单的完成一个node服务的部署,并且监听文件修改自动化的部署到我们服务器上,但是这里只是修改我们的静态文件,如果是修改我们的node文件的话,虽然可以利用pm2进行零秒热启动进行部署,但是如果一个项目的qps过高的话,也会出现白屏的情况,例如淘宝在双十一的时候,如果发现一个bug修改完再去部署,用户可能会出现白屏的情况,那白屏的时间分分钟是上亿的成交量,影响极其大,所以我们需要解决node的热更新部署方案,后面我会对node的热更新部署方案进行介绍。

下回再见~