碰到一个需求,主要是2个项目需要用到同一份代码,主要是域名和配置信息不一样,而且要把svn更新的代码同步过去。本来考虑提交时用钩子同步过去,但考虑到同步过去的代码还需要测试,而且另一边代码的时效性不强,所以主要用定时脚本来处理。
#比较2个版本号大小 function version_compare() { v1=`echo $1 | cut -d "-" -f 2` v2=`echo $2 | cut -d "-" -f 2` #字符串处理,版本号例如1.1.2,1.1.1 num1=(${v1//./ }) num2=(${v2//./ }) if [ "${num1[0]}" -gt "${num2[0]}" ];then echo $1 elif [ "${num1[0]}" -lt "${num2[0]}" ];then echo $2 else if [ "${num1[1]}" -gt "${num2[1]}" ];then echo $1 elif [ "${num1[1]}" -lt "${num2[1]}" ];then echo $2 else if [ "${num1[2]}" -ge "${num2[2]}" ];then echo $1 elif [ "${num1[2]}" -lt "${num2[2]}" ];then echo $2 fi fi fi } echo "开始时间: "$(date +%Y-%m-%d %H:%M:%S) project="***项目名称***" url="***svn根路径***" url_pro=${url}${project} export_path="***svn导出根路径***"${project} #用来保存本地版本号 version_path="***vetsion.txt" log_path="***本地同步日志根路径"$(date +%Y-%m-%d)".log" #数组循环,tag最新版本号 c=0 for file in `svn ls ${url_pro}/tags` do filelist[c]="$file" ((c++)) done max=${filelist[0]} for(( i=0;i<${#filelist[@]}-1;i++)) do max=$(version_compare $max ${filelist[i+1]}) done max=${max%/*} #本地最新版本号,判断是否需要导入 if [ ! -f "$version_path" ];then touch "$version_path" fi is_export=0 current=`cat ${version_path} |grep ${project}: |awk '{print $2}'` if [ "$current" = "" ];then echo $project": "$max >> $version_path is_export=1 else if [ "$max" != "$current" ];then #更新本地最大版本号 sed -i "s/${current}/${max}/g" ${version_path} is_export=1 fi fi #is_export=1 echo "是否更新导出:"$is_export #更新导出begin if [ $is_export = 1 ];then url_export="${url_pro}/tags/${max}" svn export ${url_export} ${export_path} --force echo "更新导出完成时间: "$(date +%Y-%m-%d %H:%M:%S) chown www:www -R ${export_path} #删除支付配置文件 rm -rf ${export_path}"/app/Libraries/Pay/PayPort" #配置文件,域名替换 str1="***旧域名***" str_rep="***新域名***" sed -i "s/${str1}/${str_rep}/g" "${export_path}/config/" echo "replace finish" #更新写日志 if [ ! -f "$log_path" ];then touch "$log_path" fi echo $(date +%Y-%m-%d %H:%M:%S): $project" export">>$log_path fi #更新导出end exit