簡易パブリケーションシステム実装プロセス
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.ソース
参考:傘の技術
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
}
参考:傘の技術