更新脚本内容
parent
14bb78897c
commit
36f92f8379
|
|
@ -1,38 +1,6 @@
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
|
||||||
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
|
||||||
RUN echo 'Asia/Shanghai' >/etc/timezone
|
RUN echo 'Asia/Shanghai' >/etc/timezone
|
||||||
WORKDIR /source
|
|
||||||
|
|
||||||
# 设置 Git 凭据为可传递的构建参数
|
|
||||||
ARG GIT_USERNAME
|
|
||||||
ARG GIT_PERSONAL_ACCESS_TOKEN
|
|
||||||
|
|
||||||
# 更新系统和安装 Git 和证书
|
|
||||||
RUN apt-get update && apt-get install -y git
|
|
||||||
|
|
||||||
# 配置 Git 以进行稀疏检出,使用全局设置
|
|
||||||
RUN git config --global core.sparseCheckout true
|
|
||||||
|
|
||||||
# 初始化 Git 仓库
|
|
||||||
RUN git init
|
|
||||||
RUN git remote add origin http://$GIT_USERNAME:$GIT_PERSONAL_ACCESS_TOKEN@nas.jinzejk.com:3000/yly/NewGaoKaoApi.git
|
|
||||||
|
|
||||||
# 启用稀疏检出并指定要拉取的目录
|
|
||||||
#RUN echo "Admin.NET" >> .git/info/sparse-checkout
|
|
||||||
RUN git pull --depth 1 origin develop
|
|
||||||
RUN git checkout develop
|
|
||||||
|
|
||||||
# 打印 Git 状态和日志以验证代码拉取情况
|
|
||||||
RUN git status
|
|
||||||
RUN git log -1
|
|
||||||
|
|
||||||
# 进入项目所在目录并恢复和发布项目
|
|
||||||
WORKDIR /source/new_college.api
|
|
||||||
RUN dotnet restore
|
|
||||||
RUN dotnet publish -c release -o /app --no-restore -f net6.0
|
|
||||||
|
|
||||||
# 运行镜像
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:6.0
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=build /app ./
|
COPY --from=build /app ./
|
||||||
EXPOSE 8081
|
EXPOSE 8081
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,156 @@
|
||||||
|
#!/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
|
||||||
Loading…
Reference in New Issue