SVN hook post-commit 设置自动更新仓库代码和发送请求

avatar 2021年11月19日15:59:58 6 2687 views
博主分享免费Java教学视频,B站账号:Java刘哥

一、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,成功解决

 

 

  • 微信
  • 交流学习,有偿服务
  • weinxin
  • 博客/Java交流群
  • 资源分享,问题解决,技术交流。群号:590480292
  • weinxin
avatar

发表评论

avatar 登录者:匿名
匿名评论,评论回复后会有邮件通知

  

已通过评论:0   待审核评论数:0