问题的提出

在做一个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个文件的打包,如果使用这个包,你需要:

  1. 配置Python运行环境,确保Python脚本可以运行,我这个好像是2.7的版本
  2. 根据自身要求,编辑EmCodePush.bat文件,配置相关参数 
  3. 如果使用的是Linux环境,需要自己参照EmCodePush.bat写个简单的脚本

 下载: EmCodePush 20180721.zip

 

(44)


发表评论

电子邮件地址不会被公开。