From 36f92f83792b16ba3bff47479174e4a2d463acf4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?old=E6=98=93?= <156663459@qq.com> Date: Tue, 11 Mar 2025 15:02:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=84=9A=E6=9C=AC=E5=86=85?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- New_College.Api/Dockerfile | 32 -------- New_College.Api/jenkins.sh | 156 +++++++++++++++++++++++++++++++++++++ 2 files changed, 156 insertions(+), 32 deletions(-) create mode 100644 New_College.Api/jenkins.sh diff --git a/New_College.Api/Dockerfile b/New_College.Api/Dockerfile index a5a56ca..2aa9f96 100644 --- a/New_College.Api/Dockerfile +++ b/New_College.Api/Dockerfile @@ -1,38 +1,6 @@ FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 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 COPY --from=build /app ./ EXPOSE 8081 diff --git a/New_College.Api/jenkins.sh b/New_College.Api/jenkins.sh new file mode 100644 index 0000000..e13527c --- /dev/null +++ b/New_College.Api/jenkins.sh @@ -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" + + # 鑾峰彇鎵鏈夊尮閰嶅墠缂鐨勫鍣↖D + 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 \ No newline at end of file