zoukankan      html  css  js  c++  java
  • 自动发布项目(支持部署,回退功能)

    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

  • 相关阅读:
    Oracle数据库备份与恢复的三种方法
    mybatis内置类型
    mybatis中#{}和${}的区别
    Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入?
    java web简单权限管理设计
    Flask总结篇
    Django总结篇
    API总结
    实战小练习
    数据操作
  • 原文地址:https://www.cnblogs.com/fengyuanfei/p/14494378.html
Copyright © 2011-2022 走看看