Jenkins+Gitlab通过脚本自动部署回滚web项目版本至服务器集群(测试环境和正式环境),图文详细
Posted the丶only
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jenkins+Gitlab通过脚本自动部署回滚web项目版本至服务器集群(测试环境和正式环境),图文详细相关的知识,希望对你有一定的参考价值。
扩展文章:Gitlab+Jenkins通过钩子实现自动部署web项目
一:基础环境介绍及准备
不在通过钩子自动部署至web服务器,需要自己通过脚本在Jenkins选择版本或者服务器发布回滚。
灵活性更高,对于集群来说也实用。
1:Gitlab服务器
ubuntu 192.168.152.131 —参考搭建:Linux安装gitlab,docker安装gitlab教程
2:Jenkins服务器
ubunu 192.168.152.130 —参考搭建:linux安装Jenkins,或docker安装Jenkins教程
生成ssh 密钥,发布至web服务器。
ssh-keygen -t rsa
ssh-copy-id root@192.168.152.150
ssh-copy-id root@192.168.152.151
3:web服务
centos 192.168.152.150 —测试环境
centos 192.168.152.151 —正式环境
已安装nginx,nginx配置文件配置网站目录为 /www/web-project
4:开发者电脑
Windows+key密钥 (用于提交代码)
二:gitlab添加密钥
gitlab添加jenkins和开发者电脑ssh key密钥,实现无密码获取代码或者提交代码,如图,已添加好。
三:在开发者电脑提交代码,并标记Tag标签版本至gitlab
对于回滚发布,按提交的Tag标签进行选择。
所以在提交代码时,需打上tag标签。
在开发者电脑,分别提交几个版本并打上tag标签。
echo "web v1.0 project" > index.html
git add .
git commit -m "v1.0"
git tag -a "v1.0" -m "v1.0"
git push origin v1.0
echo "web v1.1 project" > index.html
git add .
git commit -m "v1.1"
git tag -a "v1.1" -m "v1.1"
git push origin v1.1
echo "web v1.2 project" > index.html
git add .
git commit -m "v1.2"
git tag -a "v1.2" -m "v1.2"
git push origin v1.2
echo "web v2.0 project" > index.html
git add .
git commit -m "v2.0"
git tag -a "v2.0" -m "v2.0"
git push origin v2.0
提交完成后,在gitlab可看见版本如下图所示:
四:配置Jenkins
1:确认已安装Git Parameter Plug-In插件
2:新建一个空白web项目
我项目名为web-nginx
3:在General设置参数
在General选择This project is parameterized,此项目使用参数化构建。
选择Git Parameter设置,则从gitlab获取参数。
设置参数git_version,获取版本号,及gitlab的tag
然后再次选择Choice Parameter设置,自定义选择参数。
设置status参数,选择“发布deploy”还是“回滚rollback”
设置server参数,选择“test测试服务器”还是“online正式服务器”
4:在源码管理设置
添加源码,选择git,同时配置好用户,添加可参考我开头链接的扩展文章。
这里branch设置为上面设置的git_version参数。
5:在构建build设置
选择执行操作为Execute shell。
然后写上脚本执行路径及名称,我脚本名在Jenkins服务器/script/jenkins-web.sh
编写自动化部署与回滚脚本,本人脚本内容可参考:
路径设置:
Jenkins服务器:/opt/web 项目打包位置
web服务器:/opt 包传送位置
/data/www 包解压位置
/www/web-project 软链接给nginx的web位置
#!/bin/bash
set -x #在编写时可添加此选择,用于详细打印输入,可直观看到脚本执行过程
#服务器选择,也可分别添加多个服务器,用于集群布置
test_server="
192.168.152.150
"
online_server="
192.168.152.151
"
DATE=$(date +%Y%m%d_%H%M)
NAME=${DATE}_${git_version} #日期加版本号
get_copy(){ #拉取代码并打包
file=$(find /opt/web -maxdepth 1 | grep "web_.*_${git_version}.tar.gz")
if [ -n "${file}" ] ;then
echo "${git_version}版本包已经存在"
pkg=${file##*/}
else
echo "${git_version}版本包不存在,开始打包"
cd ${WORKSPACE} #项目的绝对路径变量,Jenkins内置参数,即/var/lib/jenkins/workspace/devopslab
sudo tar czvf /opt/web/web_${NAME}.tar.gz ./*
pkg="web_${NAME}.tar.gz"
fi
}
deploy_web(){ #远程复制至服务器并部署项目
file=$(ssh root@${IP} "find /data/www/ -maxdepth 1 | grep "web_.*_${git_version}.tar.gz"") #验证版本文件是否存在
if [ -n "${file}" ] ;then
echo "您在${server}服务器上已部署过${git_version}版本项目,请选择回滚rollback,或者其他版本部署deploy"
exit 1
else
scp /opt/web/${pkg} root@${IP}:/opt/
ssh root@${IP} "mkdir /data/www/${pkg} -p && \\
tar xf /opt/${pkg} -C /data/www/${pkg}/ && \\
rm -rf /www/web-project && ln -s /data/www/${pkg} /www/web-project && \\
/usr/sbin/nginx -s reload"
fi
}
#版本回滚函数
rollback_web(){
file=$(ssh root@${IP} "find /data/www/ -maxdepth 1 | grep "web_.*_${git_version}.tar.gz"") #验证版本文件是否存在
if [ -n "${file}"] ;then
echo "${server}服务器上${git_version}版本不存在,回滚失败"
else
echo "回滚包为${file},准备执行回滚"
ssh root@${IP} "rm -rf /www/web-project && ln -s ${file} /www/web-project" #把取到的版本目录软连接到html
echo "回滚完成!!!"
fi
}
#状态发布还是回滚函数
status_web(){
if [[ $status == "deploy" ]];then
get_copy
deploy_web
elif [[ $status == "rollback" ]];then
rollback_web
fi
}
#通过if判断时正式服务器还是测试服务器。
if [[ $server == "test" ]];then
for IP in $test_server
do status_web
done
elif [[ $server == "online" ]];then
for IP in $online_server
do status_web
done
fi
布置网站选择ln -s软连接,为了回滚时,可达到秒级。
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没有发布过。
网页无变化
剩下可自行测试,这里就布置完成了。
六:版本包数量限制脚本(扩展)
在实际生产中,不可能无限制的存在所有的包,否则,磁盘终究会满。可以写个脚本,对版本包数量做限制。
#!/bin/bash
ReservedNum=10 #保留文件数
FileDir=/opt/web
date=$(date "+%Y%m%d_%H%M%")
cd $FileDir #进入备份目录
FileNum=$(ls -l | wc -l) #当前文件夹有几个文件包,即几个备份
while(( $FileNum > $ReservedNum))
do
OldFile=$(ls -rt | head -1) #获取最旧的那个文件
echo $date "Delete File:"$OldFile
rm -rf $FileDir/$OldFile
let "FileNum--"
done
以上是关于Jenkins+Gitlab通过脚本自动部署回滚web项目版本至服务器集群(测试环境和正式环境),图文详细的主要内容,如果未能解决你的问题,请参考以下文章
CI/CD技术专题「Jenkins实战系列」如何通过Gitlab对接Jenkins构建提交自动触发部署构建体系指南(上部)