发现了一篇以前写的笔记。那时候的我甚至都不知道用 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', watch: false, ignore_watch: [], env: { NODE_ENV: "dev", MODE: "default" }, env_production: { NODE_ENV: "production", MODE: "pro" }, env_release: { NODE_ENV: "release" } },{ name: 'app2', script: './src/index2.js', exec_mode: 'fork', env: { NODE_ENV: "dev", MODE: "default" }, env_production: { NODE_ENV: "production", MODE: "pro" }, env_release: { NODE_ENV: "release" } }], deploy : { test : { user : 'root', host : '8.8.8.8', 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', 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.
这个是大学时的用的方案。
步骤
- 安装scp2
1
| npm install scp2 --save-dev
|
- 配置服务器SSH远程登陆账号信息
略
- 创建自动化部署脚本
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')); } } );
|
- 添加 package.json 中的 scripts 命令
1 2 3
| "scripts": { "deploy:dev": "npm run build && cross-env NODE_ENV=dev node ./deploy" }
|