NewGaoKaoApi/New_College.Api/jenkins.sh

139 lines
4.2 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/bin/bash
# 定义变量
WORKSPACE_DIR="New_College.Api"
PROJECT_FILE="New_College.Api.csproj"
PRIVATE_REGISTRY="192.168.104.102:5000"
NAMESPACE="ycymedu"
REPO_NAME="newgaokaov2"
IMAGE_NAME="$PRIVATE_REGISTRY/$REPO_NAME"
TAG=$(date +%Y%m%d%H%M%S)
REMOTE_SERVER="192.168.104.102"
REMOTE_USER="app"
SSH_PRIVATE_KEY_PATH="/var/opt/YI_LIUYANG" # 从 Jenkins 全局变量中获取
# 钉钉 Webhook URL
DINGDING_WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=fca104958fea6273c9c7ef3f08b3d552645c214f929066785e8caf6e1885a5a6"
# 输出当前工作目录
echo "当前工作目录: $(pwd)"
# 清理之前的发布输出目录
rm -rf "$(pwd)/$WORKSPACE_DIR/out"
# 进入项目目录
cd $WORKSPACE_DIR
echo "当前工作目录: $(pwd)"
# 检查是否成功进入项目目录
if [ $? -ne 0 ]; then
echo "无法进入项目目录 $WORKSPACE_DIR,请检查路径设置。"
exit 1
fi
# 清理之前的构建产物
dotnet clean
# 恢复项目依赖
dotnet restore
echo "当前工作目录2: $(pwd)"
# 发布项目
dotnet publish $PROJECT_FILE -c Release -o out
echo "当前工作目录4: $(pwd)"
cd out
# 构建 Docker 镜像
docker build -t temp_image:latest .
if [ $? -ne 0 ]; then
echo "Docker 镜像构建失败,请检查 Dockerfile 和相关配置。"
exit 1
fi
# 为镜像打标签
docker tag temp_image:latest "$IMAGE_NAME:$TAG"
if [ $? -ne 0 ]; then
echo "Docker 镜像打标签失败,请检查镜像名称和标签。"
exit 1
fi
# 推送 Docker 镜像到私有仓库
docker push "$IMAGE_NAME:$TAG"
if [ $? -eq 0 ]; then
echo "Docker 镜像构建并推送到私有仓库成功!镜像地址: $IMAGE_NAME:$TAG"
else
echo "Docker 镜像构建或推送失败,请检查日志。"
exit 1
fi
# ✅ 远程执行命令,并确保返回正确的 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"
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
# ✅ 删除所有旧的 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
# ✅ 启动新容器
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
# ✅ 确保 ssh 的退出状态传递到本地
SSH_EXIT_CODE=$?
echo "SSH 退出码: $SSH_EXIT_CODE"
# ✅ 发送钉钉通知
send_dingtalk_notification() {
local status="$1"
local message="$2"
curl -X POST "$DINGDING_WEBHOOK" \
-H "Content-Type: application/json" \
-d "{
\"msgtype\": \"text\",
\"text\": {
\"content\": \"【部署状态】$status\n$message\"
}
}"
}
if [ $SSH_EXIT_CODE -eq 0 ]; then
SUCCESS_MESSAGE="远程服务器操作完成newgaokaov2应用已成功部署\n镜像地址: $IMAGE_NAME:$TAG"
send_dingtalk_notification "✅ 成功" "$SUCCESS_MESSAGE"
else
FAILURE_MESSAGE="【部署状态】newgaokaov2远程服务器操作失败请检查 SSH 连接和脚本。"
send_dingtalk_notification "❌ 失败" "$FAILURE_MESSAGE"
exit 1
fi