自动化部署sftp脚本

文件夹上传

比如前端的部署,一般需要上传整个打包后的dist文件

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
const path = require('path');
const Client = require('ssh2-sftp-client');
const sftp = new Client();
const config = {
host: '',
port: '22',
username: 'root',
password: ''
}

/**
* 上传文件到sftp
* @param { Object } config sftp 链接配置参数
* @param { String } config.host sftp 主机地址
* @param { String } config.port sftp 端口号
* @param { String } config.username sftp 用户名
* @param { String } config.password sftp 密码
*
* @param { Object } options 配置参数
* @param { String } localStatic // 本地静态资源文件夹路径
* @param { String } remoteStatic // 服务器静态资源文件夹路径
* @param { String } localFile // 本地html页面
* @param { String } remoteFile // 服务器html页面
*/
function upload(config, options) {
sftp.connect(config).then(() => {
console.log('sftp链接成功');
console.log('文件上传中');
return sftp.uploadDir(options.localStatic, options.remoteStatic);
}).then((data) => {
console.log('文件上传成功');
sftp.end();
}).catch((err) => {
console.log('上传失败', err);
sftp.end();
})
}

// 上传文件
upload(config, {
localStatic: path.resolve(__dirname, './build/libs'), // 本地文件夹路径
remoteStatic: '/home/zou/pokemon/build/libs', // 服务器文件夹路径器
})

单文件上传

把uploadDir改成put即可

1
sftp.put('', '')

hexo图片上传替换

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
const path = require('path');
const Client = require('ssh2-sftp-client');
const fs = require('fs');

const sftp = new Client();
const config = {
host: '',
port: '22',
username: 'root',
password: ''
}
const waitFileList = []
let fileCount = 0
// 读取所有的文章,检查路径,匹配本地的images,然后给对应图片上传,替换路径
function startUpload() {
const p = path.resolve(__dirname, './source/_posts')
fs.readdir(p, (err, files) => {
if (err) throw err;
// console.log(files); // 打印文件列表
fileCount = files.length
files.forEach(file => {
updateFile(file)
});
});

}

function updateFile(fileName) {
const filePath = path.resolve(__dirname, './source/_posts/' + fileName)
// 异步读取文件
fs.readFile(filePath, 'utf8', (err, data) => {
fileCount--
if (err) throw err;

if (/\(..\/images\/[\w-]+.[A-Za-z]+\)/g.test(data)) {
console.log(fileName)
const regex = /\(..\/images\/[\w-]+.[A-Za-z]+\)/g;
const fileNames = data.match(regex);
const names = fileNames.map(item => {
return item.substring(11, item.length - 1)
})
waitFileList.push(...names)
// upload
const modifiedData = data.replace(/..\/images\//g, 'https://yifengtingyu.cn/img/hexo/')
fs.writeFile(filePath, modifiedData, 'utf8', (err) => {
if (err) throw err;
console.log('修改文件' + fileName);
});
}
if (fileCount <= 0 && waitFileList.length) {
upload(waitFileList)
}
});
}

function upload(fileNames) {
sftp.connect(config).then(() => {
console.log('sftp链接成功');
let r
fileNames.forEach(fileName => {
console.log('文件上传中:' + fileName);
r = sftp.put(path.resolve(__dirname, './source/images/' + fileName), '/home/zou/www/img/hexo/' + fileName);
})
return r
}).then((data) => {
console.log('文件上传成功');
sftp.end();
}).catch((err) => {
console.log('上传失败', err);
sftp.end();
})
}

startUpload()

自动化部署sftp脚本
https://yifengtingyu.cn/2024/04/22/自动化部署sftp脚本/
作者
依风听雨
发布于
2024年4月22日
许可协议