1. 程式人生 > >shell重新發布(redeploy)服務

shell重新發布(redeploy)服務

開始接觸一些釋出應用的工作內容。簡單的需求是這樣的:

應用服務在新增新功能或者需求之後需要更新到應用伺服器。涉及到工作內容有:

  1. 備份當前的服務jar包到備份路徑下(字尾有時間)
  2. 新的jar包釋出(拷貝)到應用服務的路徑下
  3. 關閉當前服務(kill process)
  4. 重新啟動服務jar服務

思路非常簡單,寫一個shell指令碼,3個param,分別是backpath(備份路徑)、deploypath(釋出路徑)、jarfile(jar包的名稱)。Deploy.sh指令碼如下

[[email protected] tmp]# ./Deploy.sh backpath deploypath demo.jar
#!/bin/bash
<<COMMENT
./Deploy.sh [備份路徑引數_絕對路徑] [部署路徑引數_絕對路徑] [部署包包名]
執行該指令碼之前,預釋出的包需要上傳到備份路徑下
COMMENT

BACKUP_PATH="$1"
DEPLOY_PATH="$2"
PACKAGE="$3"
backup_time=`date "+%Y%m%d%H%M%S"`

#加上--spring.profiles.active是為了避免grep到執行該shell的程序
process_id=`ps -ef | grep "${PACKAGE} --spring.profiles.active" | grep -v "grep" | awk '{print $2}'`

#線上當前包備份
deployed_path=${DEPLOY_PATH}/${PACKAGE}
if [ -f ${deployed_path} ]; then
        echo "mv ${deployed_path} ${BACKUP_PATH}/${PACKAGE}.${backup_time}"
        mv ${deployed_path}] ${BACKUP_PATH}/${PACKAGE}.${backup_time}
else
        echo "${DEPLOY_PATH}下沒有需要備份的包"
fi

#預部署的包釋出到釋出路徑
package_path=${BACKUP_PATH}/${PACKAGE}
if [ -f ${package_path} ]; then
        echo "mv ${BACKUP_PATH}/${PACKAGE} ${DEPLOY_PATH}/"
        mv  ${BACKUP_PATH}/${PACKAGE} ${DEPLOY_PATH}/
        echo ${process_id}
        #重啟服務
        if [ -n ${process_id} ]; then
                echo "kill process ${PACKAGE}"
                kill ${process_id} >/dev/null 2>&1
                sleep 3s
                again=`ps -ef | grep "${PACKAGE} --spring.profiles.active" | grep -v "grep" | awk '{print $2}'`
                if [ -z ${agin} ]; then
                        echo "kill process ${PACKAGE} successed"
                        echo "process ${PACKAGE} restart..."
                        exec nohup java -jar ${DEPLOY_PATH}/${PACKAGE} --spring.profiles.active=prod > ${DEPLOY_PATH}/nohup.out 2>&1 &
                        sleep 10s
                else
                        echo "kill process failed, please contact the administrator"
                fi
        fi
else
        echo "${BACKUP_PATH}下沒有可以釋出的新包"
fi