自动发布项目(支持部署,回退功能)
Jenkins 自动发布项目
1.自动发布项目架构图
![](https://img2020.cnblogs.com/blog/2174174/202103/2174174-20210307133013185-2116136682.png)
2.自动发布项目思路
1.手动搭建nginx集群架构
2.开发提交代码至gitlab、手动拉取代码,并推送至web服务器群组
3.将手动操作编写至shell脚本,由Jenkins调取,并推送至web服务器组
3.编写上线脚本,将代码推送至web服务器组
1.配置Jenkins构建发布脚本 例如下面的auto_web_update.sh脚本
[root@localhost ~]# mkdir /data/sh -p [root@localhost ~]# cd /data/sh/ [root@localhost sh]# touch auto_web_update.sh [root@localhost sh]# vim auto_web_update.sh #!/bin/bash DATE=$(date +%Y-%m-%d-%H-%s) web_server="192.168.1.100 192.168.1.200" Sdir=/opt Ddir=/code Hdir=/usr/local/nginx/html #1.进入gitlab项目目录,将内容进行打包 get_code(){ #cd /root/.jenkins/workspace/freestyle && \ #${WORKSPACE_TMP} 变量是 工作区附近的临时目录,该目录不可浏览并且不会干扰SCM检出。最初可能不存在,所以请确保根据需要创建目录(例如,mkdir -p在Linux上)。当常规工作空间是驱动器根目录时,未定义。 tar czf $Sdir/web-${DATE}.tar.gz ./* cd ${WORKSPACE_TMP} && \ } #2.将内容通过scp拷贝至web集群组 (提前做好免密钥) scp_web_server(){ for i in $web_server do scp -r /$Sdir/web-${DATE}.tar.gz root@$i:/root/ ssh root@$i "mkdir -p $Dsir/web-${DATE} && \ tar xf $Sdir/web-${DATE}.tar.gz -C $Dir/web-${DATE} rm -rf $Hdir/web && \ ln -s $Dir/web-${DATE} $Hdir/web" done } deploy(){ get_code scp_web_server } deploy [root@localhost sh]# chmod +x /data/sh/auto_web_update.sh [root@localhost sh]# ll total 4 -rwxr-xr-x. 1 root root 647 Dec 11 10:16 auto_web_update.sh
立即构建-自动触发脚本
4.Jenkins实现版本发布
1.为什么要让项目支持tag版本方式上线?
由于之前上线方式是直接获取最新代码,那么会造成后期回退变的困难。
那如果采用tag方式,比如第一次上线v1.1、第二次上线v1.2、如果上线v1.2出现问题,那么我们可以快速回退至上一个版本v1.1。
2.实现tag版本上线方式思路
1.开发如果需要发布新版本,必须将当前的把呢不能打赏一个标签。
2.Jenkins需要让其支持传参,比如用户传递v1.1则拉取项目的v1.1标签
3.实战Jenkins部署tag版本
1.首先安装Git Parameter插件,然后配置Jenkins参数化构建,让用户在构建时选择对应的tag版本。
手动搭建一套集群环境?然后实现代码的上线?
Jenkins 构建 项目?html php(如果是php需要重新php服务,html不用)
脚本优化流程思路:
1.上线问题(脚本粗糙)
[root@localhost sh]# vim auto_web_update.sh #!/bin/bash DATE=$(date +%Y-%m-%d-%H-%s) web_server="192.168.1.100 192.168.1.200" Sdir=/opt Ddir=/code Hdir=/usr/local/nginx/html #1.进入gitlab项目目录,将内容进行打包 get_code(){ #cd /root/.jenkins/workspace/freestyle && \ #${WORKSPACE_TMP} 变量是 工作区附近的临时目录,该目录不可浏览并且不会干扰SCM检出。最初可能不存在,所以请确保根据需要创建目录(例如,mkdir -p在Linux上)。当常规工作空间是驱动器根目录时,未定义。 tar czf $Sdir/web-${DATE}.tar.gz ./* cd ${WORKSPACE_TMP} && \ } #2.将内容通过scp拷贝至web集群组 (提前做好免密钥) scp_web_server(){ for i in $web_server do scp -r /$Sdir/web-${DATE}.tar.gz root@$i:/root/ ssh root@$i "mkdir -p $Dsir/web-${DATE} && \ tar xf $Sdir/web-${DATE}.tar.gz -C $Dir/web-${DATE} rm -rf $Hdir/web && \ ln -s $Dir/web-${DATE} $Hdir/web" done } deploy(){ get_code scp_web_server } deploy
2.优化shell脚本,让其支持传参 git tag(gitlab仓库 需要打tag号)
#!/bin/bash DATE=$(date +%Y-%m-%d-%H-%s) web_server="192.168.1.100 192.168.1.200" Sdir=/opt Ddir=/code Hdir=/usr/local/nginx/html Name=${DATE}-${git_version} #${git_version}变量对应的是gitlab上的版本,传参的功能 #1.进入gitlab项目目录,将内容进行打包 get_code(){ #cd /root/.jenkins/workspace/freestyle && \ #${WORKSPACE_TMP} 变量是 工作区附近的临时目录,该目录不可浏览并且不会干扰SCM检出。最初可能不存>在,所以请确保根据需要创建目录(例如,mkdir -p在Linux上)。当常规工作空间是驱动器根目录时,未定义。 tar czf ${Sdir}/web-${Name}.tar.gz ./* cd ${WORKSPACE_TMP} && \ } #2.将内容通过scp拷贝至web集群组 (提前做好免密钥) scp_web_server(){ for i in $web_server do scp -r /$Sdir/web-${Name}.tar.gz root@$i:/root/ ssh root@$i "mkdir -p $Dsir/web-${Name} && \ tar xf ${Sdir}/web-${Name}.tar.gz -C ${Dir}/web-${Name} rm -rf ${Hdir}/web && \ ln -s ${Dir}/web-${Name} ${Hdir}/web" done } deploy(){ get_code scp_web_server } deploy
3.优化shell脚本,让其支持回退的功能
#!/bin/bash DATE=$(date +%Y-%m-%d-%H-%s) web_server="192.168.1.100 192.168.1.200" Sdir=/opt Ddir=/code Hdir=/usr/local/nginx/html Name=${DATE}-${git_version} #${git_version}变量对应的是gitlab上的版本,传参的功能 #1.进入gitlab项目目录,将内容进行打包 get_code(){ #cd /root/.jenkins/workspace/freestyle && \ #${WORKSPACE_TMP} 变量是 工作区附近的临时目录,该目录不可浏览并且不会干扰SCM检出。最初可能不存在,所以请确保根据需要创建目录(例如,mkdir -p在Linux上)。当常规工作空间是驱动器根目录时,未定义。 tar czf $Sdir/web-${Name}.tar.gz ./* cd ${WORKSPACE_TMP} && \ } #2.将内容通过scp拷贝至web集群组 (提前做好免密钥) scp_web_server(){ for i in $web_server do scp -r /$Sdir/web-${Name}.tar.gz root@$i:/root/ ssh root@$i "mkdir -p $Dsir/web-${Name} && \ tar xf $Sdir/web-${Name}.tar.gz -C ${Dir}/web-${Name} rm -rf $Hdir/web && \ ln -s $Dir/web-${Name} $Hdir/web" done } back(){ back_file=$(find /root/.jenkins/workspace/ -maxdepth 1 -type d -name "web-*-${git_version}") for i in $web_server do ssh root@$i " rm -rf $Hdir/web && \ ln -s ${back_file} $Hdir/web" done } deploy(){ get_code scp_web_server } if [ $deploy_env == "deploy" ];then deploy elif [ $deploy_env == "rollback" ];then back fi
4.优化shell脚本,让其无法实现重复构建一个版本
#!/bin/bash DATE=$(date +%Y-%m-%d-%H-%s) web_server="192.168.1.100 192.168.1.200" Sdir=/opt Ddir=/code Hdir=/usr/local/nginx/html Name=${DATE}-${git_version} #${git_version}变量对应的是gitlab上的版本,传参的功能 #1.进入gitlab项目目录,将内容进行打包 get_code(){ #cd /root/.jenkins/workspace/freestyle && \ #${WORKSPACE_TMP} 变量是 工作区附近的临时目录,该目录不可浏览并且不会干扰SCM检出。最初可能不存在,所以请确保根据需要创建目录(例如,mkdir -p在Linux上)。当常规工作空间是驱动器根目录时,未定义。 tar czf $Sdir/web-${Name}.tar.gz ./* cd ${WORKSPACE_TMP} && \ } #2.将内容通过scp拷贝至web集群组 (提前做好免密钥) scp_web_server(){ for i in $web_server do scp -r /$Sdir/web-${Name}.tar.gz root@$i:/root/ ssh root@$i "mkdir -p $Dsir/web-${Name} && \ tar xf $Sdir/web-${Name}.tar.gz -C ${Dir}/web-${Name} rm -rf $Hdir/web && \ ln -s $Dir/web-${Name} $Hdir/web" done } #回退 back(){ back_file=$(find /root/.jenkins/workspace/ -maxdepth 1 -type d -name "web-*-${git_version}") for i in $web_server do ssh root@$i " rm -rf $Hdir/web && \ ln -s ${back_file} $Hdir/web" done } #部署 deploy(){ get_code scp_web_server } #判断之前是否部署过该版本的commit,如果没有则部署,如果有则提示然后退出 #如果是回退,则不受限制 if [ $deploy_env == "deploy" ];then #GIT_COMMIT 提交哈希被检出。 是Jenkins上的环境变量 #GIT_PREVIOUS_SUCCESSFUL_COMMIT 最后一次成功在该分支上构建提交的哈希(如果有)。 if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then echo "你已经部署过该 ${git_version} 版本" exit 1 else deploy fi elif [ $deploy_env == "rollback" ];then back fi