• CICD : 存代码部署(精简版)


    公司OA 平台即将上线,需要比较频繁的进行版本更新迭代,引发大量的运维工作,奈何新引入的OA 系统不支持自动打包,所以打包工作需要IT 手动处理。

    与开发沟通每次新版本发布其都将提供一个ekpyyyymmdd.zip 格式的压缩包给到运维,我要做的就是将代码部署到生产环境的服务器,启动服务、确保服务运行正常。

    环境说明:

      Web 服务器:

        数量:6台。

        环境变量:ekp 用户的配置环境已经设置java 环境变量。

        代码路径:/data/ekp/ekp→/data/ekp/ekpyyyymmdd

        启动命令:/data/ekp/linux64/start-normal64.sh

        软件包:/data/EKP_Attachment/ekpcode/ekpyyyymmdd.zip (NFS 共享目录,每台WEB服务器都可以访问)

      配置文件替换:开发已经完成相关文件配置替换工作:无需操作,开发很给力。

      脚本部署位置:bamboo 服务器。

    思路:在Bamboo触发脚本

      1、创建一个for循环,由bamboo服务器挨个的远程到对应Web 服务器进行代码的解压到对应目录。

      2、停止现有的web服务。

      3、重新配置置软连,要求指向新部署的代码。

      4、执行服务启动操作。

      5、定期检查服务状态知道成功或启动超时。

    注意事项:

      1、避免脚本重复运行,需要设置运行状态锁。

      2、记录必要的日志信息。

    闲言少叙 进入正题

    一:bamboo 服务器设置与对应服务器的免登陆配置。

    二:书写部署脚本。   

    #!/bin/bash
    #Node List ,存放用用服务器,IP地址用空格分割
    PRD_LIST="10.xxx.xxx.7 10.xxx.xxx.8 10.xxx.xxx.9 10.xxx.xxx.10 10.xxx.xxx.11 10.xxx.xxx.12"
    #Shell Env,存放于bamboo 服务器vim
    SHELL_NAME=$0
    SHELL_DIR="/data/EKP_Attachment"
    SHELL_LOG="${SHELL_DIR}/DeployShell/logs/${SHELL_NAME}.log"
    PRO_NAME="ekp"
    LOCK_FILE="${SHELL_DIR}/DeployShell/tmp/$0.lock" #用于判定当前脚本是否在运行
    
    Keep_Logs(){
    LOGINFO=$1
    LOG_DATE='date "+%Y-%m-%d"'
    LOG_TIME='date "+%H-%M-%S"'
    CDATE=$(date "+%Y-%m-%d")
    CTIME=$(date "+%H-%M-%S")
    echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" 
    echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG}
    }
    
    
    Lock_Shell(){
    touch ${LOCK_FILE}
    Keep_Logs "Info:Create lockfile ${LOCK_FILE}"
    }
    
    
    Unlock_Shell(){
    Keep_Logs "Info:……remove ${LOCK_FILE}"
    rm -f ${LOCK_FILE}
    Keep_Logs "Info:removed ${LOCK_FILE}"
    }
    
    
    #检查web 服务器是否部署成功,如果30分钟还不可以被访问,则认为服务器可能存在问题。
    URL_Test(){
    local node=$1
    local URL="http://$node:8080/login.jsp"
    Keep_Logs "Info:…… URL_Test $URL";
    # curl -s --head $URL | grep "200 OK";
    num=1
    curl -s --head $URL | grep "200 OK";
    while ([ $? != "HTTP/1.1 200 OK" ] && [ "${num}" -lt "181" ]); do
    echo ${num};
    if [ ${num} -eq 180 ]
    then
    echo "启动超时";
    Keep_Logs "ERROR: Time out,failed to start app on ${node} ";
    break;
    fi
    num=$[${num}+1];
    sleep 9s;
    Keep_Logs "Info:$URL is not online,will check about 9 s later";
    curl -s --head $URL | grep "200 OK";
    done
    if [ ${num} -le 180 ]
    then
    Keep_Logs "INFO: succeed start Server ${node} ";
    fi
    }
    
    
    Deploy_Code(){
    local node=$1
    Keep_Logs "Info:Deploy_Code $1"
    # ssh $node "cd /opt/ && tar xfz ${PKG_NAME}.tar.gz"
    ssh ekp@$node "source ~/.bash_profile 
    &&cd /data/EKP_Attachment/ekpcode 
    && unzip ${PKG_NAME}.zip -d /data/ekp/ 
    && rm -f /data/ekp/$PRO_NAME 
    && ln -s /data/ekp/${PKG_NAME} /data/ekp/${PRO_NAME} 
    && killall -9 java 
    && sleep 10s 
    &&cd /data/ekp/linux64/ 
    && ./start-normal64.sh "
    sleep 30s
    echo "sleep 30 s"
    URL_Test ${node};
    }
    
    
    main(){
    
    PKG_NAME=$1
    Keep_Logs "Info:Begin"
    # 锁定判断
    if [ -f ${LOCK_FILE} ];then
    Keep_Logs "WARN:Deploy is running,you can try it later." && exit; 
    else
    Lock_Shell;
    Keep_Logs "INFO:Deploy Server list is:$PRD_LIST";
    for node in $PRD_LIST;do
    Deploy_Code $node;
    done
    fi
    
    Unlock_Shell;
    }
    
    main $1

    三:部署测试验证。

    
    
  • 相关阅读:
    在网页中象GMAIL一样检测客户端是否连接到网络
    How to adjust IFrame height on it's content (转载)
    asp.net工程中aspx文件与codebehind文件的关联问题
    一个在VC中调用web service的方法
    往mssql 表的自增长字段中添加值
    iis7上安装php5+mysql
    试用淘宝开放平台
    关于IOCP的方方面面
    Overlapped I/O
    为什么需要allocator的rebind接口
  • 原文地址:https://www.cnblogs.com/vmsky/p/13722499.html
Copyright © 2020-2023  润新知