Compare commits
8 Commits
2ee249f6f7
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 71d768bd9e | |||
| 3b7c8bbcb2 | |||
| ccfd5be59f | |||
| 96aa507f77 | |||
| 95f614a51e | |||
| bd4091524e | |||
| 5b7f778551 | |||
| 38f64f770d |
+140
-59
@@ -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"
|
|
||||||
|
|||||||
Reference in New Issue
Block a user