ftp自動上傳
在我們平時開發項目時,需要將本地代碼編譯后上傳到服務器,我們可以借助Node.js庫中的ssh2來實現自動上傳
首先我們先來說下ssh2的安裝和使用
- 安裝ssh2
npm install ssh2
- 創建ssh2實例
const { Client } = require('ssh2');
- 連接服務器
const conn = new Client();conn.on('ready', () => {console.log('SSH Connection Ready');// 可以在這里執行命令、上傳文件等}).on('error', (err) => {console.error('Connection Error:', err);}).on('close', () => {console.log('Connection Closed');}).connect({host: 'your-server-ip',port: 22, // SSH 默認端口username: 'your-username',password: 'your-password', // 或使用 privateKey});
4.通過 SFTP 上傳文件到遠程服務器。
首先,你需要確定你的本地編譯后的文件路徑和目標服務器的文件路徑。然后,你可以使用 SFTP(SSH File Transfer Protocol)協議來上傳文件。以下是一個簡單的示例:
conn.sftp((err, sftp) => {if (err) throw err;const localFile = './local-file.txt'; // 本地文件地址,相對地址基于當前腳本const remoteFile = '/path/to/remote-file.txt';sftp.fastPut(localFile, remoteFile, {}, (err) => {if (err) {console.error('上傳失敗:', err);} else {console.log('文件上傳成功');}conn.end();});});
完整代碼如下
const ssh2 = require('ssh2')let conn = new ssh2.Client();connect()
// 上傳操作
function connect () {conn.on('ready', () => {conn.sftp((err, sftp) => {sftp.fastPut('./dist.tar.gz', '/opt/web/dist.tar.gz', {}, (err, result) => {//上傳完成后開始解壓Shell(conn)})})}).connect({host: '10.10.10.10',port: '22',username: 'root',password: 'root'})
}// 解壓部署操作
function Shell (conn) {conn.shell((err, stream) => {stream.end(`cd /opt/webtar zxvf ./dist.tar.gzrm -rf dist.tar.gzexit`//進入服務器暫存地址//解壓上傳的壓縮包//刪除壓縮包//退出).on('data', data => {console.log(data.toString())}).on('close', () => {conn.end()})})
}
有時我們想將打包build這一步操作也放入進入,或者使用的是lerna多包一起打包時,先打包完成再一起上傳,這里我們需要用到node插件child_process
child_process 是 Node.js 中的一個核心模塊,用于創建和管理子進程。它允許你從 Node.js 程序中啟動和控制其他進程(例如 shell 腳本、命令行工具或其他 Node.js 腳本),使得 Node.js 可以與外部程序交互,進行并行處理。
假如我們現在有一個文件./build-test.sh是處理vue或者其他項目打包的腳本,我們可以使用child_process來執行這個腳本,如下:
# build各個微應用
lerna run --scope '{test1,test2,test3}' build:test
# 移動各個包至根目錄
mv ./test1/test1 ./
mv ./test2/test2 ./
mv ./test3/test3 ./
# 將各個應用打包輸出
tar -czvf dist.tar.gz ./test1 ./test2 ./test3
rm -rf ./test1 ./test2 ./test3
先將多個包打包后再進行gz壓縮,最后輸入一個壓縮包
對應調用./build-test.sh的腳本如下
//執行tar.sh腳本獲取輸出流
let pro = cp.exec('"./build-test.sh"', (error) => {if (error) {console.log(error)}
})pro.stdout.pipe(process.stdout)
pro.on('exit', () => {//打包完成后上傳// dosome thing
})
到這里了我們就可以直接調用我們之前寫好的connect方法,來進行FTP上傳
const cp = require('child_process')
//此包ssh2需要下載
const ssh2 = require('ssh2')//執行tar.sh腳本獲取輸出流
let pro = cp.exec('"./build-test.sh"', (error) => {if (error) {console.log(error)}
})pro.stdout.pipe(process.stdout)
pro.on('exit', () => {//打包完成后上傳// 上傳connect()
})let conn = new ssh2.Client();// 上傳操作
function connect () {conn.on('ready', () => {conn.sftp((err, sftp) => {sftp.fastPut('./dist.tar.gz', '/opt/web/dist.tar.gz', {}, (err, result) => {//上傳完成后開始解壓Shell(conn)})})}).connect({host: '10.10.10.10',port: '22',username: 'root',password: 'root'})
}// 解壓部署操作
function Shell (conn) {conn.shell((err, stream) => {stream.end(`cd /opt/webtar zxvf ./dist.tar.gzrm -rf dist.tar.gzexit`//進入服務器暫存地址//解壓上傳的壓縮包//刪除壓縮包//退出).on('data', data => {console.log(data.toString())}).on('close', () => {conn.end()})})
}