簡易パブリケーションシステム実装プロセス

3164 ワード

1.以下は同じマシンで容易に行うが、実際の環境ではsshなどのツールで異なるホスト間のコード同期を実現できる
2.ファイルディレクトリ説明a.ソースホストホストソースアドレスb.ターゲットホストrsynアドレス(ソースrsyncのターゲットアドレス)c.ターゲットホストバックアップアドレス(主に前バージョンのソースコードを記録する)d.環境アドレスを生成する
3.主なツールrsync、php、git
4.主な手順(1)タスクロックを取得する、取得に失敗して終了する(2).ソースコードは最新コードを更新する(gitであればexce("cd src Dir;git pull 2>&1"))(3).rsyncにより、ソースコードを宛先ホストrsyncアドレス(4)にプッシュする.バックアップコードに準じてrsyncディレクトリのコードと比較し、差分セットを探し出して1つのファイルに記録する(5).rysncによりrsyncアドレスコードをプッシュするバックアップアドレス(6).バックアップコードを生成環境にプッシュする(ここでrsyncコマンドは存在しないファイルを削除しない.これは上のrsyncディレクトリとの違いであり、dステップの目的でもある).生成環境コードから、差分ファイル(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
"."ERROR"."\r
"; 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
"; 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 }

 
参考:傘の技術