前言
最近要成立一个新项目,需要架设在非公司内网的服务器上,因此不能使用公司层面的上线流程了。于是,自己着手开发完成了一个自动化上线系统。下面以该系统为例,聊聊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命令(需要先建立机器间信任关系),略过。
最后来一个直观的展示:
如果有朋友在开发类似的系统,需要源码作为参考,可以联系我。