自动发布项目(支持部署,回退功能)

Jenkins 自动发布项目
1.自动发布项目架构图

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

原文地址:https://www.cnblogs.com/fengyuanfei/p/14494378.html