#!/bin/bash # 部署脚本:当Gitea仓库有更新时,一键部署新代码到云服务器 # 配置参数 GITEA_USER="SwtTt29" GITEA_PASSWORD="qazswt123" REPO_URL="http://${GITEA_USER}:${GITEA_PASSWORD}@8.137.125.67:4000/SwtTt29/Review.git" APP_DIR="/app" DOCKER_COMPOSE_FILE="docker-compose.yml" BRANCH="sh" IMAGE_NAME="reject-app" # 改为与docker-compose.yml中一致的镜像名称 CONTAINER_NAME="reject-app" # 输出日志函数 log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" } # 关闭错误立即停止,改用手动错误检查 source /etc/profile log "开始部署应用..." # 确保脚本具有执行权限 chmod +x "$0" # 1. 检查应用目录是否存在 if [ ! -d "$APP_DIR" ]; then log "应用目录不存在,开始克隆仓库..." git clone "$REPO_URL" "$APP_DIR" if [ $? -ne 0 ]; then log "错误:克隆仓库失败!请检查网络连接和仓库地址。" exit 1 fi cd "$APP_DIR" git checkout "$BRANCH" if [ $? -ne 0 ]; then log "错误:切换分支失败!请检查分支名称是否正确。" exit 1 fi else log "应用目录已存在,开始拉取最新代码..." cd "$APP_DIR" # 处理分支冲突问题 if ! git pull origin "$BRANCH" --ff-only; then log "快进合并失败,尝试先重置本地分支再拉取..." git fetch origin git reset --hard origin/"$BRANCH" if [ $? -ne 0 ]; then log "错误:重置本地分支失败!" exit 1 fi fi fi # 2. 检查docker-compose.yml文件是否存在 if [ ! -f "$DOCKER_COMPOSE_FILE" ]; then log "错误:$DOCKER_COMPOSE_FILE 文件不存在!" exit 1 fi # 3. 停止并删除旧的Docker容器 log "停止并删除旧的Docker容器..." docker-compose -f "$DOCKER_COMPOSE_FILE" down if [ $? -ne 0 ]; then log "警告:docker-compose down失败,尝试直接删除容器..." fi # 强制删除可能残留的容器 if docker ps -a | grep -q "$CONTAINER_NAME"; then log "强制删除残留的容器 $CONTAINER_NAME..." docker rm -f "$CONTAINER_NAME" if [ $? -ne 0 ]; then log "错误:强制删除容器失败!" exit 1 fi fi # 4. 直接使用docker build命令构建镜像,绕过docker-compose的buildx依赖 log "重新构建Docker镜像..." docker build -t "$IMAGE_NAME" . if [ $? -ne 0 ]; then log "错误:构建镜像失败!请检查Dockerfile和依赖。" exit 1 fi # 5. 启动新的Docker容器(不使用build参数) log "启动新的Docker容器..." # 使用--no-build参数避免docker-compose尝试重新构建 docker-compose -f "$DOCKER_COMPOSE_FILE" up -d --no-build if [ $? -ne 0 ]; then log "错误:启动容器失败!请检查配置文件。" exit 1 fi # 6. 验证容器是否正常启动 log "验证容器运行状态..." sleep 10 if docker-compose -f "$DOCKER_COMPOSE_FILE" ps | grep -q "Up"; then log "容器启动成功!" else log "警告:容器可能未正常启动,正在检查日志..." docker-compose -f "$DOCKER_COMPOSE_FILE" logs | tail -50 fi # 7. 清理无用的Docker镜像 log "清理无用的Docker镜像..." docker image prune -f log "应用部署完成!"