通过SVN的分支功能,实现同套代码进行测试和上线,有效提高开发自动化和上线质量。
qa在客户端执行部署脚本(xxx.sh tagxxx),部署脚本能够执行中间机上的远程脚本实现从SVN下载指定分支代码,编译,打包,发送部署包到本地,然后在本地部署,重启服务器。
1客户端执行的shell脚本
#!/bin/sh
#set dir [index $argv 0]
#中间机密码
passwd="xxxx"
passwd2="xxxx"
passwd1="xxxx"
#TAG号
tag=$1
#远程执行中间机上的脚本
expect <<EOF
set timeout 100
spawn ssh user@ip "bash /home/work/xxx/xxx_test.sh $tag"
expect {
"*yes/no" { send "yes\r" }
"*password:" { send "123\r"
expect "*Permission denied, please try again.*" {send "$passwd1\r"
expect "*Permission denied, please try again.*" {send "$passwd2\r"
}
}
}
}
expect eof
EOF
#路径
BACKUP_PATH="/home/work/xxx/backup"
#resin服务war包文件名
WEB_FILE="xxx.war"
#日期
time=`date +%Y-%m-%d-%H-%M-%S`
#生成备份路径
function getbackupdir(){
if [ ! -d ${BACKUP_PATH} ]
then
mkdir ${BACKUP_PATH}
fi
if [ ! -d ${BACKUP_PATH}${time} ]
then
mkdir ${BACKUP_PATH}${time}
fi
echo ${BACKUP_PATH}${time}
}
if [ -e $WEB_FILE ]
then
mv union `getbackupdir`
unzip -oq $WEB_FILE -d union
rm -f $WEB_FILE
echo "-----redeploy $WEB_FILE finished----"
else
echo "$WEB_FILE not found!"
exit 0
fi
xxx_httpd.sh restart
exit 0
2部署中间机执行的shell脚本
#!/bin/sh
SVNLOCATION="2015021314"
#export mvn "/home/work/opt/apache-maven-3.2.2-bin/apache-maven-3.2.2/bin"
if [ $# -gt 0 ]
then
SVNLOCATION=$1
SOURCE_LOCATION="/home/work/xxx/test"
sleep 1s
else
echo "warning:参数不能为空,请输入准确的tag号!!!"
exit 1
fi
rm -rf $SOURCE_LOCATION
mkdir $SOURCE_LOCATION
echo "删除旧版本代码成功。。。"
echo "svn地址 tag号:"$SVNLOCATION
expect <<EOF
set timeout 60
spawn svn --username xxx --password xxx checkout http://xxx/svn/trunk/xxx-tag/$SVNLOCATION $SOURCE_LOCATION
expect {"*yes/no"
{send "yes\r"}}
expect eof
EOF
#if [[ $? -eq 0 ]]
#then echo "源码下载成功"
#else echo "源码下载失败"
#exit 1
#fi
sleep 1s
cd $SOURCE_LOCATION
#打包
/home/work/opt/apache-maven-3.2.2-bin/apache-maven-3.2.2/bin/mvn clean
/home/work/opt/apache-maven-3.2.2-bin/apache-maven-3.2.2/bin/mvn install -Ptest -Dmaven.test.skip=true
if [[ $? -eq 0 ]]
then echo "打包成功"
else echo "打包失败"
exit 1
fi
#修改安装包包名称
/home/work/rsync/bin/rsync -vzrtopg --progress --delete --password-file=/home/work/rsync/rsync.pas --port=3334 $SOURCE_LOCATION/xxx.war work@ip::xxx/xxx.war
echo "xxx"