脚本更新

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
git log
# 定义变量
WORKSPACE_DIR="New_College.Api"
PROJECT_FILE="New_College.Api.csproj"
@ -65,74 +64,60 @@ 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
fi
IMAGE_NAME="\$PRIVATE_REGISTRY/\$REPO_NAME"
# 停止并移除旧的容器(如果存在)
CONTAINER_PREFIX="newgaokaov2"
echo "检查是否存在旧容器: 前缀为 $CONTAINER_PREFIX"
echo "🚀 拉取最新 Docker 镜像: \$IMAGE_NAME:$TAG 和 latest"
sudo docker pull "\$IMAGE_NAME:$TAG"
sudo docker pull "\$IMAGE_NAME:latest"
# 获取所有匹配前缀的容器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
# ✅ 停止并删除所有旧容器
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 "没有找到前缀为 $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"
# ✅ 删除所有旧的 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 "没有找到旧的镜像。"
fi
# 运行新的容器
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 启动成功!"
else
echo "容器 \$CONTAINER_NAME 启动失败,请检查日志。"
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"
if [ \$? -eq 0 ]; then
echo "✅ 部署成功: \$NEW_CONTAINER_NAME"
exit 0
else
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" \
@ -144,13 +129,11 @@ send_dingtalk_notification() {
}"
}
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