Jenkins+Gitlab通过脚本自动部署回滚web项目版本至服务器集群(测试环境和正式环境),图文详细

✍️Auth:star皆空       Date:2021/11/12       Cat:Linux服务器       👁️:780 次浏览

扩展文章: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 [email protected]
ssh-copy-id [email protected]

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

发表评论