脚本更新

develop
old易 2025-03-11 15:35:12 +08:00
parent c59c28618c
commit 9feccf65c4
1 changed files with 53 additions and 70 deletions

View File

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