linux 平台实现 web 服务器的自动化发布 (纯shell 版本,存在ssh 不能自动退出问题,待解决)
转至:https://www.cnblogs.com/vmsky/p/13824172.html
背景说明
1、集团OA系统上线,web App 部署在6台服务器中,因项目初期,每次更新都需要进行大量的部署操作。操作费事费力部署,还容易出错,且缺乏通知机制。针对这一现状,计划通过脚本来实现半自动化的发布工作(因为无法解决自动化打包问题,只能采用半自动化方式了)
一:环境说明
- OS:RHL 7.2
- 中间件: tomcat 7.0
二、开发语言:
- linux Shell
- Python 3.7
三、服务器分布
PRD | APP | vlxcndsz01ekpp1 |
---|---|---|
PRD | APP | vlxcndsz01ekpp2 |
PRD | APP | vlxcndsz01ekpp3 |
PRD | APP | vlxcndsz01ekpp4 |
PRD | APP | vlxcndsz01ekpp5 |
PRD | APP | vlxcndsz01ekpp6 (执行部署脚本)四、环境准备 |
四、思路
1、从其中一台服务器远程到,挨个轮询到对应服务器,调用服务器shell 命令完成应用部署。
五、基础环境准备
1、服务器免登陆配置 参见https://www.cnblogs.com/vmsky/p/13726955.html
2、软件包存放在共享目录
六、linux shell 代码
#!/bin/bash #mkdir /deploy/tmp/EKP #Node List ,存放用用服务器,IP地址用空格分割 PRD_LIST=" 10.196.71.8 10.196.71.13 " #Shell Env,存放于bamboo 服务器vim SHELL_NAME=$0 SHELL_DIR="/data/EKP_Attachment" SHELL_LOG="${SHELL_DIR}/DeployShell/logs/${SHELL_NAME}.log" #Code Env,存放于bamboo 服务器 PRO_NAME="ekp" # CODE_DIR="/deploy/code/${PRO_NAME}" #代码存放路径,每次更新前同步仓库最新的代码 # CONFIG_DIR="/deploy/config/$PRO_NAME" #该目录下的base目录用于存放最基础的代码的配置文件 # TMP_DIR="/deploy/tmp" # TAR_DIR="/deploy/tar/$PRO_NAME" LOCK_FILE="${SHELL_DIR}/DeployShell/tmp/$0.lock" #用于判定当前脚本是否在运行 Keep_Logs(){ LOGINFO=$1 # 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") echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" echo "${CDATE} ${CTIME}: ${SHELL_NAME} : ${LOGINFO}" >> ${SHELL_LOG} } usage(){ Keep_Logs $"Usage: $0 { [deploy | rollback] [DEV |PRD |UAT | MASTER ] [ version ]}" Keep_Logs $"Example: $0 rollback DEV 1.0.0 " } 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 ([ $? -eq 1 ] && [ "${num}" -lt "181" ]); do echo ${num}; if [ ${num} -eq 120 ] then echo "启动超时"; Keep_Logs "ERROR: Time out,failed to start app on ${node} "; break; fi num=$[${num}+1]; sleep 10s; Keep_Logs "Info:$URL is not online,will check about 9 s later"; curl -s --head $URL | grep "200 OK"; done if [ ${num} -le 120 ] 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 -fn 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 >/dev/null 2>&1 \ && sleep 10s \ && cd /data/ekp/linux64/ \ && ./start-normal64.sh >/dev/null 2>&1 &"; echo "sleep 10 秒钟"; sleep 10s; 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 #代码要求授予所有用户读取权限
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?