| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- #!/bin/bash
- # author: sre.list@songguo7.com
- # 2020.03.17
- #
- # 脚本执行输入参数:
- # 第一个参数:start | stop | restart | deploy
- # 第二个参数对应ENV变量(环境列表): dev | test | perf | prepub | online
- # 脚本执行输出状态码:
- # 0: 成功
- # 非0: 失败
- # 脚本执行输出字符串为devops页面输出内容;
- #
- # 示例:
- # 服务启动运行 bash cicd/deploy.sh deploy $ENV
- # 脚本执行目录为项目部署目录,所有操作不会切换目录
- # 示例 例如iot 部署目录为 /data/apps/iot/
- ACTION=$1
- ENV=$2
- # 自动获项目名
- PROJECT=$(basename $(pwd))
- # ip
- IP=`ip a|grep "10\."|grep inet|grep -v lo:|awk -F"/" '{print $1}'|awk '{print $NF}'`
- # 服务端口号,与sre 确认
- CURRPORT=8008
- # 以下两项可以自定义,最好按照统一的规范
- # 服务健康检查接口
- CHECK_WEBPATH="/${PROJECT}/web_status"
- # 服务健康检查接口返回值
- CHECK_PATTEN="status_ok"
- # 项目部署路径
- DEPLOY_DIR="/data/apps/${PROJECT}"
- # 使用supervisor进程时,脚本生成项目对应的进程管理配置文件
- START_CONFIG=${PROJECT}.ini
- # supervisor控制命令
- SUPERVISOR_BIN="supervisorctl"
- # jar 包及配置文件目录
- DEPLOY_TARGET_DIR='deploy_target'
- # 健康检查url
- HEALTH_URL="http://${IP}:${CURRPORT}${CHECK_WEBPATH}"
- # Java启动命令,此处可以自定义
- cmd_online="/data/apps/${PROJECT}/bin/${PROJECT}-app"
- cmd_prepub=${cmd_online}
- cmd_test=${cmd_online}
- cmd_dev=${cmd_online}
- cmd_perf=${cmd_online}
- # 应用配置源文件名称
- app_source_ini=""
- if [[ "${ENV}#" == "test#" ]] ;then
- cmd=${cmd_test}
- app_source_ini="env.test.ini"
- app_apollo_ini="apollo.test.json"
- fi
- if [[ "${ENV}#" == "dev#" ]] ;then
- cmd=${cmd_dev}
- app_source_ini="env.dev.ini"
- app_apollo_ini="apollo.dev.json"
- fi
- if [[ "${ENV}#" == "perf#" ]] ;then
- cmd=${cmd_perf}
- app_source_ini="env.performance.ini"
- app_apollo_ini="apollo.performance.json"
- fi
- if [[ "${ENV}#" == "prepub#" ]] ;then
- cmd=${cmd_prepub}
- app_source_ini="env.slave.ini"
- app_apollo_ini="apollo.slave.json"
- fi
- if [[ "${ENV}#" == "online#" ]] ;then
- cmd=${cmd_online}
- app_source_ini="env.release.ini"
- app_apollo_ini="apollo.release.json"
- fi
- #############################################################
- # 生成supervisor进程管理配置文件
- function genSupervisorConfig() {
- echo "[program:${PROJECT}]">${START_CONFIG}
- echo "command = ${cmd}">>${START_CONFIG}
- echo "directory = ${DEPLOY_DIR}" >>${START_CONFIG}
- echo "stdout_logfile = ${DEPLOY_DIR}/logs/${PROJECT}.log">>${START_CONFIG}
- echo "redirect_stderr = true">> ${START_CONFIG}
- echo "numprocs = 1" >>${START_CONFIG}
- echo "autorestart = 1">>${START_CONFIG}
- echo "autostart = 1">>${START_CONFIG}
- echo "user = ttyc">>${START_CONFIG}
- echo "startsecs = 5">>${START_CONFIG}
- if [[ ! -L "/etc/supervisord.d/${START_CONFIG}" ]];then
- ln -s "${DEPLOY_DIR}/$START_CONFIG" /etc/supervisord.d/${START_CONFIG}
- fi
- if [[ ! -d "${DEPLOY_DIR}/logs" ]];then
- mkdir "${DEPLOY_DIR}/logs"
- fi
- }
- # supervisor检查服务状态
- function check_status() {
- supervisorctl status ${PROJECT}
- }
- function status() {
- if [[ "$1" -eq 0 ]];then
- echo '状态正常'
- else
- echo '状态异常'
- exit 1
- fi
- }
- # 日志输出
- function echoStageMsg() {
- msg=$1
- echo -e "[stage]: $msg "
- }
- # 健康检查 正常不用返回,异常返回非0
- # 此处可以自定义
- function health_check() {
- echo -e ${HEALTH_URL}
- for in in $(seq 1 1 30) ;do
- code=`curl -s -o /dev/null -w '%{http_code}' -m 2 "${HEALTH_URL}"`
- if [[ ${code} -eq 200 ]] ; then
- echoStageMsg "健康检查 成功"
- break
- else
- sleep 1
- fi
- done
- if [[ ${code} -ne 200 ]]; then
- echoStageMsg "健康检查 失败"
- exit 1
- fi
- }
- function initAppLogFile() {
- ## 创建日志目录
- mkdir -p "/data/log/${PROJECT}"
- chown ttyc:ttyc "/data/log/${PROJECT}" -R
- }
- # 项目启动前初始化,此处可以自定义
- function init() {
- echo "deploy init start"
- initAppLogFile
- genSupervisorConfig
- ## 构建产物通过devops,下载 和 原样解压至项目顶级目录 如下
- ## deploy_target/
- ## cicd/deploy.sh
- ## 如需其他操作请在这里添加
- mkdir -p bin
- cp ${DEPLOY_TARGET_DIR}/${PROJECT}-app ./bin/
- cp -r ${DEPLOY_TARGET_DIR}/config ./
- ## 拷贝对应环境配置文件 为 env.ini
- /bin/cp -f ./config/${app_source_ini} ./config/env.ini
- /bin/cp -f ./config/apollo/${app_apollo_ini} ./config/apollo/apollo.json
- mkdir -p logs
- ## 设置权限
- chown ttyc:ttyc ./ -R
- }
- # 停止服务
- function stop() {
- echo "supervisorctl stop ${PROJECT}"
- supervisorctl stop ${PROJECT}
- supervisorctl reread
- if [[ $? -eq 0 ]] ;then
- supervisorctl update
- fi
- check_status ${PROJECT}|egrep -i "stopped"
- # status $?
- }
- # 启动服务
- function start(){
- supervisorctl reread
- if [[ $? -eq 0 ]] ;then
- supervisorctl update
- fi
- echo "supervisorctl start ${PROJECT}"
- # supervisorctl start $PROJECT
- supervisorctl restart ${PROJECT}
- check_status ${PROJECT}|egrep -i "running"
- status $?
- health_check
- }
- function usage(){
- echo $"Usage: $0 {start|stop|restart|deploy} {ENV}"
- exit 1
- }
- function main() {
- if [[ "${ACTION}" == "" ]]; then
- usage
- fi
- case "${ACTION}" in
- start)
- start
- ;;
- stop)
- stop
- ;;
- restart)
- echo "重启服务"
- stop
- start
- ;;
- deploy)
- echo "部署服务"
- stop
- init
- start
- ;;
- *)
- usage
- ;;
- esac
- }
- main
- # 正常执行结束,成功返回状态:0
- exit 0
|