Git + ZeroMQ 实现代码多端实时更新

技术文档 - Git 作者: xcheng1986 发布于:2016-07-07 阅读(1386) (暂无评论)  

在团队协作开发时,一般每位成员都会通过Git或SVN迁移一个版本出来开发,开发完毕后再提交版本到代码仓库。
这种方式有许多有点,这其中不在叙述。但是又有缺点:A更新了代码,而B不能及时的知晓。
如果A和B又同时修改了同一个文件,那么久会在下一次提交代码时发生冲突,且又重复劳动。
所以,就以上问题个人采用了ZeroMQ实现了多端代码实时更新。
具体思路是:
1.使用Git自带的"钩子"程序,在每次有新代码提交的时候实时更新各个客户端。

2.采用ZMQ的消息发布订阅模型,在每次有新代码提交时,由服务端上的ZMQ发布一个代码更新的消息,实时通知在线的各个客户端.
客户端收到通知后就立马去更新本地的代码(git pull origin master; 或 svn update;)

实现:

1.添加git的钩子程序
在代码仓库中编写 hooks/post-receive 文件
#!/bin/bash
php /www/git_rsync/publisher_app_api.php &

2.编写ZQM消息发布程序
/www/git_rsync/publisher_app_api.php :
<?php
$context = new ZMQContext ();
$publisher = $context->getSocket (ZMQ::SOCKET_PUB);
$publisher->bind ("tcp://*:5556");
sleep(1);
$msg = array('info'=>'新的消息收到','status'=>200,'data'=>date('Y-m-d H:i:s'));
$publisher->send (json_encode($msg));


3.编写客户端ZQM消息接收程序
/data/app_api_subscriber.php :
<?php

$context = new ZMQContext ();
$subscriber = new ZMQSocket ($context, ZMQ::SOCKET_SUB);
$subscriber->connect ("tcp://192.168.1.101:5556");
$subscriber->setSockOpt (ZMQ::SOCKOPT_SUBSCRIBE, $filter='');

while(1){
	$str = $subscriber->recv ();
	if($str){
		//$data = json_decode($str,true);
		//print_r($data);
		exec('cd /www/app_api;git pull origin master');
		//echo "\r\n";
	}
}


4.启动客户端ZQM消息接收程序
php /data/app_api_subscriber.php > /dev/null 2>&1 & ;

5.Windows版本。
以上是实现Linux端的多端代码同步。实际运用中,一般都在Windows来开发,所有需要安装Windows端的程序。

5.1 因为我是写PHP脚本的,所以只能用PHP+ZMQ来实现(其实其它许多语言都可以来实现的):
Now,下载php5.5.37 VC11 x64 Thread Safe(http://windows.php.net/download/):
地址:[http://windows.php.net/downloads/releases/php-5.5.37-Win32-VC11-x64.zip],解压开并重命名并移动目录(C:/php/).
注意php5.5.37的zmq扩展好使,其他不能保证。

5.2 下载php扩展ZMQ:
地址:[http://windows.php.net/downloads/pecl/releases/zmq/1.1.1/php_zmq-1.1.1-5.5-ts-vc11-x64.zip].
解压开来。把其中的libzmq.dll文件放到C:\Windows\System32目录中,再把php_zmq.dll放到上一步的php扩展目录中去(移动到C:\php\ext目录中)

5.3
为php加php.ini及zmq扩展:
进入php软件目录(C:/php/),复制php.ini-development 文件为php.ini 。再用编辑器打开文件添加扩展 extension=php_zmq.dll (大约第900行位置)。

5.4
测试php的zmq扩展是否安装正确。
打开windows的CMD命令行(键盘的 徽标键+R ,输入cmd).运行 c:/php/php.exe -m 如果安装正确可以看到zmq的扩展。

5.5
编写客户端ZQM消息接收程序C:\Apache\htdocs\app_api_subscriber.php :
<?php

set_time_limit(0);
$context = new ZMQContext ();
$subscriber = new ZMQSocket ($context, ZMQ::SOCKET_SUB);
$subscriber->connect ("tcp://192.168.1.101:5556");
$filter = '';
$subscriber->setSockOpt (ZMQ::SOCKOPT_SUBSCRIBE, $filter);

while(1){
	$str = $subscriber->recv ();
	if($str){
		$handle = popen('C:/Apache/htdocs/t.bat','r');
		$read = fread($handle, 2096);
		pclose($handle);
		echo $read;
		
		echo "\r\n";
	}
}

5.6 编写git更新的批处理文件C:/Apache/htdocs/t.bat :
@echo off
set path=%path%;C:\Program Files\Git\bin
cd C:/www/app_api 
CALL git pull origin master
注:C:/www/app_api目录是我的项目,是从Git服务器上Clone出来的。

5.7 启动客户端ZQM消息接收程序
运行Windows的CMD命令行工具,运行脚本
c:/php/php C:\Apache\htdocs\app_api_subscriber.php
不要关闭。现在还没法让它在后台一直运行。只能最小化了。^_^。

6.程序就此安装完毕,测试即可。
在任一一个端上做代码编辑并提交就可以来查看其它端上该文件是否已经变更了。
例如在linux上的该项目中心添加文件并提交
cd /www/app_api;touch test.txt && git add test.txt && git commit -m "test" && git push origin master 
再来查看Windows的机器上就会发现在C:/www/app_api目录中已经增加了test.txt文件。
大功告成。