简易发布系统实现过程

1.为方便以下在同一台机器完成,但在真实环境,可以通过ssh等工具实现不同主机之间的代码同步

2.文件目录说明
    a.源码宿主机源码地址
    b.目标主机rsyn地址(源码rsync的目标地址)
    c.目标主机备份地址(主要记录上一个版本的源码)
    d.生成环境地址

3.主要工具
 rsync、php、git

4.主要步骤
 (1).获取任务锁,获取失败退出
 (2).源码更新最新代码,(如果是git, 可以通过 exce("cd srcDir;git pull 2>&1") )
 (3).通过rsync,将源码推送至目标主机rsync地址
 (4).以备份代码为准,与rsync目录中的代码做比较,找出差集并记录在一个文件中
 (5).通过rysnc,将rsync地址代码推送的备份地址
 (6).将备份代码推送到生成环境(这里rsync命令不删除不存在的文件。这是与上面rsync目录的区别,也是d步骤的目的)
 (7).从生成环境代码中,删除差集文件
 (8).释放任务锁

5.其他说明
 (1).为什么直接从源代码rsync的生产环境代码?
    a.主要是保持生产代码的干净,完整。同时不受rsync错误影响。 
    b.通过rsync文件作为过渡,进行一些额外工作,而生成代码始终保持的是最终代码。
 (2).在 "备份代码推送到生成环境" 时,为什么不通过 --delete 删除文?
    a.生产环境中有些文件不是通过发布系统中发布的,而是直接再服务器中编辑生成,具有特殊作用。如果通过rsync --delete,会删除这些。
 (3).为什么引入备份?
     a.保存上一个版本,对于回退版本,可以直接通过这个备份rsync到生产环境
     b.用于与最新版本做对比

6.源码

//源代码库
$srcCode = "/data/master/";
//目标机器rsync目标地址
$destRsyncCode = "/data/dest/rsyncCode/";
//目标机器备份地址
$destStaticCode = "/data/dest/backup/";
//目标生产环境代码
$destProCode = "/data/dest/production/";

if(isLock()){
  echo "其他用户正在执行发布任务...";
  return false;
}
//获取任务锁
if(!lock()){
  echo "其他用户正在执行发布任务...";
  return false;
}

//宿主推送至目标机器
if(rsync($srcCode,$destRsyncCode)===false){
   return false;
}

//对比已删除掉的文件,需要在生产环境中,删除
if(diffSet($destStaticCode,$destRsyncCode)===false){
   return false;
}
//同步代码至备份文件夹
if(rsync($destRsyncCode,$destStaticCode) === false ){
   return false;
}
 
$shell = "rsync -avu  $destStaticCode $destProCode 2>&1";
if(execShell($shell)===false) {
  echo "\r\n"."ERROR"."\r\n";
  return false;
}

//判断needDelFile文件是否存在
$shell = "cat /tmp/needDelFile.txt 2>&1";
if(execShell($shell)===false) {
   return false;
}
//删除已不存在的文件
$shell = "cd $destProCode;cat /tmp/needDelFile.txt |xargs rm -rf 2>&1";
$ret = execShell($shell);

//释放任务锁
unlock();

function rsync($src,$dest) {
 
  $shell = "rsync -avu -P --exclude '.git' --delete $src $dest 2>&1";
  return execShell($shell);
}
//执行shell
function execShell($shell) {
  exec($shell,$output,$ret);
  if($ret != 0) {
    echo "error 1 \r\n";
    return false;
  }
  return $output ;

}
//对比文件
function diffSet($src,$dest){
   $pingShell = "ls $dest";
   $ret =  execShell($pingShell);
   
   if($ret) {
	$srcShell = "cd $src; find ./ | sort -u >/tmp/srcDir.txt 2>&1 ";
	if(execShell($srcShell)===false) return false;
       
        $destShell = "cd $dest; find ./ | sort -u >/tmp/destDir.txt 2>&1";
	if(execShell($destShell)===false) return false;

	$commShell = "comm -23 /tmp/srcDir.txt /tmp/destDir.txt > /tmp/needDelFile.txt 2>&1";
	
	return execShell($commShell);
      
   } else {
	return rsync($src,$dest);
   }
}

function isLock(){
  //return true/false
}
function lock(){
 //return true/false
}
function unlock(){
 //return true/false
}

 

   参考:小雨伞技术

你可能感兴趣的:(PHP,杂记)