一、hooks的使用
我在本地安装了 svn server,需要实现一个功能,当其他人提交了代码,我的本地仓库副本代码(即我自己checkout的副本)自动更新。
这个操作似乎有一点风骚,但是确实有这个需求,因为svnkit工具,只能操作对本地文件(已经checkout的副本)进行操作,模拟用户提交。不能直接修改svn server仓库里的数据。
所以我需要保证我这个副本永远是svn update后最新的代码,实现方式可以搞一个定时任务,自动svn update,还有一个办法就是通过 hook 实现。
实现方法如下
新建hook,选 post-commit hook
也可以自己在hook目录新建post-commit.cmd
代码如下
@echo off
SET WORKING_COPY=F:/tmp/svn/demo
svn update %WORKING_COPY% --username zs --password 123456
这样就是实现了,在其他地方提交的代码,能让我本地代码是最新的
当然也可以在hook里写发送请求的内容,需要按照curl
@echo off
curl http://10.1.5.203:8080/test -X POST -H "Content-type:application/json;charset=utf-8" -d "{\"repo\": \"%1\",\"ver\": \"%2\"}"
SET WORKING_COPY=F:/tmp/svn/demo
svn update %WORKING_COPY% --username zs --password 123456
其中%1是仓库名,%2是版本号
我现在遇到的问题是,windows环境默认编码是GBK,我后台接受到的参数是GBK输入流,用UTF-8接受会乱码。
不得不说,Windows这方面太坑了,Linux和Mac则不会
乱码问题下面会提出解决办法
二、解决乱码
cmd里的curl问题似乎是解决不了,后面尝试各种其他方案
最终确定用 nodejs 执行 js 命令,发现不会乱码
完整代码如下
1、post-commit.cmd
@echo off
chcp 65001
SET NODE_DIRECTORY=F:/Program Files/nodejs
SET POST_COMMIT_JS=F:/VisualSVN/Repositories/post-commit.js
cd %NODE_DIRECTORY% && node %POST_COMMIT_JS% %1 %2
exit 0
2、post-commit.js
var http = require('http');
var hostname = '127.0.0.1';
var post = 15672;
var exchange = 'svn_exchange';
var vhost = 'svn_vhost';
var authorization = 'Basic YWRtaW46YWRtaW4=';
var svnFrom = 'XXXX';
var arguments = process.argv.splice(2);
console.log('所传递的参数是:'+arguments[0]);
var str = "{\"repo\" : \""+arguments[0]+"\", \"ver\": \""+arguments[1]+"\", \"from\": \""+svnFrom+"\"}";
console.log(str);
var post_data = {
"properties": {
"delivery_mode": 2
},
"routing_key": "",
"delivery_mode" : "2",
"payload" : str,
"payload_encoding" : "string"
};
var content = JSON.stringify(post_data);
var options = {
hostname: hostname,
port: post,
path: '/api/exchanges/'+vhost+'/'+exchange+'/publish',
method: 'POST',
headers: {
'Content-Type': 'application/json' ,
'Authorization': authorization,
'x-delay': 5000
}
};
var req = http.request(options, function (res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
});
});
req.on('error', function (e) {
console.log('problem with request: ' + e.message);
});
// write data to request body
req.write(content);
req.end();
三、windows server hooks未生效
2021/12/19日项目正式上线,windows server 有些不兼容,svn提交文件,hooks始终没有执行post-commit.js,即我rabbitmq没有收到消息
需要做如下设置,然后重启 VisualSVN,成功解决
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏