公司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
三:部署测试验证。