一行命令部署项目

Author Avatar
Klein 11月 12, 2023

发现了一篇以前写的笔记。那时候的我甚至都不知道用 npm ci

前言

没优化前的部署的流程很繁琐,本地 build 项目,接着把 dist 通过 xftp 上传到服务器上,想优化下这个过程。

方案1

这是第一份工作时用的方案。

准备工作:

为服务器配置ssh免密登录,这样才能保证成功地拉下代码。

使用 PM2 的 ecosystem.config.js 来部署发布应用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
module.exports = {
apps : [{
name: 'app1',
script: './src/index.js',
exec_mode: 'cluster',
instances: '0', //最大数量的node应用实例
watch: false, //是否开启监听模式,任意文件内容发生改变,都会重启node应用
ignore_watch: [], //监听模式下,忽略的文件列表
env: { //默认的环境变量
NODE_ENV: "dev",
MODE: "default"
},
env_production: { //生产环境变量,需要在命令行中添加参数 --env production
NODE_ENV: "production",
MODE: "pro"
},
env_release: { //预生产环境变量,需要在命令行中添加参数 --env pre_production
NODE_ENV: "release"
}
},{
name: 'app2',
script: './src/index2.js',
exec_mode: 'fork', //默认的模式,只会在单核上运行node应用,无法充分利用多核cpu的性能,一般不推荐使用
env: { //默认的环境变量
NODE_ENV: "dev",
MODE: "default"
},
env_production: { //生产环境变量,需要在命令行中添加参数 --env production
NODE_ENV: "production",
MODE: "pro"
},
env_release: { //预生产环境变量,需要在命令行中添加参数 --env pre_production
NODE_ENV: "release"
}
}],
deploy : {
test : {
user : 'root', //服务器用户名
host : '8.8.8.8', //服务器ip地址
ref : 'origin/main', //需要拉取的仓库分支
repo : 'git@github.com:test/test.git', //仓库地址
path : '/var/test', //需要发布到服务器的路径
'pre-setup': '', //在安装进程启动之前需要执行的命令
'post-setup': "npm install && pm2 start ecosystem.config.js --env dev", //拉取代码之后需要执行的指令
'pre-deploy': '', //部署之前的钩子
'post-deploy': 'pm2 reload ecosystem.config.js --env dev'
},
production : {
user : 'root', //服务器用户名
host : '8.8.8.8', //服务器ip地址
ref : 'origin/main', //需要拉取的仓库分支
repo : 'git@github.com:test/test.git', //仓库地址
path : '/var/test', //需要发布到服务器的路径
'pre-setup': '', //在安装进程启动之前需要执行的命令
'post-setup': "npm install && pm2 start ecosystem.config.js --env production", //拉取代码之后需要执行的指令
'pre-deploy': '',
'post-deploy': 'pm2 reload ecosystem.config.js --env production'
},

}

现在用命令部署:

pm2 deploy ecosystem.config.js production

方案2

利用scp2自动化部署到静态文件服务器 Nginx.

这个是大学时的用的方案。

步骤

  1. 安装scp2
1
npm install scp2 --save-dev
  1. 配置服务器SSH远程登陆账号信息

  1. 创建自动化部署脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
const scpClient = require('scp2');
const ora = require('ora');
const chalk = require('chalk');
const server = require('./products');
const spinner = ora('正在发布到' + (process.env.NODE_ENV === 'prod' ? '生产' : '测试') + '服务器...');
spinner.start();
scpClient.scp(
'dist/',
{
host: server.host,
port: server.port,
username: server.username,
password: server.password,
path: server.path
},
function (err) {
spinner.stop();
if (err) {
console.log(chalk.red('发布失败.\n'));
throw err;
} else {
console.log(chalk.green('Success! 成功发布到' + (process.env.NODE_ENV === 'prod' ? '生产' : '测试') + '服务器! \n'));
}
}
);
  1. 添加 package.json 中的 scripts 命令
1
2
3
"scripts": {
"deploy:dev": "npm run build && cross-env NODE_ENV=dev node ./deploy"
}