===== 二.脚本示例 =====
---------------------------------------------脚本更新处用绿色标明----------------------------------------------
---------------------------------------------------------------------------------------------HWSL_Update.php
<?php
/**
* 差量更新工具
*
* @author zhanhailiang<zhanhailiang@huawei.com>
* @version 0.2
*/
class HWSL_Update {
//< 更新日志记录
const CST_UPDATE_LOGFILE = '/data/logs/update/log';
//< 需要更新的业务目录
const WEB_INSTALL = '/data/web/itravel';
//< 更新列表记录
protected static $_updateList = array();
public static function update($dest, $source) {
if(!self::isRoot()) {
echo "错误: 必须用root身份执行脚本.".PHP_EOL;
exit;
}
//在当前目录生成临时目录,保存更新文件列表与更新脚本
exec("rm -fR ./tmp");
exec("mkdir ./tmp");
self::sourceToDest($dest, $source);
self::sourceToDest2($dest, $source);
//生成更新脚本
$tmp = str_replace($dest, self::WEB_INSTALL, self::$_updateList);
$tmpcmd = join("\n", array("#!/bin/sh\n", join("\n", $tmp)));
exec("echo \"$tmpcmd\" > ./tmp/update");
}
protected static function sourceToDest($dest, $source) {
if(is_file($dest) && file_exists($source) && md5(file_get_contents($dest)) !== md5(file_get_contents($source))) {
array_push(self::$_updateList, "cp " . basename($source) . " $dest");
exec("cp $source ./tmp");
} else if(is_dir($dest)) {
$arr = scandir($dest);
foreach($arr as $path) {
if($path === '.' || $path === '..') {
continue;
}
$p = $dest . '/' . $path;
$q = $source . '/' . $path;
if(is_dir($p) && !is_dir($q)) {
//当$p路径在$source中不存在时,rm之
array_push(self::$_updateList, "rm -R $p");
} else if(is_file($p) && !file_exists($q)) {
//当$p路径在$source中不存在时,rm之
array_push(self::$_updateList, "rm $p");
} else {
self::sourceToDest($p, $q);
}
}
}
}
//将$source目录下不存在于$dest目录下的目录和文件复制一份到$dest下
protected static function sourceToDest2($dest, $source) {
if(is_file($source) && !file_exists($dest)) {
array_push(self::$_updateList, "cp " . basename($source) . " $dest");
exec("cp $source ./tmp");
} else if(is_dir($source)) {
$arr = scandir($source);
foreach($arr as $path) {
if($path === '.' || $path === '..')
continue;
$p = $dest . '/' . $path;
$q = $source . '/' . $path;
if(is_dir($q) && !is_dir($p)) {
array_push(self::$_updateList, "cp -R ./" . basename($q) . " $dest");
exec("cp -R $q ./tmp");
} else if(is_file($q) && !file_exists($p)) {
array_push(self::$_updateList, "cp " . basename($p) . " $dest");
exec("cp $q ./tmp");
} else {
self::sourceToDest2($p, $q);
}
}
}
}
protected static function isRoot() {
return exec('id -u') === '0';
}
}
------------------------------------------又见华丽的分割线-------------------------------------------update.sh
#!/usr/local/services/php/bin/php
<?php
/**
* 差量更新,持续集成工具
*
* @author zhanhailang<zhanhailiang@huawei.com>
* @version 0.2
*/
require_once './HWSL_Update.php';
if($argc != 3) { //< 检查参数数目合法性
echo "合法的参数为:./update.sh [source] [dest]".PHP_EOL;
exit;
} else if(!realpath($argv[1]) || !realpath($argv[2])) { //< 检查路径合法性
echo "路径输入不合法.请重新输入!".PHP_EOL;
exit;
} else {
$source = $argv[1]; //< 源路径
$dest = $argv[2]; //< 目标路径
//< 对于"../hwsl/"与"../hwsl"两种不同输入,统一处理为绝对路径
$source = realpath($source);
$dest = realpath($dest);
if($dest === $source) {
echo "源路径与目标路径一样.".PHP_EOL;
exit;
}
//执行更新任务
HWSl_Update::update($dest, $source);
}
打完收工!
附录:
阿晖的方案:
网站发布系统里制作差量的核心代码是下面这行:
diff -Pqr version/${version} version/${compare_version}|awk '{print $2;}'|sed 's/version\/${version}\///g'
diff + awk + sed的华丽组合
先生成一个diff.txt
然后从diff.txt里读取文件再tar打包
仅供参考
---------------------------------------------脚本更新处用绿色标明----------------------------------------------
---------------------------------------------------------------------------------------------HWSL_Update.php
<?php
/**
* 差量更新工具
*
* @author zhanhailiang<zhanhailiang@huawei.com>
* @version 0.2
*/
class HWSL_Update {
//< 更新日志记录
const CST_UPDATE_LOGFILE = '/data/logs/update/log';
//< 需要更新的业务目录
const WEB_INSTALL = '/data/web/itravel';
//< 更新列表记录
protected static $_updateList = array();
public static function update($dest, $source) {
if(!self::isRoot()) {
echo "错误: 必须用root身份执行脚本.".PHP_EOL;
exit;
}
//在当前目录生成临时目录,保存更新文件列表与更新脚本
exec("rm -fR ./tmp");
exec("mkdir ./tmp");
self::sourceToDest($dest, $source);
self::sourceToDest2($dest, $source);
//生成更新脚本
$tmp = str_replace($dest, self::WEB_INSTALL, self::$_updateList);
$tmpcmd = join("\n", array("#!/bin/sh\n", join("\n", $tmp)));
exec("echo \"$tmpcmd\" > ./tmp/update");
}
protected static function sourceToDest($dest, $source) {
if(is_file($dest) && file_exists($source) && md5(file_get_contents($dest)) !== md5(file_get_contents($source))) {
array_push(self::$_updateList, "cp " . basename($source) . " $dest");
exec("cp $source ./tmp");
} else if(is_dir($dest)) {
$arr = scandir($dest);
foreach($arr as $path) {
if($path === '.' || $path === '..') {
continue;
}
$p = $dest . '/' . $path;
$q = $source . '/' . $path;
if(is_dir($p) && !is_dir($q)) {
//当$p路径在$source中不存在时,rm之
array_push(self::$_updateList, "rm -R $p");
} else if(is_file($p) && !file_exists($q)) {
//当$p路径在$source中不存在时,rm之
array_push(self::$_updateList, "rm $p");
} else {
self::sourceToDest($p, $q);
}
}
}
}
//将$source目录下不存在于$dest目录下的目录和文件复制一份到$dest下
protected static function sourceToDest2($dest, $source) {
if(is_file($source) && !file_exists($dest)) {
array_push(self::$_updateList, "cp " . basename($source) . " $dest");
exec("cp $source ./tmp");
} else if(is_dir($source)) {
$arr = scandir($source);
foreach($arr as $path) {
if($path === '.' || $path === '..')
continue;
$p = $dest . '/' . $path;
$q = $source . '/' . $path;
if(is_dir($q) && !is_dir($p)) {
array_push(self::$_updateList, "cp -R ./" . basename($q) . " $dest");
exec("cp -R $q ./tmp");
} else if(is_file($q) && !file_exists($p)) {
array_push(self::$_updateList, "cp " . basename($p) . " $dest");
exec("cp $q ./tmp");
} else {
self::sourceToDest2($p, $q);
}
}
}
}
protected static function isRoot() {
return exec('id -u') === '0';
}
}
------------------------------------------又见华丽的分割线-------------------------------------------update.sh
#!/usr/local/services/php/bin/php
<?php
/**
* 差量更新,持续集成工具
*
* @author zhanhailang<zhanhailiang@huawei.com>
* @version 0.2
*/
require_once './HWSL_Update.php';
if($argc != 3) { //< 检查参数数目合法性
echo "合法的参数为:./update.sh [source] [dest]".PHP_EOL;
exit;
} else if(!realpath($argv[1]) || !realpath($argv[2])) { //< 检查路径合法性
echo "路径输入不合法.请重新输入!".PHP_EOL;
exit;
} else {
$source = $argv[1]; //< 源路径
$dest = $argv[2]; //< 目标路径
//< 对于"../hwsl/"与"../hwsl"两种不同输入,统一处理为绝对路径
$source = realpath($source);
$dest = realpath($dest);
if($dest === $source) {
echo "源路径与目标路径一样.".PHP_EOL;
exit;
}
//执行更新任务
HWSl_Update::update($dest, $source);
}
打完收工!
附录:
阿晖的方案:
网站发布系统里制作差量的核心代码是下面这行:
diff -Pqr version/${version} version/${compare_version}|awk '{print $2;}'|sed 's/version\/${version}\///g'
diff + awk + sed的华丽组合
先生成一个diff.txt
然后从diff.txt里读取文件再tar打包
仅供参考