问题的提出
在做一个CMS( iSite) 的开发过程中发现,如果一个Web系统代码部署到了多个不同服务器,如何高效的把每次代码更新同步到各个服务器?是已经必须考虑解决的问题,特别当使用敏捷开发的策略时,代码的更新将会是高频次长期持续的。因此我们需要一个高效的把Web code同步到不同服务器的解决方案。
方案的总体考虑
做多点同步,一般也就两个方式:
一是用推送的方法,从个点向多个服务器逐一推送更新,实现同步。
二是用拉取的方法,每个服务器主动的定期从某个仓库拉取更新,实现同步。
用拉取的方法感觉上要麻烦些,特别是当SVN不想直接向外网开发的情况下;而推送的方法更加直观、简便一些,使用上似乎更灵活一些,更加适应于开发者友好。所以,选用推送方案。
解决思路
总体思路是:第一步,从SVN导出当前版本(head)的完整代码文件(Full Package),或者以某个指定版本为基础,导出该版本到当前版本的差异文件(Diff Package);第二步,使用Ftp、SFtp等工具,把上述的Full Package 或者 Diff Package 上传到指定一系列服务器,上传时根据时间戳判断,服务器上的文件是否为最新版本,并决定是否覆盖。
考虑更新的经常性,上述方案需要用脚本实现,以达到自动推送更新的目的。选择Python来实现基本功能,主要是:SVN导出和Ftp上传。在Windows下使用批处理(bat)方式来编写运行脚本。
方案
文件1:EmSvnExport.py
改了一个Svn操作的Python脚本。从SVN导出当前版本(head)的完整代码文件(Full Package),或者以某个指定版本为基础,导出该版本到当前版本的差异文件(Diff Package)。
文件2:EmSftpPush.py
通过Sftp,把本地的一个指定目录推送到远超服务器,并在推送过程中通过时间戳进行比较判断。一直没有找到符合要求的Python成熟实现,这个脚本是根据某个流传的版本进行大幅修改、完善、优化而来。
如果使用ftp或者其它传输协议,可以另行寻找其它库。
文件3:EmCodePush.bat
调用相关脚本,集成推送操作,实现代码同步。
@ECHO off echo Fetch files from svn... echo ---------------------------- ::Export diff files that was changed between revision 870 and current head revision to './em-Export' EmSvnExport --username user --password pass --rev_start 870 --path "em-Export" https://svn.app.local/svn-url ::[OR] Export All files of current head revision to './em-Export' EmSvnExport --username user --password pass --rev_start 870 --path "em-Export" https://svn.app.local/svn-url echo Export Done! echo =============================== echo Push local path (iSite-Export) to the remote location by sftp EmSftpPush "em-Export" "user:pass@www.server1.com:/remot-path" -p 2222 -d --processes 8 EmSftpPush "em-Export" "user:pass@www.server2.com:/remot-path" -p 2222 -d --processes 8 EmSftpPush "em-Export" "user:pass@www.server3.com:/remot-path" -p 2222 -d --processes 8 echo Push All Done! pause
最后提供上述3个文件的打包,如果使用这个包,你需要:
- 配置Python运行环境,确保Python脚本可以运行,我这个好像是2.7的版本
- 根据自身要求,编辑EmCodePush.bat文件,配置相关参数
- 如果使用的是Linux环境,需要自己参照EmCodePush.bat写个简单的脚本