#!/bin/bash
set -e
#######################
# 配置部分
#######################
SRATR_NAME="BackApi"
APP_NAME="backapi"
DEPLOY_DIR="/data/cache/$APP_NAME"
CONFIG_DIR="/data/appsettings/back"
ZIP_FILE="/data/publishfile/BackAPI.zip"
LOG_FILE="/var/log/deploy_${APP_NAME}.log"
LOCK_FILE="/tmp/deploy_${APP_NAME}.lock"
#######################
# 并发保护
#######################
if [ -f "$LOCK_FILE" ]; then
echo "部署已在进行中,请稍后再试" | tee -a $LOG_FILE
exit 1
fi
touch $LOCK_FILE
# 确保删除锁文件
trap 'rm -f "$LOCK_FILE"' EXIT
#######################
# 部署开始
#######################
datetime=$(date +"%Y%m%d%H%M%S")
TARGET_DIR=$DEPLOY_DIR/$datetime
echo "[$(date)] ===== 开始部署 $APP_NAME =====" | tee -a $LOG_FILE
# 1. 停止服务
echo "==> 停止服务 $SRATR_NAME" | tee -a $LOG_FILE
supervisorctl stop $SRATR_NAME
# 2. 创建时间戳目录
mkdir -p $TARGET_DIR
cd $TARGET_DIR
# 3. 拷贝并解压
echo "==> 解压部署包到 $TARGET_DIR" | tee -a $LOG_FILE
cp $ZIP_FILE .
unzip -q BackAPI.zip
rm -f BackAPI.zip
# 4. 确保 publish 目录
if [ ! -d "$TARGET_DIR/publish" ]; then
echo "==> 创建 publish 目录" | tee -a $LOG_FILE
mkdir -p publish
# 移动所有文件到 publish,包含隐藏文件
#shopt -s dotglob
for f in *; do
[ "$f" != "publish" ] && mv "$f" publish/
done
#shopt -u dotglob
fi
# 5. 设置权限
chown -R www:www $TARGET_DIR
# 6. 备份旧版本软链接
if [ -L "$WWW_DIR" ]; then
OLD_LINK=$(readlink -f $WWW_DIR)
echo "==> 备份旧版本软链接: $OLD_LINK" | tee -a $LOG_FILE
fi
# 7. 更新软连接
echo "==> 更新软连接 $WWW_DIR -> $TARGET_DIR/publish" | tee -a $LOG_FILE
ln -sfn $TARGET_DIR/publish $TARGET_DIR/publish
# 8. 拷贝配置文件
echo "==> 拷贝配置文件到新版本" | tee -a $LOG_FILE
cp -f $CONFIG_DIR/appsettings.json $TARGET_DIR/publish
# 9. 启动服务
echo "==> 启动服务 $SRATR_NAME" | tee -a $LOG_FILE
if ! supervisorctl start $SRATR_NAME; then
echo "!!! 启动服务失败,回滚到旧版本" | tee -a $LOG_FILE
if [ -n "$OLD_LINK" ]; then
ln -sfn $OLD_LINK $WWW_DIR
supervisorctl start $SRATR_NAME
echo "回滚完成" | tee -a $LOG_FILE
fi
exit 1
fi
echo "[$(date)] 部署完成,版本号:$datetime" | tee -a $LOG_FILE
echo "====================================" | tee -a $LOG_FILE