├── README.md ├── autoDeploy.sh └── svnExport.sh /README.md: -------------------------------------------------------------------------------- 1 | AutoDeploy-Shell 2 | ================ 3 | 4 | 自动部署PHP项目的Shell脚本,可用于Jenkins持续集成。 5 | 6 | ScriptName:svnExport.sh 7 | 8 | Todo:自动从SVN配置库导出需要部署的文件,同时打升级包和还原包,可配置自动替换配置文件,自动压缩js文件。 9 | 10 | ScriptName:autoDeploy.sh 11 | 12 | Todo:服务器端执行,自动部署项目代码。 -------------------------------------------------------------------------------- /autoDeploy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | ################################################ 3 | # Todo:自动部署项目代码。 4 | # Author:归根落叶 5 | # Blog:http://www.ispenn.com 6 | ################################################ 7 | 8 | #Function: printLog() 9 | #Author: 归根落叶 10 | #Todo: 打印日志 11 | #Param: logInfo(日志信息) 12 | logPath="`pwd`/logs" 13 | function printLog(){ 14 | local errorCode=$? 15 | local logInfo=$1 16 | if [ ! -d ${logPath} ];then 17 | mkdir -p ${logPath} 18 | fi 19 | if [ $# -ne 1 ];then 20 | echo `date +"%Y-%m-%d %H:%M:%S"` "[ERROR] Usage:printLog logInfo" | tee --append ${logPath}/svnRuntimeLog-`date +"%Y-%m-%d"`.txt 21 | exit 1 22 | fi 23 | if [ ${errorCode} -ne 0 ];then 24 | echo `date +"%Y-%m-%d %H:%M:%S"` "[ERROR] ${logInfo}" | tee --append ${logPath}/svnRuntimeLog-`date +"%Y-%m-%d"`.txt 25 | return 1 26 | else 27 | echo `date +"%Y-%m-%d %H:%M:%S"` "${logInfo}" >> ${logPath}/svnRuntimeLog-`date +"%Y-%m-%d"`.txt 28 | fi 29 | } 30 | 31 | #Function: backup() 32 | #Author: 归根落叶 33 | #Todo: 备份部署包 34 | #Param: fileName(备份文件名),backupPath(备份路径) 35 | function backup(){ 36 | if [ $# -ne 2 ];then 37 | echo "[ERROR] Usage:backup fileName backupPath" 38 | printLog "[ERROR] Usage:backup fileName backupPath" 39 | exit 1 40 | fi 41 | local fileName=$1 42 | local backupPath=$2 43 | local bakDate=`date +'%Y%m%d'` 44 | local bakTime=`date +'%H%M'` 45 | local delTime=`date -d -7day +'%Y%m%d'` 46 | echo "备份文件[${fileName}]至[${backupPath}/${bakDate}/${bakTime}-${fileName}]" 47 | if [ -d ${backupPath}/${bakDate} ];then 48 | mv ${fileName} ${backupPath}/${bakDate}/${bakTime}-${fileName} 49 | printLog "备份文件[${fileName}]至[${backupPath}/${bakDate}/${bakTime}-${fileName}]" 50 | else 51 | mkdir -p ${backupPath}/${bakDate} 52 | mv ${fileName} ${backupPath}/${bakDate}/${bakTime}-${fileName} 53 | printLog "备份文件[${fileName}]至[${backupPath}/${bakDate}/${bakTime}-${fileName}]" 54 | fi 55 | echo "删除7天前的备份文件[${backupPath}/${delTime}]" 56 | rm -rf ${backupPath}/${delTime} 57 | printLog "删除7天前的备份文件[${backupPath}/${delTime}]" 58 | } 59 | 60 | #Function: deploy() 61 | #Author: 归根落叶 62 | #Todo: 部署项目 63 | #Param: packageFile(.tar.gz部署包名),delFile(删除文件列表),projectPath(项目路径) 64 | function deploy(){ 65 | if [ $# -ne 3 ];then 66 | echo "[ERROR] Usage:deploy packageFile delFile projectPath" 67 | printLog "[ERROR] Usage:deploy packageFile delFile projectPath" 68 | exit 1 69 | fi 70 | local packageFile=$1 71 | local delFile=$2 72 | local projectPath=$3 73 | if [ -f ${packageFile}.tar.gz ];then 74 | tar zxvf ${packageFile}.tar.gz 75 | if [ -f ${delFile} ];then 76 | cat ${delFile} | 77 | while read row; do 78 | if [ "${row}" == "noneLine" ];then 79 | exit 80 | elif [ "${row}" != "" ];then 81 | rm -rfv ${projectPath}/${row} 82 | printLog "删除 ${projectPath}/${row}" 83 | fi 84 | done 85 | fi 86 | echo "部署升级包[${packageFile}_*/]至[${projectPath}]" 87 | chown -R www.www ${packageFile}_*/ 88 | printLog "更改[${packageFile}_*/]权限为www.www" 89 | \cp -rfv ${packageFile}_*/* ${projectPath} 90 | printLog "部署升级包[${packageFile}_*/]至[${projectPath}]" 91 | rm -rf ${packageFile}_* 92 | printLog "删除升级包[${packageFile}_*]" 93 | else 94 | printLog "升级包[${packageFile}.tar.gz]不存在!" && exit 1 95 | fi 96 | } 97 | 98 | #Function: updateSql() 99 | #Author: 归根落叶 100 | #Todo: 更新数据库 101 | #Param: host(数据库主机地址),username(数据库用户名),password(数据库密码),dbname(数据库名),sqlFile(数据库sql文件) 102 | function updateSql(){ 103 | if [ $# -ne 5 ];then 104 | echo "[ERROR] Usage:updateSql host username password dbname sqlFile" 105 | printLog "[ERROR] Usage:updateSql host username password dbname sqlFile" 106 | exit 1 107 | fi 108 | local host=$1 109 | local username=$2 110 | local password=$3 111 | local dbname=$4 112 | local sqlFile=$5 113 | if [ -f ${sqlFile} ];then 114 | local row=`cat ${sqlFile}` 115 | if [ "${row}" != "noneLine" ];then 116 | mysql -u"${username}" -p"${password}" -h"${host}" --default-character-set=utf8 ${dbname} < ${sqlFile} 117 | printLog "自动更新数据库[${host}:${dbname}]" 118 | fi 119 | fi 120 | } 121 | 122 | 123 | #数据库主机地址 124 | host="127.0.0.1" 125 | #数据库用户名 126 | username="username" 127 | #数据库密码 128 | password="password" 129 | #数据库名 130 | dbname="testdb" 131 | #数据库sql文件 132 | sqlFile="auto.sql" 133 | #环境(test|pre|PRO) 134 | env="test" 135 | #服务器部署绝对路径 136 | envURL="/website/html" 137 | 138 | cd /home/www/ #根据升级包上传到服务器的目录而定 139 | deploy "upgrade${env}" "delList${env}Up.txt" "${envURL}" 140 | updateSql "${host}" "${username}" "${password}" "${dbname}" "${sqlFile}" #更新数据库,不需要可删除 141 | ##################### 备份开始 非正式环境不需要可删除 ##################### 142 | backup "upgrade${env}.tar.gz" "/home/www/backup" 143 | backup "delList${env}Up.txt" "/home/www/backup" 144 | backup "downgrade${env}.tar.gz" "/home/www/backup" 145 | backup "delList${env}Down.txt" "/home/www/backup" 146 | ##################### 备份结束 非正式环境不需要可删除 ##################### -------------------------------------------------------------------------------- /svnExport.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | ################################################ 3 | # Todo:自动从SVN配置库获取代码,导出差异文件。 4 | # Author:归根落叶 5 | # Blog:http://www.ispenn.com 6 | ################################################ 7 | 8 | #Function: printLog() 9 | #Author: 归根落叶 10 | #Todo: 打印日志 11 | #Param: logInfo(日志信息) 12 | logPath="`pwd`/logs" #日志存放路径 13 | function printLog(){ 14 | local errorCode=$? 15 | local logInfo=$1 16 | if [ ! -d ${logPath} ];then 17 | mkdir -p ${logPath} 18 | fi 19 | if [ $# -ne 1 ];then 20 | echo `date +"%Y-%m-%d %H:%M:%S"` "[ERROR] Usage:printLog logInfo" | tee --append ${logPath}/svnRuntimeLog-`date +"%Y-%m-%d"`.txt 21 | exit 1 22 | fi 23 | if [ ${errorCode} -ne 0 ];then 24 | echo `date +"%Y-%m-%d %H:%M:%S"` "[ERROR] ${logInfo}" | tee --append ${logPath}/svnRuntimeLog-`date +"%Y-%m-%d"`.txt 25 | return 1 26 | else 27 | echo `date +"%Y-%m-%d %H:%M:%S"` "${logInfo}" >> ${logPath}/svnRuntimeLog-`date +"%Y-%m-%d"`.txt 28 | fi 29 | } 30 | 31 | #Function: svnDo() 32 | #Author: 归根落叶 33 | #Todo: 操作SVN 34 | #Param: userName(用户名) 35 | # passWord(密码) 36 | # operation[co(签出)|up(更新)|add(新增)|ci(提交)|export(导出)|copy(打分支|标签)|diff(对比两个版本)|info(获取信息)|log(打印日志)|gr(获取版本号)] 37 | # svnPath(路径1) 38 | # [ tagsPath(路径2)|localPath(路径3) 39 | # revision(版本) 40 | # logFile(日志文件) 41 | # getRevisionNum(获取倒数第几次更新的版本号) ] 42 | function svnDo(){ 43 | local userName=$1 44 | local passWord=$2 45 | local op=$3 46 | case ${op} in 47 | "co") 48 | if [ $# -ne 6 ];then 49 | echo "[ERROR] Usage:svnDo userName passWord co svnPath localPath revision" 50 | printLog "[ERROR] Usage:svnDo userName passWord co svnPath localPath revision" 51 | exit 1 52 | fi 53 | local svnPath=$4 54 | local localPath=$5 55 | local revision=$6 56 | echo "检出SVN[${svnPath}]" 57 | svn co --force --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}" "${localPath}" --revision ${revision} 58 | printLog "检出SVN[${svnPath}]" || local errorCode=$? 59 | return ${errorCode};; 60 | "up") 61 | if [ $# -ne 5 ];then 62 | echo "[ERROR] Usage:svnDo userName passWord up localPath revision" 63 | printLog "[ERROR] Usage:svnDo userName passWord up localPath revision" 64 | exit 1 65 | fi 66 | local localPath=$4 67 | local revision=$5 68 | echo "更新SVN[${localPath}]" 69 | svn up --force --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${localPath}" --revision ${revision} 70 | printLog "更新SVN[${localPath}]" || local errorCode=$? 71 | return ${errorCode};; 72 | "add") 73 | if [ $# -ne 4 ];then 74 | echo "[ERROR] Usage:svnDo userName passWord add localPath" 75 | printLog "[ERROR] Usage:svnDo userName passWord add localPath" 76 | exit 1 77 | fi 78 | local localPath=$4 79 | echo "SVN新增文件[${localPath}]" 80 | svn add --force --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${localPath}" 81 | printLog "SVN新增文件[${localPath}]" || local errorCode=$? 82 | return ${errorCode};; 83 | "ci") 84 | if [ $# -ne 5 ];then 85 | echo "[ERROR] Usage:svnDo userName passWord ci localPath logFile" 86 | printLog "[ERROR] Usage:svnDo userName passWord ci localPath logFile" 87 | exit 1 88 | fi 89 | local localPath=$4 90 | local logFile=$5 91 | echo "提交到SVN[${localPath}]" 92 | svn ci --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${localPath}" --file "${logFile}" 93 | printLog "提交到SVN[${localPath}]" || local errorCode=$? 94 | return ${errorCode};; 95 | "export") 96 | if [ $# -ne 6 ];then 97 | echo "[ERROR] Usage:svnDo userName passWord export svnPath localPath revision" 98 | printLog "[ERROR] Usage:svnDo userName passWord export svnPath localPath revision" 99 | exit 1 100 | fi 101 | local svnPath=$4 102 | local localPath=$5 103 | local revision=$6 104 | if [ -f upList.txt ];then 105 | cat upList.txt | 106 | while read filePath; do 107 | local exPath=${filePath%/*}/ 108 | if [[ (-d "${localPath}/${exPath}") && (! -d "${localPath}/${filePath}") ]];then 109 | svn export --force --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}/${filePath}@" "${localPath}/${filePath}" --revision ${revision} 110 | printLog "SVN导出文件[${svnPath}/${filePath}@${revision}]" || local errorCode=$? 111 | elif [ ! -d "${localPath}/${filePath}" ];then 112 | mkdir -p "${localPath}/${exPath}" 113 | printLog "创建目录[${localPath}/${exPath}]" 114 | svn export --force --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}/${filePath}@" "${localPath}/${filePath}" --revision ${revision} 115 | printLog "SVN导出文件[${svnPath}/${filePath}@${revision}]" || local errorCode=$? 116 | fi 117 | done 118 | rm -f upList.txt 119 | else 120 | printLog "没有文件需要更新,如果只是删除文件,下次更新会一起删除。" || local errorCode=$? 121 | fi 122 | return ${errorCode};; 123 | "copy") 124 | if [ $# -ne 7 ];then 125 | echo "[ERROR] Usage:svnDo userName passWord copy svnPath tagsPath revision logFile" 126 | printLog "[ERROR] Usage:svnDo userName passWord copy svnPath tagsPath revision logFile" 127 | exit 1 128 | fi 129 | local svnPath=$4 130 | local tagsPath=$5 131 | local revision=$6 132 | local logFile=$7 133 | echo "SVN打分支/标签[${tagsPath}]" 134 | svn copy --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}" "${tagsPath}" --revision ${revision} --file ${logFile} 135 | printLog "SVN打分支/标签[${tagsPath}]" || local errorCode=$? 136 | return ${errorCode};; 137 | "diff") 138 | if [ $# -ne 5 ];then 139 | echo "[ERROR] Usage:svnDo userName passWord diff svnPath revision" 140 | printLog "[ERROR] Usage:svnDo userName passWord diff svnPath revision" 141 | exit 1 142 | fi 143 | local svnPath=$4 144 | local revision=$5 145 | echo "SVN对比两个版本差异[${svnPath}@${revision}]" 146 | svn diff --force --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}" --revision ${revision} --summarize > diff.txt 147 | printLog "SVN对比两个版本差异[${svnPath}@${revision}]" || local errorCode=$? 148 | rm -f delList.txt 149 | rm -f upList.txt 150 | cat diff.txt | 151 | while read row; do 152 | local op=`echo ${row} | awk '{print $1}'` 153 | if [ ${op} == "D" ];then 154 | echo ${row} | awk '{$1="";print $0}' | awk -F "${svnPath}" '{print $2}' >> delList.txt 155 | else 156 | echo ${row} | awk '{$1="";print $0}' | awk -F "${svnPath}" '{print $2}' >> upList.txt 157 | fi 158 | done 159 | echo "noneLine" >> delList.txt 160 | rm -f diff.txt 161 | return ${errorCode};; 162 | "info") 163 | if [ $# -ne 5 ];then 164 | echo "[ERROR] Usage:svnDo userName passWord info svnPath revision" 165 | printLog "[ERROR] Usage:svnDo userName passWord info svnPath revision" 166 | exit 1 167 | fi 168 | local tagsPath=$4 169 | local revision=$5 170 | echo "SVN获取[${tagsPath}]的信息" 171 | svn info --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${tagsPath}" --revision ${revision} 172 | printLog "SVN获取[${tagsPath}]的信息" || local errorCode=$? 173 | return ${errorCode};; 174 | "log") 175 | if [ $# -ne 5 ];then 176 | echo "[ERROR] Usage:svnDo userName passWord log svnPath revision" 177 | printLog "[ERROR] Usage:svnDo userName passWord log svnPath revision" 178 | exit 1 179 | fi 180 | local svnPath=$4 181 | local revision=$5 182 | svn log --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}" --revision ${revision} 183 | printLog "SVN获取[${tagsPath}]的日志" || local errorCode=$? 184 | return ${errorCode};; 185 | "gr") 186 | if [ $# -ne 5 ];then 187 | echo "[ERROR] Usage:svnDo userName passWord gr svnPath getRevisionNum" 188 | printLog "[ERROR] Usage:svnDo userName passWord gr svnPath getRevisionNum" 189 | exit 1 190 | fi 191 | local svnPath=$4 192 | local getRevisionNum=$5 193 | svn log --non-interactive --trust-server-cert --username ${userName} --password ${passWord} "${svnPath}" | grep "^r[0-9]" | awk "NR==${getRevisionNum}" | sed -n -r "s/r([0-9]*).*/\1/p" 194 | printLog "SVN获取[${svnPath}]的版本号" || local errorCode=$? 195 | return ${errorCode};; 196 | *) 197 | echo "[ERROR] Usage:svnDo userName passWord operation" 198 | printLog "[ERROR] Usage:svnDo userName passWord operation" 199 | exit 1 200 | esac 201 | } 202 | 203 | #Function: editConf() 204 | #Author: 归根落叶 205 | #Todo: 修改配置文件 206 | #Param: filePath(导出文件路径) 207 | function editConf(){ 208 | if [ $# -ne 1 ];then 209 | echo "[ERROR] Usage:editConf filePath" 210 | printLog "[ERROR] Usage:editConf filePath" 211 | exit 1 212 | fi 213 | local filePath=$1 214 | local file1="application/config/nosql.php" 215 | if [ -f ${filePath}/${file1} ];then 216 | echo "修改配置文件[${filePath}/${file1}]" 217 | sed -r -i "8,15s/mongodb:\/\/.*',/mongodb:\/\/127.0.0.1:27017',/" ${filePath}/${file1} 218 | sed -r -i "8,15s/'database'.*,/'database' => 'testdb',/" ${filePath}/${file1} 219 | printLog "修改配置文件[${filePath}/${file1}]" 220 | fi 221 | } 222 | 223 | #Function: jsGrunt() 224 | #Author: 归根落叶 225 | #Todo: Grunt自动压缩js、css、图片 226 | #Param: filePath(源文件路径),localPath(SVN本地工作目录) 227 | function jsGrunt(){ 228 | if [ $# -ne 2 ];then 229 | echo "[ERROR] Usage:jsGrunt filePath localPath" 230 | printLog "[ERROR] Usage:jsGrunt filePath localPath" 231 | exit 1 232 | fi 233 | local filePath=$1 234 | local localPath=$2 235 | local ver=`date +"%Y%m%d%H%M%S"` 236 | local workDir=`pwd` 237 | local modulesPath="/usr/local/lib/node_modules/LiveApp" 238 | if [[ (-d ${filePath}) && (`ls ${filePath} | wc -l` -gt 0) ]];then 239 | ls ${filePath} > tempdir.txt 240 | cat tempdir.txt | 241 | while read tdir;do 242 | local jsnum=`find ${filePath}/${tdir} -name '*.js' | wc -l` 243 | local cssnum=`find ${filePath}/${tdir} -name '*.css' | wc -l` 244 | if [[ ${jsnum} -gt 0 || ${cssnum} -gt 0 ]];then 245 | if [[ (-f ${localPath}/${tdir}/package.json) && (-f ${localPath}/${tdir}/Gruntfile.js) ]];then 246 | rm -f ${localPath}/${tdir}/node_modules 247 | ln -s ${modulesPath} ${localPath}/${tdir}/node_modules 248 | cd ${localPath}/${tdir} 249 | echo "Grunt压缩模板${tdir}的js、css和图片" 250 | grunt 251 | printLog "Grunt压缩模板${tdir}的js、css和图片" 252 | if [ -d ./assets ];then 253 | if [ -f ./app/tpl.php ];then 254 | sed -r -i "s/init.min.js\?ver=[0-9\.]*\"/init.min.js\?ver=${ver}\"/g" ./app/tpl.php 255 | sed -r -i "s/app.min.css\?ver=[0-9\.]*\"/app.min.css\?ver=${ver}\"/g" ./app/tpl.php 256 | cp -rf ./app/ ${workDir}/${filePath}/${tdir}/app/ 257 | printLog "自动更新版本号[./app/tpl.php]" 258 | fi 259 | cp -rf ./assets ${workDir}/${filePath}/${tdir}/ 260 | if [ -f ./assets/scripts/init.min.js ];then 261 | sed -r -i "18,20s/\/\/.*preload/preload/" ./assets/scripts/init.min.js 262 | sed -r -i "18,20s/[^\/\/]base/\/\/base/" ./assets/scripts/init.min.js 263 | cp -f ./assets/scripts/init.min.js ${workDir}/${filePath}/${tdir}/assets/scripts/init.min.js 264 | printLog "自动切换到正式环境[./assets/scripts/init.min.js]" 265 | fi 266 | else 267 | if [ -f ./tpl.php ];then 268 | sed -r -i "s/init.min.js\?ver=[0-9\.]*\"/init.min.js\?ver=${ver}\"/g" ./tpl.php 269 | sed -r -i "s/app.min.css\?ver=[0-9\.]*\"/app.min.css\?ver=${ver}\"/g" ./tpl.php 270 | cp -f ./tpl.php ${workDir}/${filePath}/${tdir}/tpl.php 271 | printLog "自动更新版本号[./tpl.php]" 272 | fi 273 | cp -rf ./dist ${workDir}/${filePath}/${tdir}/ 274 | if [ -f ./dist/scripts/init.min.js ];then 275 | sed -r -i "18,20s/\/\/.*preload/preload/" ./dist/scripts/init.min.js 276 | sed -r -i "18,20s/[^\/\/]base/\/\/base/" ./dist/scripts/init.min.js 277 | cp -f ./dist/scripts/init.min.js ${workDir}/${filePath}/${tdir}/dist/scripts/init.min.js 278 | printLog "自动切换到正式环境[./dist/scripts/init.min.js]" 279 | fi 280 | fi 281 | rm -f ./node_modules 282 | ##################### 提交压缩文件到SVN开始 非正式环境不需要可删除 ##################### 283 | svnDo ${userName} ${passWord} add "`pwd`" 284 | echo "[Auto]模板${tdir} 压缩js、css和图片" > svnLog.txt 285 | svnDo ${userName} ${passWord} ci "`pwd`" svnLog.txt 286 | rm -f svnLog.txt 287 | ##################### 提交压缩文件到SVN结束 非正式环境不需要可删除 ##################### 288 | cd ${workDir} 289 | fi 290 | fi 291 | done 292 | rm -f tempdir.txt 293 | rm -rfv `find ${filePath}/ -name '.svn' -type d` 294 | fi 295 | } 296 | 297 | #SVN配置库代码路径 298 | svnPath="https://hostname/svn/project/trunk" 299 | #Tag路径 300 | tagsPath="https://hostname/svn/project/tags/release" 301 | #svn用户名 302 | userName="userName" 303 | #svn密码 304 | passWord="passWord" 305 | #环境(test|pre|PRO) 306 | env="test" 307 | 308 | oldVersion=`svnDo ${userName} ${passWord} gr ${svnPath} 2` 309 | printLog "获取上一次更新的版本号" 310 | newVersion=`svnDo ${userName} ${passWord} gr ${svnPath} 1` 311 | printLog "获取最新的版本号" 312 | newTagsVersion=`svnDo ${userName} ${passWord} gr ${tagsPath} 1` #获取tag版本号,如果不需要打标签,需要删除 313 | if [[ (${oldVersion} -gt 0) && (${newVersion} -gt 0) ]];then #判断是否是数字 314 | if [ -f tagsVersion ];then 315 | oldVersion=`cat tagsVersion` && [[ ${oldVersion} -gt 0 ]] || printLog "获取上次更新的版本号出错" 316 | fi 317 | if [[ ${oldVersion} -eq ${newVersion} ]];then 318 | echo "没有新版本更新,目前新版本号为[${newVersion}]" 319 | printLog "没有新版本更新,目前新版本号为[${newVersion}]" && exit 1 320 | fi 321 | updir="ali_upgrade/${oldVersion}-${newVersion}" #升级包导出路径 322 | downdir="ali_downgrade/${newVersion}-${oldVersion}" #还原包导出路径 323 | echo "从版本[${oldVersion}]升级到新版本[${newVersion}]" 324 | printLog "从版本[${oldVersion}]升级到新版本[${newVersion}]" 325 | ##################### 打SVN标签开始 非正式环境不需要可删除 ##################### 326 | ##################### 下面这行代码为检查是否存在标签,强制先更新预发布环境,非正式环境可删除 ##################### 327 | svnDo ${userName} ${passWord} info ${tagsPath}/tag_${newVersion} "HEAD" 328 | echo "auto_tags:生产环境打包,SVN版本号[${newVersion}]" > svnLog.txt 329 | svnDo ${userName} ${passWord} log ${svnPath} ${oldVersion}:${newVersion} >> svnLog.txt 330 | if [[ ${newVersion} -gt ${newTagsVersion} ]];then 331 | svnDo ${userName} ${passWord} copy ${svnPath} ${tagsPath}/tag_${newVersion} ${newVersion} svnLog.txt 332 | fi 333 | rm -f svnLog.txt 334 | ##################### 打SVN标签结束 非正式环境不需要可删除 ##################### 335 | printLog "删除临时文件" 336 | rm -rf ${updir} 337 | rm -rf ${downdir} 338 | mkdir -p ${updir} 339 | mkdir -p ${downdir} 340 | printLog "升级,导出版本差异文件" 341 | svnDo ${userName} ${passWord} diff ${svnPath} "${oldVersion}:${newVersion}" 342 | svnDo ${userName} ${passWord} export ${svnPath} ${updir} "HEAD" 343 | editConf ${updir} 344 | mv delList.txt delList${env}Up.txt 345 | ##################### 自动压缩开始 不需要可删除 ##################### 346 | jsGrunt "${updir}/template" "./LiveAPP/template" 347 | ##################### 自动压缩结束 不需要可删除 ##################### 348 | cp -rfv ${updir}/ upgrade${env}_${oldVersion}-${newVersion}/ 349 | tar zcvf upgrade${env}.tar.gz upgrade${env}_${oldVersion}-${newVersion}/ 350 | tar zcvf ali_upgrade/upgrade_${oldVersion}-${newVersion}.tar.gz upgrade${env}_${oldVersion}-${newVersion}/ 351 | rm -rf upgrade${env}_${oldVersion}-${newVersion} 352 | printLog "打升级包完成" 353 | ##################### 打还原包开始 不需要可删除 ##################### 354 | printLog "还原,导出版本差异文件" 355 | svnDo ${userName} ${passWord} diff ${svnPath} "${newVersion}:${oldVersion}" 356 | svnDo ${userName} ${passWord} export ${tagsPath}/tag_${oldVersion} ${downdir} "HEAD" 357 | editConf ${downdir} 358 | mv delList.txt delList${env}Down.txt 359 | cp -rfv ${downdir}/ downgrade${env}_${newVersion}-${oldVersion}/ 360 | tar zcvf downgrade${env}.tar.gz downgrade${env}_${newVersion}-${oldVersion}/ 361 | rm -rf downgrade${env}_${newVersion}-${oldVersion} 362 | printLog "打还原包完成" 363 | ##################### 打还原包结束 不需要可删除 ##################### 364 | ##################### 打SVN标签开始 非正式环境不需要可删除 ##################### 365 | newVersion=`svnDo ${userName} ${passWord} gr ${svnPath} 1` 366 | newTagsVersion=`svnDo ${userName} ${passWord} gr ${tagsPath} 1` 367 | echo "auto_tags:生产环境打包,SVN版本号[${newVersion}]" > svnLog.txt 368 | svnDo ${userName} ${passWord} log ${svnPath} ${oldVersion}:${newVersion} >> svnLog.txt 369 | if [[ ${newVersion} -gt ${newTagsVersion} ]];then 370 | svnDo ${userName} ${passWord} copy ${svnPath} ${tagsPath}/tag_${newVersion} ${newVersion} svnLog.txt 371 | fi 372 | rm -f svnLog.txt 373 | ##################### 打SVN标签结束 非正式环境不需要可删除 ##################### 374 | echo ${newVersion} > tagsVersion 375 | exit 0 376 | else 377 | printLog "版本号不正确:OldVersion#${oldVersion} NewVersion#${newVersion}" && exit 1 378 | fi --------------------------------------------------------------------------------