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