#!/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