最近在做前端项目时,出现一个问题,我想在服务端跑项目,但是呢,运维说svn仓库那台服务器(服务器A)我无权限操作,但可以申请一台新的服务器(服务器B)给我跑vue项目,于是就有了这个需求:svn同时提交到两台服务器AB上,同步代码。刚开始 绞尽脑汁去想怎么做到,甚至想到了用svn 的生命钩子,或者是基于node,先在服务器B上装git仓库,然后在本地执行一行命令,svn提交代码至服务器A上,也git提交代码至服务器B上,貌似是个解决问题的办法,但是还是有些繁琐。最终被我想到了更好的办法。
需求细化,首先在服务器B上只是为了跑项目,那么我们是不会直接在服务器B上改代码的,我的办法就是直接在服务器B上装svn,然后在服务器B山像本地一样将服务器A中svn仓库的代码拉过去,这样只要在服务器B上每次执行svn up就可以了,但实际情况是我们不能每次都手动远程连接服务器B执行svn up,显然是不合适的。怎么办呢?很简单,在本地项目中用npm安装ssh2,每次执行一行命令,然后实现在将代码提交到服务器A 上的同时,远程连接服务器B,同时执行svn up,代码如下:
let Client = require('ssh2').Client;
let conn = new Client();
let conf = require('./projectConfig');
let exec = require('child_process').execSync;
svnOrder();
// 更新dev服务器的代码
function devUpdate() {
conn.on('ready', () => {
console.log('Client :: ready');
conn.exec('svn up /usr/local/html/fd2020/mobile', (err, steam) => {
if (err) {
console.log('dev 代码上传错误:', err)
} else {
console.log('dev代码更新成功');
}
process.exit();
})
}).connect({
host: '10.0.29.****',
port: 22,
username: '****',
password: '****'
});
}
// 执行svn 相关命令并做相应操作
function svnOrder() {
let str0 = execOrder('svn up');
let str = execOrder(`svn commit -m "上传${conf.projectName}项目到dev, version:${conf.version}"`);
if (str.indexOf('Committed') > -1) {
console.log('svn 代码提交成功!');
devUpdate(str0 + str);
return true;
} else if (str.indexOf('in conflict') > -1) {
console.log('svn 提交时代码有冲突, 请手动解决');
} else if (!str) {
console.log('svn 暂无可提交代码');
devUpdate(str0);
return true;
} else {
console.log('svn 提交时出现问题, 请手动解决');
}
return false;
}
// 执行系统命令
function execOrder(order) {
let log = exec(order);
let buffer = Buffer.from(log);
console.log(buffer.toString());
return buffer.toString();
}
说了一大堆其实原理很简单,换种思路想想就好了。有不清楚的可以私聊我哦