JenkinsGitlab通过脚本自动部署回滚web项目版本
扩展文章:GitlabJenkins通过钩子实现自动部署web项目一:基础环境介绍及准备
不在通过钩子自动部署至web服务器,需要自己通过脚本在Jenkins选择版本或者服务器发布回滚。
灵活性更高,对于集群来说也实用。
1:Gitlab服务器
ubuntu192。168。152。131参考搭建:Linux安装gitlab,docker安装gitlab教程
2:Jenkins服务器
ubunu192。168。152。130参考搭建:linux安装Jenkins,或docker安装Jenkins教程
生成ssh密钥,发布至web服务器。sshkeygentrsasshcopyidroot192。168。152。150sshcopyidroot192。168。152。151
3:web服务
centos192。168。152。150测试环境
centos192。168。152。151正式环境
已安装nginx,nginx配置文件配置网站目录为wwwwebproject
4:开发者电脑
Windowskey密钥(用于提交代码)
二:gitlab添加密钥
gitlab添加jenkins和开发者电脑sshkey密钥,实现无密码获取代码或者提交代码,如图,已添加好。
三:在开发者电脑提交代码,并标记Tag标签版本至gitlab
对于回滚发布,按提交的Tag标签进行选择。
所以在提交代码时,需打上tag标签。
在开发者电脑,分别提交几个版本并打上tag标签。echowebv1。0projectindex。htmlgitadd。gitcommitmv1。0gittagav1。0mv1。0gitpushoriginv1。0echowebv1。1projectindex。htmlgitadd。gitcommitmv1。1gittagav1。1mv1。1gitpushoriginv1。1echowebv1。2projectindex。htmlgitadd。gitcommitmv1。2gittagav1。2mv1。2gitpushoriginv1。2echowebv2。0projectindex。htmlgitadd。gitcommitmv2。0gittagav2。0mv2。0gitpushoriginv2。0
提交完成后,在gitlab可看见版本如下图所示:
四:配置Jenkins
1:确认已安装GitParameterPlugIn插件
2:新建一个空白web项目
我项目名为webnginx
3:在General设置参数
在General选择Thisprojectisparameterized,此项目使用参数化构建。
选择GitParameter设置,则从gitlab获取参数。
设置参数gitversion,获取版本号,及gitlab的tag
然后再次选择ChoiceParameter设置,自定义选择参数。
设置status参数,选择发布deploy还是回滚rollback
设置server参数,选择test测试服务器还是online正式服务器
4:在源码管理设置
添加源码,选择git,同时配置好用户,添加可参考我开头链接的扩展文章。
这里branch设置为上面设置的gitversion参数。
5:在构建build设置
选择执行操作为Executeshell。
然后写上脚本执行路径及名称,我脚本名在Jenkins服务器scriptjenkinsweb。sh
编写自动化部署与回滚脚本,本人脚本内容可参考:
路径设置:
Jenkins服务器:optweb项目打包位置
web服务器:opt包传送位置
datawww包解压位置
wwwwebproject软链接给nginx的web位置!binbashsetx在编写时可添加此选择,用于详细打印输入,可直观看到脚本执行过程服务器选择,也可分别添加多个服务器,用于集群布置testserver192。168。152。150onlineserver192。168。152。151DATE(dateYmdHM)NAME{DATE}{gitversion}日期加版本号getcopy(){拉取代码并打包file(findoptwebmaxdepth1grepweb。{gitversion}。tar。gz)if〔n{file}〕;thenecho{gitversion}版本包已经存在pkg{file}elseecho{gitversion}版本包不存在,开始打包cd{WORKSPACE}项目的绝对路径变量,Jenkins内置参数,即varlibjenkinsworkspacedevopslabsudotarczvfoptwebweb{NAME}。tar。gz。pkgweb{NAME}。tar。gzfi}deployweb(){远程复制至服务器并部署项目file(sshroot{IP}finddatawwwmaxdepth1grepweb。{gitversion}。tar。gz)验证版本文件是否存在if〔n{file}〕;thenecho您在{server}服务器上已部署过{gitversion}版本项目,请选择回滚rollback,或者其他版本部署deployexit1elsescpoptweb{pkg}root{IP}:optsshroot{IP}mkdirdatawww{pkg}ptarxfopt{pkg}Cdatawww{pkg}rmrfwwwwebprojectlnsdatawww{pkg}wwwwebprojectusrsbinnginxsreloadfi}版本回滚函数rollbackweb(){file(sshroot{IP}finddatawwwmaxdepth1grepweb。{gitversion}。tar。gz)验证版本文件是否存在if〔n{file}〕;thenecho{server}服务器上{gitversion}版本不存在,回滚失败elseecho回滚包为{file},准备执行回滚sshroot{IP}rmrfwwwwebprojectlns{file}wwwwebproject把取到的版本目录软连接到htmlecho回滚完成!!!fi}状态发布还是回滚函数statusweb(){if〔〔statusdeploy〕〕;thengetcopydeploywebelif〔〔statusrollback〕〕;thenrollbackwebfi}通过if判断时正式服务器还是测试服务器。if〔〔servertest〕〕;thenforIPintestserverdostatuswebdoneelif〔〔serveronline〕〕;thenforIPinonlineserverdostatuswebdonefi
布置网站选择lns软连接,为了回滚时,可达到秒级。
Jenkins布置完成,现在可以测试。五:测试发布回滚
1:发布版本
发布1。0的版本,分别发布至test和online测试。
发布成功,没有报错,进去可查看详细输出日志。
打开浏览器访问web,也正常显示
2:测试发布升级新版本
发布1。2的版本,分别发布至test和online测试。
3:测试回滚旧版本
脚本内容,只能回滚已经存在的版本,不存在则报错。
如下:回滚v1。0正常,回滚没有的v1。1报错,因为v1。1没有发布过。
v1。0回滚成功。
v1。1回滚失败,因为v1。1没有发布过。
网页无变化
剩下可自行测试,这里就布置完成了。六:版本包数量限制脚本(扩展)
在实际生产中,不可能无限制的存在所有的包,否则,磁盘终究会满。可以写个脚本,对版本包数量做限制。!binbashReservedNum10保留文件数FileDiroptwebdate(dateYmdHM)cdFileDir进入备份目录FileNum(lslwcl)当前文件夹有几个文件包,即几个备份while((FileNumReservedNum))doOldFile(lsrthead1)获取最旧的那个文件echodateDeleteFile:OldFilermrfFileDirOldFileletFileNumdone