#!/bin/bash # 纳海川官网自动部署脚本 set -e DEPLOY_DIR="/www/wwwroot/www.gynhc.com" LOG_FILE="${DEPLOY_DIR}/runtime/deploy.log" TARGET_BRANCH="${1:-master}" DATE=$(date '+%Y-%m-%d %H:%M:%S') echo "[${DATE}] >>> 开始部署分支: ${TARGET_BRANCH}..." >> "${LOG_FILE}" cd "${DEPLOY_DIR}" # 验证是否为 git 仓库 if [ ! -d ".git" ]; then echo "[${DATE}] 错误: ${DEPLOY_DIR} 尚未初始化为 Git 仓库" >> "${LOG_FILE}" echo "Git repo not initialized" exit 1 fi # 线上单独发布的页面必须先同步到仓库,避免硬重置覆盖已确认的改版。 # 数据库配置由下方单独保护;部署脚本自身允许独立安装此检查。 if ! git diff --quiet HEAD -- . ':(exclude)application/database.php' ':(exclude)deploy.sh'; then echo "[${DATE}] 部署已停止:线上存在尚未同步到仓库的修改,请先核对并同步版本。" >> "${LOG_FILE}" echo "Deploy stopped: live changes must be reconciled before reset." exit 1 fi # 备份关键环境配置 if [ -f "application/database.php" ]; then cp -p application/database.php application/database.php.deploy_bak fi # 忽略文件权限变化 git config core.fileMode false # 拉取最新代码并硬重置 echo "[${DATE}] 执行 git fetch origin ${TARGET_BRANCH}..." >> "${LOG_FILE}" git fetch origin "${TARGET_BRANCH}" >> "${LOG_FILE}" 2>&1 git reset --hard "origin/${TARGET_BRANCH}" >> "${LOG_FILE}" 2>&1 # 还原配置文件保护 if [ -f "application/database.php.deploy_bak" ]; then cp -p application/database.php.deploy_bak application/database.php rm -f application/database.php.deploy_bak fi # 保持目录可写 chmod -R 777 runtime 2>/dev/null || true chmod -R 775 public/uploads 2>/dev/null || true # 平滑重启 PHP-FPM 刷新 OPcache if [ -x "/etc/init.d/php-fpm-73" ]; then if command -v sudo >/dev/null 2>&1; then sudo -n /etc/init.d/php-fpm-73 reload >> "${LOG_FILE}" 2>&1 || true else /etc/init.d/php-fpm-73 reload >> "${LOG_FILE}" 2>&1 || true fi fi COMMIT_INFO=$(git log -1 --pretty=format:"%h - %s (%an, %cd)") echo "[${DATE}] 当前最新版本: ${COMMIT_INFO}" >> "${LOG_FILE}" echo "[${DATE}] >>> 部署成功" >> "${LOG_FILE}" echo "Deploy success: ${COMMIT_INFO}"