#!/bin/sh # reactive_service.sh # This script for reactive this projects. # @version 170327:3 # @author zhangxuhong # # [config] echo "-[config]-" # ----------------------------[manual config here]------------------------------ REPO_SRC=$1 BUILD_TARGET=$2 DEPLOY_SRC=$3 DEPLOY_LOG_SRC=$4 RELEASE_ENV=$5 # ------------------------------------------------------------------------------ # program system service name for systemctl SERVICE_NAME="${BUILD_TARGET}.service" # final deploy src FINAL_DEPLOY_SRC="${DEPLOY_SRC}/${BUILD_TARGET}" # nginx config NGINX_BIN_LOCATION="/data/apps/nginx/sbin/nginx" NGINX_CONFIG_LOCATION="/data/apps/nginx/conf/vhost/" # deploy target machine error handler config DEPLOY_ERROR_SIGNAL_FILE="${FINAL_DEPLOY_SRC}/logs/deploy_error.s" DEPLOY_SUCCESS_SIGNAL_FILE="${FINAL_DEPLOY_SRC}/logs/deploy_success.s" DEPLOY_LOG="${FINAL_DEPLOY_SRC}/logs/deploy.log" # print config echo -e "\033[34mREPO_SRC set to: ${REPO_SRC}\033[0m" echo -e "\033[34mBUILD_TARGET set to: ${BUILD_TARGET}\033[0m" echo -e "\033[34mPROJECT WILL DEPLOY TO: ${FINAL_DEPLOY_SRC}\033[0m" echo -e "\033[34mSERVICE_NAME set to: ${SERVICE_NAME}\033[0m" echo "" sleep 2 # [check input] if [ "$RELEASE_ENV" == "dev" ]; then echo "env ok"; elif [ "$RELEASE_ENV" == "beta" ]; then echo "env ok"; elif [ "$RELEASE_ENV" == "online" ]; then echo "env ok"; else echo "please input an avaliable deploy environment [dev/beta/online]"; echo "example: ./deploy.sh beta"; exit 1; fi echo -e "\033[34mRELEASE_ENV set to: ${RELEASE_ENV} \033[0m" echo "" sleep 1 # configure log if [ ! -d "${DEPLOY_LOG_SRC}/${BUILD_TARGET}" ]; then mkdir "${DEPLOY_LOG_SRC}/${BUILD_TARGET}"; fi if [ ! -L "${FINAL_DEPLOY_SRC}/logs" ]; then ln -s "${DEPLOY_LOG_SRC}/${BUILD_TARGET}" "${FINAL_DEPLOY_SRC}/logs"; fi # remove old deploy signal if [ -f "${DEPLOY_ERROR_SIGNAL_FILE}" ]; then rm -f "${DEPLOY_ERROR_SIGNAL_FILE}"; fi if [ -f "${DEPLOY_SUCCESS_SIGNAL_FILE}" ]; then rm -f "${DEPLOY_SUCCESS_SIGNAL_FILE}"; fi # deploy start echo "" | tee -a $DEPLOY_LOG; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "deploy start" | tee -a $DEPLOY_LOG; # configure service if [ ! -L "/etc/systemd/system/${SERVICE_NAME}" ]; then cp "${FINAL_DEPLOY_SRC}/config/systemctl/${SERVICE_NAME}" "/etc/systemd/system/${SERVICE_NAME}"; else rm -f "/etc/systemd/system/${SERVICE_NAME}"; cp "${FINAL_DEPLOY_SRC}/config/systemctl/${SERVICE_NAME}" "/etc/systemd/system/${SERVICE_NAME}"; fi # configure nginx PUBLIC_NGINX_CONF="${FINAL_DEPLOY_SRC}/config/nginx/${BUILD_TARGET}.public.conf" PRIVATE_NGINX_CONF="${FINAL_DEPLOY_SRC}/config/nginx/${BUILD_TARGET}.private.conf" if [ -f "${PUBLIC_NGINX_CONF}" ]; then ln -s "${PUBLIC_NGINX_CONF}" $NGINX_CONFIG_LOCATION; fi if [ -f "${PRIVATE_NGINX_CONF}" ]; then ln -s "${PRIVATE_NGINX_CONF}" $NGINX_CONFIG_LOCATION; fi # test nginx config $NGINX_BIN_LOCATION -t 2> "${FINAL_DEPLOY_SRC}/logs/nginx_test.log"; isNginxOk=`grep 'test is successful' "${FINAL_DEPLOY_SRC}/logs/nginx_test.log" | wc -l `; if [ "$isNginxOk" != "1" ]; then touch $DEPLOY_ERROR_SIGNAL_FILE; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "[ERROR!] deploy error with nginx config error, nginx config error is : " | tee -a $DEPLOY_LOG; cat "${FINAL_DEPLOY_SRC}/logs/nginx_test.log" | tee -a $DEPLOY_LOG; exit 1; else echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "nginx config is ok:" | tee -a $DEPLOY_LOG; cat "${FINAL_DEPLOY_SRC}/logs/nginx_test.log" | tee -a $DEPLOY_LOG; fi # stop nginx $NGINX_BIN_LOCATION -s stop # check nginx is stoped sleep 20; nginxNum=`ps auxw | grep --color 'nginx' | grep -v grep | wc -l` if [ "$nginxNum" != "0" ]; then touch $DEPLOY_ERROR_SIGNAL_FILE; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "[ERROR!] deploy error with nginx stop failed, nginx process num is : ${nginxNum}" | tee -a $DEPLOY_LOG; exit 1; else echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "nginx stopped" | tee -a $DEPLOY_LOG; fi # restart service /usr/bin/systemctl daemon-reload; /usr/bin/systemctl enable ${SERVICE_NAME}; /usr/bin/systemctl stop ${BUILD_TARGET}; # use start-stop for first time deploy /usr/bin/systemctl start ${BUILD_TARGET}; # check service sleep 2; /usr/bin/systemctl status "${BUILD_TARGET}" > "${FINAL_DEPLOY_SRC}/logs/service_status.log"; serviceStatus=`grep "Active: active" "${FINAL_DEPLOY_SRC}/logs/service_status.log" | wc -l`; if [ "$serviceStatus" == "0" ]; then touch $DEPLOY_ERROR_SIGNAL_FILE; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "[ERROR!] deploy error with service start failed, systemctl status :" | tee -a $DEPLOY_LOG; cat "${FINAL_DEPLOY_SRC}/logs/service_status.log" | tee -a $DEPLOY_LOG; # restart nginx $NGINX_BIN_LOCATION; # check nginx num nginxNum=`ps auxw | grep --color 'nginx' | grep -v grep | wc -l` sleep 5; if [ "$nginxNum" == "0" ]; then touch $DEPLOY_ERROR_SIGNAL_FILE; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "[ERROR!] deploy error with nginx start failed, nginx process num is : ${nginxNum}" | tee -a $DEPLOY_LOG; exit 1; else echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "nginx started" | tee -a $DEPLOY_LOG; fi exit 1; else echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "service started" | tee -a $DEPLOY_LOG; cat "${FINAL_DEPLOY_SRC}/logs/service_status.log" | tee -a $DEPLOY_LOG; fi # start nginx $NGINX_BIN_LOCATION # check nginx num nginxNum=`ps auxw | grep --color 'nginx' | grep -v grep | wc -l`; sleep 5; if [ "$nginxNum" == "0" ]; then touch $DEPLOY_ERROR_SIGNAL_FILE; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "[ERROR!] deploy error with nginx start failed, nginx process num is : ${nginxNum}" | tee -a $DEPLOY_LOG; exit 1; else echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "nginx started" | tee -a $DEPLOY_LOG; fi # deploy success echo "success" > $DEPLOY_SUCCESS_SIGNAL_FILE; echo -e "`date "+%Y-%m-%d %H:%M:%S"` \c" | tee -a $DEPLOY_LOG; echo "[OK] deploy success." | tee -a $DEPLOY_LOG; exit 0;