浅谈web应用上线和回滚中的自动化

前言

最近要成立一个新项目,需要架设在非公司内网的服务器上,因此不能使用公司层面的上线流程了。于是,自己着手开发完成了一个自动化上线系统。下面以该系统为例,聊聊web项目上线和回滚中的自动化实施。


系统功能简介

该系统是一个高度自动化的上线管理系统,从触发jenkins打包到服务部署的上线过程和执行回滚都是一键完成。在整个过程中,用户只需要输入项目名称,选择要上线和回滚的服务器和SVN信息即可。此外,该系统还提供了服务重启、远程日志实时查看等辅助功能,为上线过程提供便利。

 

系统部署和工作流程

该系统需要使用jenkins进行编译打包,在部署上包括以下三块:上线服务本身、jenkins机器和部署应用的应用服务器,为了避免服务器被动宕机或主动重启导致的相互影响,建议将上线服务、jenkins服务和应用服务分开,分别部署到不同的服务器上。

以下是该上线系统的部署图:

主要的工作流程如下:


上线和回滚的包管理

部分实现细节

 

Java代码触发jenkins参数化构建

Java代码查询打包状态

Jenkins提供了如下URL查询job的执行状态的详细情况,格式是一个xml。该xml中,result节点为success表示执行成功,如果构建中的job,则无result节点。


XML详细内容:

<freeStyleBuild _class="hudson.model.FreeStyleBuild">
<action _class="hudson.model.ParametersAction">
<parameter _class="hudson.model.StringParameterValue">
<name>branch</name>
<value>master</value>
</parameter>
</action>
<action _class="hudson.model.CauseAction">
<cause _class="hudson.model.Cause$RemoteCause">
<shortDescription>Started by remote host 172.24.5.204</shortDescription>
<addr>172.24.5.204</addr>
</cause>
</action>
<action _class="hudson.plugins.git.util.BuildData">
<buildsByBranchName>
<refsremotesebl-toolsbranch1 _class="hudson.plugins.git.util.Build">
<buildNumber>115</buildNumber>
<marked>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<branch>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<name>refs/remotes/ebl-tools/branch1</name>
</branch>
</marked>
<revision>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<branch>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<name>refs/remotes/ebl-tools/branch1</name>
</branch>
</revision>
</refsremotesebl-toolsbranch1>
<refsremotesebl-toolsmaster _class="hudson.plugins.git.util.Build">
<buildNumber>117</buildNumber>
<marked>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/ebl-tools/master</name>
</branch>
</marked>
<revision>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/ebl-tools/master</name>
</branch>
</revision>
</refsremotesebl-toolsmaster>
<refsremotesoriginbranch1 _class="hudson.plugins.git.util.Build">
<buildNumber>109</buildNumber>
<marked>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<branch>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<name>refs/remotes/origin/branch1</name>
</branch>
</marked>
<revision>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<branch>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<name>refs/remotes/origin/branch1</name>
</branch>
</revision>
</refsremotesoriginbranch1>
<refsremotesoriginmaster _class="hudson.plugins.git.util.Build">
<buildNumber>108</buildNumber>
<marked>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/origin/master</name>
</branch>
</marked>
<revision>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/origin/master</name>
</branch>
</revision>
</refsremotesoriginmaster>
</buildsByBranchName>
<lastBuiltRevision>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/ebl-tools/master</name>
</branch>
</lastBuiltRevision>
<remoteUrl>https://github.com/huanggua/ebl-tools/</remoteUrl>
<scmName/>
</action>
<action _class="hudson.plugins.git.GitTagAction"/>
<action/>
<action/>
<action/>
<action/>
<building>false</building>
<displayName>#117</displayName>
<duration>23932</duration>
<estimatedDuration>20841</estimatedDuration>
<fullDisplayName>ebl-tools #117</fullDisplayName>
<id>117</id>
<keepLog>false</keepLog>
<number>117</number>
<queueId>78</queueId>
<result>SUCCESS</result>
<timestamp>1492395111129</timestamp>
<url>
http://172.24.5.203:8185/jenkins/job/ebl-tools/117/
</url>
<builtOn/>
<changeSet _class="hudson.plugins.git.GitChangeSetList">
<kind>git</kind>
</changeSet>
</freeStyleBuild>


涉及到的部分脚本

服务部署脚本

#!/bin/sh
 
echo`date`
project=$1
version=$2
publishPath=/export/wy/www/
warDepository=/home/hsl/warDepository/
#modifywar to war.bak
mv $publishPath$project.war $publishPath$project.war.bak
scp $warDepository$project$version.war $publishPath$project$version.war
kill -9 `ps aux|grep $project|grep -v grep|awk '{print $2}'`
mv $publishPath$project$version.war $publishPath$project.war
rm -rf $publishPath$project
/home/hsl/script/start.sh $project

回滚脚本:

#!/bin/sh
 
echo`date`
project=$1
version=$2
publishPath=/export/wy/www/
warDepository=/home/hsl/warDepository/
#modifywar to war.bak
mv $publishPath$project.war $publishPath$project.war.bak
scp $warDepository$project$version.war $publishPath$project$version.war
kill -9 `ps aux|grep $project|grep -v grep|awk '{print $2}'`
mv $publishPath$project$version.war $publishPath$project.war
rm -rf $publishPath$project
/home/hsl/script/start.sh $project
 

包拷贝脚本

只有几条scp命令(需要先建立机器间信任关系),略过。


最后来一个直观的展示:



如果有朋友在开发类似的系统,需要源码作为参考,可以联系我。


猜你喜欢

转载自blog.csdn.net/iamhuanggua/article/details/70155391
今日推荐