#!/bin/bash git log # 定义变量 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 # 登录远程服务器并拉取镜像、运行容器 echo "开始登录远程服务器 $REMOTE_SERVER ..." ssh -o StrictHostKeyChecking=no -i "$SSH_PRIVATE_KEY_PATH" "$REMOTE_USER@$REMOTE_SERVER" << 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 # 停止并移除旧的容器(如果存在) 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 else echo "没有找到前缀为 $CONTAINER_PREFIX 的容器。" 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 # 运行新的容器 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 启动失败,请检查日志。" exit 1 fi EOF if [ $? -eq 0 ]; then echo "远程服务器操作完成,应用已成功部署!" else echo "远程服务器操作失败,请检查 SSH 连接和脚本。" exit 1 fi # 发送钉钉通知 send_dingtalk_notification() { local message="$1" local status="$2" curl -X POST "$DINGDING_WEBHOOK" \ -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" "✅ 成功" else FAILURE_MESSAGE="【部署状态】远程服务器操作失败,请检查 SSH 连接和脚本。" echo "$FAILURE_MESSAGE" send_dingtalk_notification "$FAILURE_MESSAGE" "❌ 失败" exit 1 fi