zoukankan      html  css  js  c++  java
  • CI持续集成系列之(九)代码发布脚本模板书写

    前言

    前面我们介绍了Jenkins来发布项目通过nginx来展示流程,那里只是提供了一个简单的测试脚本,接下来呢介绍一下一个比较完善的发布脚本,该脚本可实现从gitlab服务器获取代码,打包,部署到WEB服务器,回滚到任意版本,一键回滚到上一版本。脚本可以当做模板来套用,屡试不爽,enjoy吧!!

    详细内容

    1、环境准备

    首先,脚本发布一定是用普通用户www来发布。脚本放在www的用户家目录,每个WEB都创建www用户并且UID相同,web目录和权限一致,其次需要创建一些必须的文件目录。

    # mkdir -p /deploy/code/web-demo -p
    # mkdir -p /deploy/config/web-demo/base
    # mkdir -p /deploy/config/web-demo/other
    # mkdir -p /deploy/tar
    # mkdir -p /deploy/tmp
    # mkdir -p /opt/webroot
    # mkdir /webroot
    # chown -R www:www /deploy
    # chown -R www:www /opt/webroot
    # chown -R www:www /webroot

    2、脚本内容

    #!/bin/bash
    # Description:本脚本主要完成的动作是部署、回滚,首先从我们私有的gitlab仓库拉下web-demo项目(http://192.168.56.11/web/web-demo.git),然后打包、压缩、scp到192.168.56.12:/webroot/、解压、然后最后通过nginx访问http://192.168.56.12/,查看结果。
    # Dir List   需要创建的目录
    # mkdir -p /deploy/code/web-demo -p
    # mkdir -p /deploy/config/web-demo/base
    # mkdir -p /deploy/config/web-demo/other
    # mkdir -p /deploy/tar
    # mkdir -p /deploy/tmp
    # mkdir -p /opt/webroot
    # mkdir /webroot
    # chown -R www:www /deploy
    # chown -R www:www /opt/webroot
    # chown -R www:www /webroot
    
    #服务器节点:
    # Node List
    PRE_LIST="192.168.56.11"      #gitlab地址
    GROUP1_LIST="192.168.56.12"   #WEB服务IP地址
    
    #回滚服务器列表
    ROLLBACK_LIST="192.168.56.11 192.168.56.12"
    
    #日期和时间变量(时间不固定)
    # Date/Time Veriables   
    LOG_DATE='date "+%Y-%m-%d"'
    LOG_TIME='date "+%H-%M-%S"'
    
    #代码打包时间变量(固定时间)
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    
    #变量
    # Shell Env   
    #脚本名称
    SHELL_NAME="deploy_all.sh"  
    
    #脚本路径 
    SHELL_DIR="/home/www/"
    
    #脚本执行日志文件路径        
    SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"   
    
    #代码变量
    # Code Env
    
    #项目名称,此名称是从gitlab服务器clone下来的代码目录
    PRO_NAME="web-demo"
    
    #从gitlab服务器更新代码的目录
    CODE_DIR="/deploy/code/web-demo" 
    
    #项目配置文件  
    CONFIG_DIR="/deploy/config/web-demo"  配置目录
    
    #代码临时目录,从git 服务器获取到的代码放在这里打包在部署到WEB服务器
    TMP_DIR="/deploy/tmp"  
    
    #打包目录 
    TAR_DIR="/deploy/tar"     
    
    #锁文件
    LOCK_FILE="/tmp/deploy.lock"   
    
    
    # 用法
    usage(){    
        echo $"Usage: $0 {deploy | rollback [ list | version ]"
    }
    
    #写日志
    writelog(){    
       LOGINFO=$1   #将参数作为日志输入
       echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO} "  >> ${SHELL_LOG}
    }
    
    #创建锁
    shell_lock(){
        touch ${LOCK_FILE}
    }
    
    #判断
    url_test(){
            URL=$1
        curl -s --head $URL | grep '200 OK'
        if [ $? -ne 0 ];then
            shell_unlock;
            echo "test error" && exit;
        fi
    }
    #删除锁
    shell_unlock(){
        rm -f ${LOCK_FILE}
    }
    #拉取代码
    code_get(){
        writelog "code_get";
        cd $CODE_DIR && git pull
        cp -r ${CODE_DIR} ${TMP_DIR}/
        API_VERL=$(git show | grep commit | cut -d ' ' -f2)
        API_VER=$(echo ${API_VERL:0:6})
    }
    #代码构建
    code_build(){
        echo code_guild
    }
    code_config(){
        writelog "code_config"
        /bin/cp -r ${CONFIG_DIR}/base/* ${TMP_DIR}/"${PRO_NAME}"
            PKG_NAME="${PRO_NAME}"_"$API_VER"_"${CDATE}-${CTIME}"
        cd ${TMP_DIR} && mv ${PRO_NAME} ${PKG_NAME}
    }
    code_tar(){
        writelog "code_tar"
        cd ${TMP_DIR} && tar czf ${PKG_NAME}.tar.gz ${PKG_NAME}
            writelog "${PKG_NAME}.tar.gz"
    }
    code_scp(){
        writelog "code_scp"
        for node in $PRE_LIST;do
            scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
        done
        for node in $GROUP1_LIST;do
            scp ${TMP_DIR}/${PKG_NAME}.tar.gz $node:/opt/webroot/
        done
    }
    pre_deploy(){
        writelog "remove from cluster"
            ssh $PRE_LIST "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
            ssh $PRE_LIST "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
    }
    pre_test(){
        url_test "http://${PRE_LIST}/index.html"
        echo "d to cluster"
    }
    group1_deploy(){
        writelog "remove from cluster"
        for node in $GROUP1_LIST;do
                    ssh $node "cd /opt/webroot && tar zxf ${PKG_NAME}.tar.gz"
                ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/${PKG_NAME} /webroot/web-demo"
            done
        scp ${CONFIG_DIR}/other/192.168.56.12.crontab.xml 192.168.56.12:/webroot/web-demo/crontab.xml
    }
    group1_test(){
        url_test "http://192.168.56.12/index.html"    
        echo "add to cluster"
    }
    rollback_fun(){
        for node in $ROLLBACK_LIST;do
        ssh $node "rm -f /webroot/web-demo && ln -s /opt/webroot/$1 /webroot/web-demo"
            done
    }
    rollback(){
    if [ -z $1 ];then
        shell_unlock;
        echo "Please input rollback version" && exit;
    fi
        case $1 in
            list)
            ls -l /opt/webroot/*.tar.gz
            ;;
        *)
            rollback_fun $1
        esac
    }
    main(){
       if [ -f $LOCK_FILE ];then
        echo "Deploy is running" && exit;
       fi
        DEPLOY_METHOD=$1
        ROLLBACK_VER=$2
        case $DEPLOY_METHOD in
           deploy)
            shell_lock;
            code_get;
            code_build;
            code_config;
            code_tar;
            code_scp;
    #        pre_deploy;
    #        pre_test;
            group1_deploy;
            group1_test;
            shell_unlock;
            ;;
        rollback)
            shell_lock;
            rollback $ROLLBACK_VER;
            shell_unlock;
            ;;
        *)
            usage;
        esac
    }
    main $1 $2
  • 相关阅读:
    在X++中使用IoC/DI模式应对不断变化的客户需求
    Predicate<T>与Func<T, bool>泛型委托
    Windows Live Writer插件:在WLW中插入语法高亮代码
    学习C#和.NET的资源
    C#中事件的动态调用
    2008年全国软件工程大会论文集
    C#基础:接口(二)
    【转载】"变化"、"复用"、"抽象"、"稳定" 影响着软件设计模式,架构,开发方法
    【领域驱动设计】.NET实践:实体、值对象和数据传输对象
    RSS订阅之基本使用
  • 原文地址:https://www.cnblogs.com/hackerer/p/6293540.html
Copyright © 2011-2022 走看看