Compare commits

8 Commits

Author SHA1 Message Date
shanshanzhong147 71d768bd9e 更新用户面板界面 [user-only]
CI / build (20.15.1) (push) Successful in 21m27s
2025-09-28 20:31:17 -07:00
shanshanzhong147 3b7c8bbcb2 更新管理面板界面 [admin-only]
CI / build (20.15.1) (push) Has been cancelled
2025-09-28 20:15:38 -07:00
shanshanzhong147 ccfd5be59f tg
CI / build (20.15.1) (push) Has been cancelled
2025-09-28 19:48:57 -07:00
shanshanzhong147 96aa507f77 cicd
CI / build (20.15.1) (push) Failing after 25m32s
2025-09-28 18:06:33 -07:00
shanshanzhong147 95f614a51e x
CI / build (20.15.1) (push) Failing after 28m55s
2025-09-27 10:52:48 -07:00
shanshanzhong147 bd4091524e in1
CI / build (20.15.1) (push) Failing after 24m12s
2025-09-26 18:50:38 -07:00
shanshanzhong147 5b7f778551 in1
CI / build (20.15.1) (push) Successful in 30m33s
2025-09-26 17:33:59 -07:00
shanshanzhong147 38f64f770d in1
CI / build (20.15.1) (push) Failing after 23m2s
2025-09-26 09:48:00 -07:00
+140 -59
View File
@@ -13,7 +13,7 @@ on:
- cicd - cicd
env: env:
DOMAIN_URL: git.kxsw.us #*修改为你12 DOMAIN_URL: git.kxsw.us
REPO: ${{ vars.REPO }} REPO: ${{ vars.REPO }}
TELEGRAM_BOT_TOKEN: 8114337882:AAHkEx03HSu7RxN4IHBJJEnsK9aPPzNLIk0 TELEGRAM_BOT_TOKEN: 8114337882:AAHkEx03HSu7RxN4IHBJJEnsK9aPPzNLIk0
TELEGRAM_CHAT_ID: "-4940243803" TELEGRAM_CHAT_ID: "-4940243803"
@@ -213,9 +213,9 @@ jobs:
continue-on-error: true continue-on-error: true
with: with:
path: .turbo path: .turbo
key: turbo-${{ runner.os }}-${{ hashFiles('turbo.json') }}-${{ hashFiles('apps/**/package.json') }}-${{ hashFiles('packages/**/package.json') }}-${{ hashFiles('bun.lock') }} key: turbo-${{ runner.os }}-${{ hashFiles('turbo.json') }}-${{ hashFiles('apps//package.json') }}-${{ hashFiles('packages//package.json') }}-${{ hashFiles('bun.lock') }}
restore-keys: | restore-keys: |
turbo-${{ runner.os }}-${{ hashFiles('turbo.json') }}-${{ hashFiles('apps/**/package.json') }}-${{ hashFiles('packages/**/package.json') }}- turbo-${{ runner.os }}-${{ hashFiles('turbo.json') }}-${{ hashFiles('apps//package.json') }}-${{ hashFiles('packages//package.json') }}-
turbo-${{ runner.os }}-${{ hashFiles('turbo.json') }}- turbo-${{ runner.os }}-${{ hashFiles('turbo.json') }}-
turbo-${{ runner.os }}- turbo-${{ runner.os }}-
@@ -313,9 +313,9 @@ jobs:
path: | path: |
apps/admin/.next/cache apps/admin/.next/cache
apps/user/.next/cache apps/user/.next/cache
key: nextcache-${{ runner.os }}-${{ hashFiles('apps/**/package.json') }}-${{ hashFiles('packages/**/package.json') }}-${{ hashFiles('turbo.json') }}-${{ hashFiles('bun.lock') }} key: nextcache-${{ runner.os }}-${{ hashFiles('apps//package.json') }}-${{ hashFiles('packages//package.json') }}-${{ hashFiles('turbo.json') }}-${{ hashFiles('bun.lock') }}
restore-keys: | restore-keys: |
nextcache-${{ runner.os }}-${{ hashFiles('apps/**/package.json') }}-${{ hashFiles('packages/**/package.json') }}- nextcache-${{ runner.os }}-${{ hashFiles('apps//package.json') }}-${{ hashFiles('packages//package.json') }}-
nextcache-${{ runner.os }}- nextcache-${{ runner.os }}-
- name: Cache build outputs - name: Cache build outputs
@@ -328,9 +328,9 @@ jobs:
apps/user/.next apps/user/.next
apps/admin/dist apps/admin/dist
apps/user/dist apps/user/dist
key: build-${{ runner.os }}-${{ hashFiles('apps/**/*.ts', 'apps/**/*.tsx', 'apps/**/*.js', 'apps/**/*.jsx') }}-${{ hashFiles('packages/**/*.ts', 'packages/**/*.tsx') }}-${{ hashFiles('bun.lock') }} key: build-${{ runner.os }}-${{ hashFiles('apps//*.ts', 'apps//*.tsx', 'apps//*.js', 'apps//*.jsx') }}-${{ hashFiles('packages//*.ts', 'packages//*.tsx') }}-${{ hashFiles('bun.lock') }}
restore-keys: | restore-keys: |
build-${{ runner.os }}-${{ hashFiles('apps/**/*.ts', 'apps/**/*.tsx', 'apps/**/*.js', 'apps/**/*.jsx') }}- build-${{ runner.os }}-${{ hashFiles('apps//*.ts', 'apps//*.tsx', 'apps//*.js', 'apps//*.jsx') }}-
build-${{ runner.os }}- build-${{ runner.os }}-
- name: Cache ESLint - name: Cache ESLint
@@ -342,7 +342,7 @@ jobs:
.eslintcache .eslintcache
apps/admin/.eslintcache apps/admin/.eslintcache
apps/user/.eslintcache apps/user/.eslintcache
key: eslint-${{ runner.os }}-${{ hashFiles('.eslintrc*', 'apps/**/.eslintrc*', 'packages/**/.eslintrc*') }}-${{ hashFiles('bun.lock') }} key: eslint-${{ runner.os }}-${{ hashFiles('.eslintrc*', 'apps//.eslintrc*', 'packages//.eslintrc*') }}-${{ hashFiles('bun.lock') }}
restore-keys: | restore-keys: |
eslint-${{ runner.os }}- eslint-${{ runner.os }}-
@@ -355,8 +355,8 @@ jobs:
.tsbuildinfo .tsbuildinfo
apps/admin/.tsbuildinfo apps/admin/.tsbuildinfo
apps/user/.tsbuildinfo apps/user/.tsbuildinfo
packages/**/.tsbuildinfo packages//.tsbuildinfo
key: typescript-${{ runner.os }}-${{ hashFiles('tsconfig*.json', 'apps/**/tsconfig*.json', 'packages/**/tsconfig*.json') }}-${{ hashFiles('bun.lock') }} key: typescript-${{ runner.os }}-${{ hashFiles('tsconfig*.json', 'apps//tsconfig*.json', 'packages//tsconfig*.json') }}-${{ hashFiles('bun.lock') }}
restore-keys: | restore-keys: |
typescript-${{ runner.os }}- typescript-${{ runner.os }}-
@@ -404,16 +404,34 @@ jobs:
docker push ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }} docker push ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }}
fi fi
- name: SSH连接预检查
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ env.SSH_HOST }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
port: ${{ env.SSH_PORT }}
timeout: 300s
command_timeout: 600s
debug: true
script: |
echo "=== SSH连接测试 ==="
echo "连接时间: $(date)"
echo "服务器主机名: $(hostname)"
echo "当前用户: $(whoami)"
echo "系统信息: $(uname -a)"
echo "Docker版本: $(docker --version 2>/dev/null || echo 'Docker未安装')"
echo "✅ SSH连接成功"
- name: 部署管理面板到服务器 - name: 部署管理面板到服务器
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both' if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
uses: appleboy/ssh-action@v1.0.3 uses: appleboy/ssh-action@v1.0.3
with: with:
host: ${{ secrets.HOST }} host: ${{ env.SSH_HOST }}
username: ${{ secrets.USERNAME }} username: ${{ env.SSH_USER }}
key: ${{ secrets.KEY }} password: ${{ env.SSH_PASSWORD }}
port: ${{ secrets.PORT }} port: ${{ env.SSH_PORT }}
timeout: 300s timeout: 300s
command_timeout: 600s command_timeout: 600s
script: | script: |
@@ -480,24 +498,53 @@ jobs:
# 安全停止和移除容器 # 安全停止和移除容器
echo "检查现有容器状态..." echo "检查现有容器状态..."
if docker ps -q -f name=ppanel-admin-web | grep -q .; then CONTAINER_NAME="ppanel-admin-web"
# 检查容器是否存在
if docker ps -aq -f name=$CONTAINER_NAME | grep -q .; then
echo "发现现有容器,开始清理..."
# 检查容器是否正在运行
if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then
echo "停止运行中的容器..." echo "停止运行中的容器..."
docker stop ppanel-admin-web --time=10 || true docker stop $CONTAINER_NAME --time=15 || true
sleep 3 sleep 5
fi fi
if docker ps -aq -f name=ppanel-admin-web | grep -q .; then # 检查容器是否正在被移除
echo "移除现有容器..." echo "检查容器移除状态..."
# 等待容器完全停止 for i in {1..15}; do
for i in {1..10}; do # 尝试获取容器状态
if docker rm ppanel-admin-web 2>/dev/null; then CONTAINER_STATUS=$(docker inspect $CONTAINER_NAME --format='{{.State.Status}}' 2>/dev/null || echo "not_found")
echo "容器移除成功"
if [ "$CONTAINER_STATUS" = "not_found" ]; then
echo "✅ 容器已不存在"
break
elif [ "$CONTAINER_STATUS" = "removing" ]; then
echo "⏳ 容器正在移除中,等待完成... $i/15"
sleep 3
else
echo "尝试移除容器... $i/15"
if docker rm -f $CONTAINER_NAME 2>/dev/null; then
echo "✅ 容器移除成功"
break break
else else
echo "等待容器停止... $i/10" echo "⚠️ 容器移除失败,重试..."
sleep 2
fi
fi
# 最后一次尝试强制清理
if [ $i -eq 15 ]; then
echo "🔧 执行强制清理..."
docker kill $CONTAINER_NAME 2>/dev/null || true
sleep 2
docker rm -f $CONTAINER_NAME 2>/dev/null || true
sleep 2 sleep 2
fi fi
done done
else
echo "✅ 未发现现有容器"
fi fi
echo "启动新容器..." echo "启动新容器..."
@@ -529,12 +576,13 @@ jobs:
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both' if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
uses: appleboy/ssh-action@v1.0.3 uses: appleboy/ssh-action@v1.0.3
with: with:
host: ${{ secrets.HOST }} host: ${{ env.SSH_HOST }}
username: ${{ secrets.USERNAME }} username: ${{ env.SSH_USER }}
key: ${{ secrets.KEY }} password: ${{ env.SSH_PASSWORD }}
port: ${{ secrets.PORT }} port: ${{ env.SSH_PORT }}
timeout: 300s timeout: 300s
command_timeout: 600s command_timeout: 600s
debug: true
script: | script: |
echo "=== SSH变量调试信息 ===" echo "=== SSH变量调试信息 ==="
echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}" echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}"
@@ -599,24 +647,53 @@ jobs:
# 安全停止和移除容器 # 安全停止和移除容器
echo "检查现有容器状态..." echo "检查现有容器状态..."
if docker ps -q -f name=ppanel-user-web | grep -q .; then CONTAINER_NAME="ppanel-user-web"
# 检查容器是否存在
if docker ps -aq -f name=$CONTAINER_NAME | grep -q .; then
echo "发现现有容器,开始清理..."
# 检查容器是否正在运行
if docker ps -q -f name=$CONTAINER_NAME | grep -q .; then
echo "停止运行中的容器..." echo "停止运行中的容器..."
docker stop ppanel-user-web --time=10 || true docker stop $CONTAINER_NAME --time=15 || true
sleep 3 sleep 5
fi fi
if docker ps -aq -f name=ppanel-user-web | grep -q .; then # 检查容器是否正在被移除
echo "移除现有容器..." echo "检查容器移除状态..."
# 等待容器完全停止 for i in {1..15}; do
for i in {1..10}; do # 尝试获取容器状态
if docker rm ppanel-user-web 2>/dev/null; then CONTAINER_STATUS=$(docker inspect $CONTAINER_NAME --format='{{.State.Status}}' 2>/dev/null || echo "not_found")
echo "容器移除成功"
if [ "$CONTAINER_STATUS" = "not_found" ]; then
echo "✅ 容器已不存在"
break
elif [ "$CONTAINER_STATUS" = "removing" ]; then
echo "⏳ 容器正在移除中,等待完成... $i/15"
sleep 3
else
echo "尝试移除容器... $i/15"
if docker rm -f $CONTAINER_NAME 2>/dev/null; then
echo "✅ 容器移除成功"
break break
else else
echo "等待容器停止... $i/10" echo "⚠️ 容器移除失败,重试..."
sleep 2
fi
fi
# 最后一次尝试强制清理
if [ $i -eq 15 ]; then
echo "🔧 执行强制清理..."
docker kill $CONTAINER_NAME 2>/dev/null || true
sleep 2
docker rm -f $CONTAINER_NAME 2>/dev/null || true
sleep 2 sleep 2
fi fi
done done
else
echo "✅ 未发现现有容器"
fi fi
echo "启动新容器..." echo "启动新容器..."
@@ -644,39 +721,43 @@ jobs:
docker logs ppanel-user-web || true docker logs ppanel-user-web || true
exit 1 exit 1
- name: 发送成功通知到Telegram # 步骤5: TG通知 (成功)
- name: 📱 发送成功通知到Telegram
if: success() if: success()
run: | uses: appleboy/telegram-action@master
MESSAGE="✅ 部署成功! with:
token: ${{ env.TELEGRAM_BOT_TOKEN }}
to: ${{ env.TELEGRAM_CHAT_ID }}
message: |
✅ 部署成功!
📦 项目: ${{ github.repository }} 📦 项目: ${{ github.repository }}
🌿 分支: ${{ github.ref_name }} 🌿 分支: ${{ github.ref_name }}
🔖 版本: ${{ env.VERSION }} 🔖 版本: ${{ env.VERSION }}
🎯 构建目标: ${{ env.BUILD_TARGET }} 🎯 构建目标: ${{ env.BUILD_TARGET }}
🔗 API地址: ${{ env.NEXT_PUBLIC_API_URL }} 🔗 API地址: ${{ env.NEXT_PUBLIC_API_URL }}
📝 提交: ${{ github.sha }}
👤 提交者: ${{ github.actor }}
🕐 时间: ${{ github.event.head_commit.timestamp }}
🕐 时间: $(date '+%Y-%m-%d %H:%M:%S')" 🚀 服务已成功部署到生产环境
curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \ # 步骤5: TG通知 (失败)
-d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \ - name: 📱 发送失败通知到Telegram
-d text="$MESSAGE" \
-d parse_mode="HTML"
- name: 发送失败通知到Telegram
if: failure() if: failure()
run: | uses: appleboy/telegram-action@master
MESSAGE="❌ 部署失败! with:
token: ${{ env.TELEGRAM_BOT_TOKEN }}
to: ${{ env.TELEGRAM_CHAT_ID }}
message: |
❌ 部署失败!
📦 项目: ${{ github.repository }} 📦 项目: ${{ github.repository }}
🌿 分支: ${{ github.ref_name }} 🌿 分支: ${{ github.ref_name }}
🔖 版本: ${{ env.VERSION }} 🔖 版本: ${{ env.VERSION }}
🎯 构建目标: ${{ env.BUILD_TARGET }} 🎯 构建目标: ${{ env.BUILD_TARGET }}
📝 提交: ${{ github.sha }}
👤 提交者: ${{ github.actor }}
🕐 时间: ${{ github.event.head_commit.timestamp }}
🕐 时间: $(date '+%Y-%m-%d %H:%M:%S') ⚠️ 请检查构建日志获取详细信息
请检查构建日志获取详细信息。"
curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
-d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \
-d text="$MESSAGE" \
-d parse_mode="HTML"