ssh2-sftp-client一键将你的前端项目部署到远程服务器,你只需要专注写bug就好了
当你的项目完成差不多了,要发到线上了,你的常规操作是什么?
- npm run build
- 打开
xftp
软件 - 进入相应的目录
- 删除现存的
html
目录 - 把打包出来的
dist
重命名为 `html - 在
xftp
上传新打包的目录
看完以上流程,操作一次两次还好,但是日积月累下来,你的生命会被它折腾的没有意义,当然,你可能也会想到使用github action或者gitlab runner或者docker等云端部署,但是当你遇到你不是服务器的root管理员,又遇到node版本不能升级等问题,估计你也会被搞得很心累吧,所以这里就推荐最后一招,直接模拟人工操作。
ssh2-sftp-client 是什么?
ssh2-sftp-client 为node.js
基于ssh2
封装的,SFTP客户端
。
三个关键词:
- node.js:OK,这是目前几乎所有前端都会用到的一门语言,你也不例外。
- ssh2: 这里的ssh2不是指协议,而是指一个
node.js
为ssh2 client
(ssh2客户端)的实现:GitHub - mscdex/ssh2: SSH2 client and server modules written in pure JavaScript for node.js - SFTP客户端: SSH File Transfer Protocol的缩写,安全文件传送协议
简单来说:ssh2-sftp-client
基于 ssh2
库进行了封装,让 文件传输
相关的方法变得更为简洁,还支持了 Promise
。
这就是为什么我推荐 ssh2-sftp-client
,而不是直接使用 ssh2
,因为它在文件传输这件事上——对开发者而言,更友好!
怎么实现自动部署?
1.安装
npm install ssh2-sftp-client -dev
# or
yarn add ssh2-sftp-client -D
2.写脚本
在项目根目录创建publish.js脚本,黏贴一下代码,并且修改服务器地址和用户名密码等信息,最后修改将哪个文件夹上传到服务器的什么位置
const { exec } = require('child_process')
const Client = require('ssh2-sftp-client')
const sftp = new Client()
// Step 1: Run the build command
console.log('Starting build process...')
exec('pnpm run test:testjp', (error, stdout, stderr) => {
if (error) {
console.error(`Build error: ${error.message}`)
return
}
if (stderr) {
console.error(`Build stderr: ${stderr}`)
}
console.log(`Build stdout: ${stdout}`)
console.log('Build process complete.')
// Step 2: Upload the dist folder to the server
sftp.connect({
host: '服务器地址',
port: '22',
username: '用户名',
password: '密码',
})
.then(() => {
console.log('Connected to server. start uploading...')
return sftp.uploadDir('dist', '/home/服务器地址')
})
.then(() => {
console.log('Upload complete.')
return sftp.end()
})
.catch((err) => {
console.error(`Upload error: ${err.message}`)
})
})
3.执行
在package.json的scripts标签中加入一条:
"deploy": "node ./deploy.js"
这样,在你执行完 yarn build
之后,只需要执行一下 yarn deploy
,你的构建产物就能 嗖
地一声传到远程服务器的目标路径啦~
注意事项
任何时候,把你的账号密码
git commit
都是一件危险的事情。
所以,在 项目根目录
下创建 .auth/ftp.json
文件,并把它加入 .gitignore
:
其中,ftp.json
用来存储你的敏感信息:
{
"host": "139.9.1xx.xxx",
"port": 22,
"user": "root",
"password": "**********"
}
然后,在你的脚本文件 scripts/deploy.js
中引入 json
,而不是 硬编码
的方式记录 账号密码ip
。
const config = require('../.auth/ftp.json')
await sftp.connect(config) // 很重要!万事安全第一!