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

三:部署测试验证。


原文地址:https://www.cnblogs.com/vmsky/p/13722499.html