项目的版本控制切换到git后,相对于cvs来说,部署java程序有了一些问题
主要是因为:
1.cvs权限控制比较简单,只需要开个username,即可在服务器上update
   但是,我们用gitosis来管理权限,就需要把各服务器的公钥给传到gitosis上
2.cvs可以支持部分update,比如我们可以指定只update某个jsp
   但git是不可以的,pull下的就是最新的所有的代码,所以在pull之前一定要把更新内容给显示出来,便于确认

这样,我们需要写脚本,来完成从服务器上集中部署
大概有以下2种方案:
1.每个server上安装git,分配其只读的权限,从中央服务器上ssh到要部署的server上,并获取本次更新的文件,核心代码如下
  

ori_commit_id=`ssh root@$host "cd $module_path;git log -1 --format="%h""`
ssh root@$host "cd $module_path;git reset --hard;git fetch origin"
new_commit_id=`ssh root@$host "cd $module_path;git log -1 --format=\"%h\" origin/master"`
ssh root@$host "cd $module_path;git log --name-status --pretty=format:\"%ci %Cgreen%aN%Creset %s\" $ori_commit_id..$new_commit_id"


   这种部署方式,相对比较可靠,因为它直接ssh到server上,把该server本次更新的文件给列表了出来,确认后即可部署
2.在中央服务器上使用rsync来同步远程server的目录
  之所以用rsync是因为:scp和tar方式都无法来根据文件修改时间来确定要拷贝的文件,只能是全部覆盖或者每次修改部署脚本
  如果采用tar后再scp,那么所有文件都会被更新了,这样ant会把所有的src都重新编译一次,很麻烦的
  rsync的命令很简单,如下:
  

rsync -e ssh -tpogrv /opt/test/ --exclude=.git $host://usr/local/src/test


  注意需要后面的-t参数,它表明把文件的时间也给rsync到远程server上。
  -exclude表明是排除.git目录,主要是相对路径
  这种部署方式,相对比较简单,不需要为每个服务器开git权限
  但由于比较的版本是中央服务器的目录,所以必须保证远程服务器的版本和中央服务器的版本相同,否则可能会有问题的