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

来源:互联网 发布:维棠flv优化破解版 编辑:程序博客网 时间:2024/06/08 12:16

前言

最近要成立一个新项目,需要架设在非公司内网的服务器上,因此不能使用公司层面的上线流程了。于是,自己着手开发完成了一个自动化上线系统。下面以该系统为例,聊聊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=$1version=$2publishPath=/export/wy/www/warDepository=/home/hsl/warDepository/#modifywar to war.bakmv $publishPath$project.war $publishPath$project.war.bakscp $warDepository$project$version.war $publishPath$project$version.warkill -9 `ps aux|grep $project|grep -v grep|awk '{print $2}'`mv $publishPath$project$version.war $publishPath$project.warrm -rf $publishPath$project/home/hsl/script/start.sh $project

回滚脚本:

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

包拷贝脚本

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


最后来一个直观的展示:



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


0 0