赞
踩
扩展文章:Gitlab+Jenkins通过钩子实现自动部署web项目
不在通过钩子自动部署至web服务器,需要自己通过脚本在Jenkins选择版本或者服务器发布回滚。
灵活性更高,对于集群来说也实用。
ubuntu 192.168.152.131 —参考搭建:Linux安装gitlab,docker安装gitlab教程
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
centos 192.168.152.150 —测试环境
centos 192.168.152.151 —正式环境
已安装nginx,nginx配置文件配置网站目录为 /www/web-project
Windows+key密钥 (用于提交代码)
gitlab添加jenkins和开发者电脑ssh key密钥,实现无密码获取代码或者提交代码,如图,已添加好。
对于回滚发布,按提交的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可看见版本如下图所示:
我项目名为web-nginx
在General选择This project is parameterized,此项目使用参数化构建。
选择Git Parameter设置,则从gitlab获取参数。
设置参数git_version,获取版本号,及gitlab的tag
然后再次选择Choice Parameter设置,自定义选择参数。
设置status参数,选择“发布deploy”还是“回滚rollback”
设置server参数,选择“test测试服务器”还是“online正式服务器”
添加源码,选择git,同时配置好用户,添加可参考我开头链接的扩展文章。
这里branch设置为上面设置的git_version参数。
选择执行操作为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.0的版本,分别发布至test和online测试。
发布成功,没有报错,进去可查看详细输出日志。
打开浏览器访问web,也正常显示
发布1.2的版本,分别发布至test和online测试。
脚本内容,只能回滚已经存在的版本,不存在则报错。
如下:回滚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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。