Files
dukang/deploy/auto-release.sh
T

80 lines
2.3 KiB
Bash

#!/usr/bin/env bash
# 自动发版:git pull + remote-release(由 webhook 或手动触发)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ENV_FILE="$SCRIPT_DIR/auto-release.env"
APP_ROOT="${APP_ROOT:-/opt/dukang-haoke}"
GIT_REMOTE="${GIT_REMOTE:-origin}"
GIT_BRANCH="${GIT_BRANCH:-dev}"
LOCK_FILE="${DEPLOY_LOCK_FILE:-/var/run/dukang-deploy.lock}"
LOG_FILE="${DEPLOY_LOG_FILE:-/var/log/dukang/deploy.log}"
if [[ -f "$ENV_FILE" ]]; then
# shellcheck disable=SC1090
source <(sed 's/\r$//' "$ENV_FILE")
fi
mkdir -p "$(dirname "$LOG_FILE")"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
exec 9>"$LOCK_FILE"
if ! flock -n 9; then
log "SKIP: another deploy is in progress"
exit 0
fi
log "START auto-release (branch=$GIT_BRANCH)"
cd "$APP_ROOT"
if [[ ! -d .git ]]; then
log "ERROR: $APP_ROOT is not a git repository"
exit 1
fi
git fetch "$GIT_REMOTE"
git checkout "$GIT_BRANCH"
LOCAL_SHA="$(git rev-parse HEAD)"
REMOTE_SHA="$(git rev-parse "$GIT_REMOTE/$GIT_BRANCH")"
if [[ "$LOCAL_SHA" == "$REMOTE_SHA" ]]; then
log "SKIP: already up to date ($LOCAL_SHA)"
exit 0
fi
log "PULL $LOCAL_SHA -> $REMOTE_SHA"
# 保留生产密钥,避免 reset 覆盖
ENV_BACKUP="$(mktemp)"
API_ENV_BACKUP="$(mktemp)"
API_ENV_DEV_BACKUP="$(mktemp)"
API_ENV_PROD_BACKUP="$(mktemp)"
cp "$ENV_FILE" "$ENV_BACKUP" 2>/dev/null || true
cp "$APP_ROOT/server/dukang-api/.env" "$API_ENV_BACKUP" 2>/dev/null || true
cp "$APP_ROOT/server/dukang-api/.env.development" "$API_ENV_DEV_BACKUP" 2>/dev/null || true
cp "$APP_ROOT/server/dukang-api/.env.production" "$API_ENV_PROD_BACKUP" 2>/dev/null || true
git checkout "$GIT_BRANCH"
git reset --hard "$GIT_REMOTE/$GIT_BRANCH"
cp "$ENV_BACKUP" "$ENV_FILE" 2>/dev/null || true
cp "$API_ENV_BACKUP" "$APP_ROOT/server/dukang-api/.env" 2>/dev/null || true
cp "$API_ENV_DEV_BACKUP" "$APP_ROOT/server/dukang-api/.env.development" 2>/dev/null || true
cp "$API_ENV_PROD_BACKUP" "$APP_ROOT/server/dukang-api/.env.production" 2>/dev/null || true
rm -f "$ENV_BACKUP" "$API_ENV_BACKUP" "$API_ENV_DEV_BACKUP" "$API_ENV_PROD_BACKUP"
sed -i 's/\r$//' "$ENV_FILE" 2>/dev/null || true
# 修复 Windows 换行
find "$APP_ROOT/deploy" -maxdepth 1 -name '*.sh' -exec sed -i 's/\r$//' {} + 2>/dev/null || true
log "RUN remote-release.sh"
bash "$APP_ROOT/deploy/remote-release.sh"
log "DONE auto-release ($REMOTE_SHA)"