
内容声明
本文仅用于技术分享和学习交流,内容不包含任何广告、推广、引流、付费课程或外链信息。所有示例和配置均为技术实践,欢迎参考和自定义。
本文介绍了如何在无法直接访问 GitLab 的生产环境中,通过 SCP 和 SSH 实现代码上传及项目重启。利用 scp2 和 ssh2 npm 包完成文件传输与命令执行,并通过 webpack 打包脚本以适配 GitLab CI/CD 环境,解决依赖缺失问题,实现自动化部署。
在项目部署上线的过程中,正常流程是在生成环境 Git 拉取最新代码来进行更新。但是某些极端情况下,由于内网管控的封闭性,生产环境无法拉取 GitLab 端所存储的代码,此时便只能通过 SCP 和 SSH 来曲线救国了。
借助 scp2 和 ssh2 这两个 npm 包,实现项目代码的上传和启动。
npm i scp2 ssh2 -Ddeploy.example.js:
// 服务器信息
const host = '127.0.0.1';
const username = 'root';
const password = 'password';
const port = 22;
const projectName = 'example-web';
const path = `/root/web/${projectName}/`;
// 上传
async function upload () {
const client = require('scp2');
const remoteAddress = `${username}:${password}@${host}`;
return new Promise((resolve, reject) => {
client.scp(`../${projectName}`, `${remoteAddress}:${path}`, err => {
if (err) {
reject(`Fail: 1 ${err.message}`);
return;
}
resolve('upload success!');
})
});
}
// 重启
async function restart () {
var Client = require('ssh2').Client;
var conn = new Client();
return new Promise((resolve, reject) => {
conn.on('ready', function() {
console.log('Client :: ready');
conn.exec(`cd ${path};pwd;npm i;npm run restart;`, function(err, stream) {
if (err) throw err;
stream.on('close', function(code, signal) {
console.log('Stream :: close :: code: ' + code + ', signal: ' + signal);
conn.end();
resolve('restart success!');
}).on('data', function(data) {
console.log('STDOUT: ' + data);
}).stderr.on('data', function(data) {
console.log('STDERR: ' + data);
});
});
}).connect({
host,
port,
username,
password,
});
});
}
// 启动任务
;(async () => {
// 上传
const uploadResult = await upload().catch(console.error);
console.log(uploadResult);
// 重启
const restartResult = await restart().catch(console.error);
console.log(restartResult);
})();此时已经可以在本地进行部署了。但是使用 GitLab CICD 进行部署的时候会遇到问题,就是 GitLab 容器环境中并没有 scp2 和 ssh2 这两个 npm 包,我们可以借助 webpack 将以上脚本打包成 Node 容器环境可直接运行的脚本。
webpack.config.deploy.example.js:
const path = require('path');
module.exports = {
entry: './deploy.example.js',
mode: 'production',
output: {
filename: 'deploy.example.bin.js',
path: path.resolve(__dirname, './'),
},
target: 'node',
node: {
dgram: 'empty',
child_process: 'empty',
fs: 'empty'
}
};package.json:
{
// ...
"node": {
"http": false,
"https": false,
"net": false,
"path": false,
"stream": false,
"tls": false,
"fs": "empty"
}
}npx webpack --config webpack.config.deploy.example.js:

更新记录
本文首次编辑于 2021-07-16,最近更新于 2025-12-07。项目代码在 Node.js 8.x 上已测试可稳定运行。
版权声明
本文为原创文章,作者保留版权。转载请保留本文完整内容,并以超链接形式注明作者及原文出处。
作者: 除除
原文: http://blog.mazey.net/2180.html
(完)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。