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

本文介绍了如何构建一个自动化上线系统,实现从jenkins打包到web应用部署和回滚的全程自动化。用户只需输入项目信息,系统便能完成上线和回滚操作,并具备服务重启和远程日志查看功能。系统分为上线服务、jenkins和应用服务器三个部分,部署在不同服务器以确保稳定性。详细阐述了Java代码触发jenkins构建和查询打包状态的实现。

前言

最近要成立一个新项目,需要架设在非公司内网的服务器上,因此不能使用公司层面的上线流程了。于是,自己着手开发完成了一个自动化上线系统。下面以该系统为例,聊聊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 ’自己的IP‘</shortDescription>
<addr>ip</addr>
</cause>
</action>
<action _class="hudson.plugins.git.util.BuildData">
<buildsByBranchName>
<refsremotesbranch1 _class="hudson.plugins.git.util.Build">
<buildNumber>115</buildNumber>
<marked>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<branch>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<name>refs/remotes/branch1</name>
</branch>
</marked>
<revision>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<branch>
<SHA1>ff044bd3ef743470a99885dbbafd054acc4ab930</SHA1>
<name>refs/remotes/branch1</name>
</branch>
</revision>
</refsremotes-toolsbranch1>
<refsremotes-toolsmaster _class="hudson.plugins.git.util.Build">
<buildNumber>117</buildNumber>
<marked>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/master</name>
</branch>
</marked>
<revision>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<branch>
<SHA1>e9ff09fd3e28c6e61252aac106d516ceb105030a</SHA1>
<name>refs/remotes/master</name>
</branch>
</revision>
</refsremotes-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/-tools/master</name>
</branch>
</lastBuiltRevision>
<remoteUrl>https://github.com/.../-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>*** #117</fullDisplayName>
<id>117</id>
<keepLog>false</keepLog>
<number>117</number>
<queueId>78</queueId>
<result>SUCCESS</result>
<timestamp>1492395111129</timestamp>
<url>
http://ip:port/jenkins/job/***/117/
</url>
<builtOn/>
<changeSet _class="hudson.plugins.git.GitChangeSetList">
<kind>git</kind>
</changeSet>
</freeStyleBuild>

涉及到的部分脚本

服务部署脚本

#!/bin/sh
 
echo`date`
project=$1
version=$2
publishPath=/***...
warDepository=/***/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=/***
warDepository=/***/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命令(需要先建立机器间信任关系),略过。

最后来一个直观的展示:

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拥春飞翔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值