diff --git a/New_College.Api/jenkins.sh b/New_College.Api/jenkins.sh index e13527c..615531d 100644 --- a/New_College.Api/jenkins.sh +++ b/New_College.Api/jenkins.sh @@ -1,5 +1,4 @@ #!/bin/bash -git log # 定义变量 WORKSPACE_DIR="New_College.Api" PROJECT_FILE="New_College.Api.csproj" @@ -65,92 +64,76 @@ else exit 1 fi -# 登录远程服务器并拉取镜像、运行容器 -echo "开始登录远程服务器 $REMOTE_SERVER ..." -ssh -o StrictHostKeyChecking=no -i "$SSH_PRIVATE_KEY_PATH" "$REMOTE_USER@$REMOTE_SERVER" << EOF - set -e # 在远程服务器上启用错误中止模式 - echo "远程服务器登录成功!" +# ✅ 远程执行命令,并确保返回正确的 exit 状态码 +ssh -o StrictHostKeyChecking=no -i "$SSH_PRIVATE_KEY_PATH" "$REMOTE_USER@$REMOTE_SERVER" 'bash -s' << EOF + set -e # 遇到错误立即退出 + echo "✅ 远程服务器登录成功!" + PRIVATE_REGISTRY="192.168.104.102:5000" REPO_NAME="newgaokaov2" - TAG="$TAG" - IMAGE_NAME="$PRIVATE_REGISTRY/$REPO_NAME" - echo "内外地址"$IMAGE_NAME - # 拉取最新的 Docker 镜像 - echo "拉取 Docker 镜像: $IMAGE_NAME:$TAG" - sudo docker pull $IMAGE_NAME:$TAG - if [ $? -ne 0 ]; then - echo "拉取 Docker 镜像失败,请检查镜像地址和仓库配置。" - exit 1 + IMAGE_NAME="\$PRIVATE_REGISTRY/\$REPO_NAME" + + echo "🚀 拉取最新 Docker 镜像: \$IMAGE_NAME:$TAG 和 latest" + sudo docker pull "\$IMAGE_NAME:$TAG" + sudo docker pull "\$IMAGE_NAME:latest" + + # ✅ 停止并删除所有旧容器 + echo "🛑 停止并删除所有旧容器" + OLD_CONTAINERS=\$(sudo docker ps -aq -f name="newgaokaov2_container") + if [ "\$OLD_CONTAINERS" ]; then + sudo docker stop \$OLD_CONTAINERS + sudo docker rm \$OLD_CONTAINERS + else + echo "✅ 没有找到旧容器,无需删除" fi - # 停止并移除旧的容器(如果存在) - CONTAINER_PREFIX="newgaokaov2" - echo "检查是否存在旧容器: 前缀为 $CONTAINER_PREFIX" - - # 获取所有匹配前缀的容器ID - CONTAINER_IDS=\$(sudo docker ps -aq -f name="^/\${CONTAINER_PREFIX}") - - if [ "\$CONTAINER_IDS" ]; then - echo "停止并移除旧容器: 前缀为 $CONTAINER_PREFIX" - # 停止所有匹配的容器 - sudo docker stop \$CONTAINER_IDS - # 移除所有匹配的容器 - sudo docker rm \$CONTAINER_IDS + # ✅ 删除所有旧的 Docker 镜像(保留 latest 和当前 $TAG) + echo "🧹 清理旧的 Docker 镜像" + OLD_IMAGES=\$(sudo docker images "\$IMAGE_NAME" --format "{{.ID}}" | tail -n +2) + if [ "\$OLD_IMAGES" ]; then + sudo docker rmi -f \$OLD_IMAGES else - echo "没有找到前缀为 $CONTAINER_PREFIX 的容器。" + echo "✅ 没有找到旧镜像,无需清理" fi - CONTAINER_NAME=\$CONTAINER_PREFIX'_build' - - # 删除旧的镜像(保留最新的) -echo "清理旧的 Docker 镜像" -OLD_IMAGES=\$(sudo docker images "$IMAGE_NAME" --format "{{.ID}}" | tail -n +2) -if [ "\$OLD_IMAGES" ]; then - echo "删除旧镜像: \$OLD_IMAGES" - sudo docker rmi -f \$OLD_IMAGES -else - echo "没有找到旧的镜像。" -fi + # ✅ 启动新容器 + NEW_CONTAINER_NAME="newgaokaov2_container_$TAG" + echo "🚀 启动新容器: \$NEW_CONTAINER_NAME" + sudo docker run --restart=always -d --name "\$NEW_CONTAINER_NAME" -p 8081:8081 "\$IMAGE_NAME:$TAG" - # 运行新的容器 - echo "运行新的容器: \$CONTAINER_NAME" - sudo docker run --restart=always -d --name \$CONTAINER_NAME -p 8081:8081 $IMAGE_NAME:$TAG - if [ $? -eq 0 ]; then - echo "容器 \$CONTAINER_NAME 启动成功!" + if [ \$? -eq 0 ]; then + echo "✅ 部署成功: \$NEW_CONTAINER_NAME" + exit 0 else - echo "容器 \$CONTAINER_NAME 启动失败,请检查日志。" + echo "❌ 部署失败!请检查日志。" exit 1 fi EOF -if [ $? -eq 0 ]; then - echo "远程服务器操作完成,应用已成功部署!" -else - echo "远程服务器操作失败,请检查 SSH 连接和脚本。" - exit 1 -fi -# 发送钉钉通知 +# ✅ 确保 ssh 的退出状态传递到本地 +SSH_EXIT_CODE=$? +echo "SSH 退出码: $SSH_EXIT_CODE" + +# ✅ 发送钉钉通知 send_dingtalk_notification() { - local message="$1" - local status="$2" - + local status="$1" + local message="$2" + curl -X POST "$DINGDING_WEBHOOK" \ - -H "Content-Type: application/json" \ - -d "{ - \"msgtype\": \"text\", - \"text\": { - \"content\": \"【部署状态】$status\n$message\" - } - }" + -H "Content-Type: application/json" \ + -d "{ + \"msgtype\": \"text\", + \"text\": { + \"content\": \"【部署状态】$status\n$message\" + } + }" } -if [ $? -eq 0 ]; then - SUCCESS_MESSAGE="远程服务器操作完成,应用已成功部署!\n镜像地址: $IMAGE_NAME:$TAG" - echo "$SUCCESS_MESSAGE" - send_dingtalk_notification "$SUCCESS_MESSAGE" "✅ 成功" +if [ $SSH_EXIT_CODE -eq 0 ]; then + SUCCESS_MESSAGE="远程服务器操作完成,newgaokaov2应用已成功部署!\n镜像地址: $IMAGE_NAME:$TAG" + send_dingtalk_notification "✅ 成功" "$SUCCESS_MESSAGE" else - FAILURE_MESSAGE="【部署状态】远程服务器操作失败,请检查 SSH 连接和脚本。" - echo "$FAILURE_MESSAGE" - send_dingtalk_notification "$FAILURE_MESSAGE" "❌ 失败" + FAILURE_MESSAGE="【部署状态】newgaokaov2远程服务器操作失败,请检查 SSH 连接和脚本。" + send_dingtalk_notification "❌ 失败" "$FAILURE_MESSAGE" exit 1 fi \ No newline at end of file