in1
Some checks failed
CI / build (20.15.1) (push) Failing after 23m4s

This commit is contained in:
shanshanzhong 2025-09-26 05:45:09 -07:00
parent 3df33ae4ce
commit 92e298ee4e

View File

@ -3,9 +3,13 @@ name: CI
on:
push:
branches:
- main
- dev
- cicd
pull_request:
branches:
- main
- dev
- cicd
env:
@ -138,28 +142,28 @@ jobs:
node-modules-${{ runner.os }}-${{ matrix.node }}-
node-modules-${{ runner.os }}-
- name: Cache status check and setup
- name: 缓存状态检查和设置
run: |
echo "=== Cache Status Check ==="
echo "Checking cache restoration status..."
echo "=== 缓存状态检查 ==="
echo "检查缓存恢复状态..."
# 检查各种缓存目录
echo "Bun cache: $([ -d ~/.bun ] && echo '✅ Found' || echo '❌ Missing')"
echo "node_modules: $([ -d node_modules ] && echo '✅ Found' || echo '❌ Missing')"
echo "Turbo cache: $([ -d .turbo ] && echo '✅ Found' || echo '❌ Missing')"
echo "Bun缓存: $([ -d ~/.bun ] && echo '✅ 已发现' || echo '❌ 缺失')"
echo "node_modules: $([ -d node_modules ] && echo '✅ 已发现' || echo '❌ 缺失')"
echo "Turbo缓存: $([ -d .turbo ] && echo '✅ 已发现' || echo '❌ 缺失')"
# 显示缓存大小
if [ -d ~/.bun ]; then
echo "Bun cache size: $(du -sh ~/.bun 2>/dev/null || echo 'unknown')"
echo "Bun缓存大小: $(du -sh ~/.bun 2>/dev/null || echo '未知')"
fi
if [ -d node_modules ]; then
echo "node_modules size: $(du -sh node_modules 2>/dev/null || echo 'unknown')"
echo "node_modules大小: $(du -sh node_modules 2>/dev/null || echo '未知')"
fi
if [ -d .turbo ]; then
echo "Turbo cache size: $(du -sh .turbo 2>/dev/null || echo 'unknown')"
echo "Turbo缓存大小: $(du -sh .turbo 2>/dev/null || echo '未知')"
fi
echo "=== Cache Setup ==="
echo "=== 缓存设置 ==="
# 确保缓存目录存在且权限正确
mkdir -p ~/.bun ~/.cache .turbo
chmod -R 755 ~/.bun ~/.cache .turbo 2>/dev/null || true
@ -168,7 +172,7 @@ jobs:
echo "BUN_INSTALL_CACHE_DIR=$HOME/.cache/bun" >> $GITHUB_ENV
echo "BUN_INSTALL_BIN_DIR=$HOME/.bun/bin" >> $GITHUB_ENV
echo "✅ Cache directories prepared"
echo "✅ 缓存目录已准备完成"
- name: Turborepo cache (.turbo)
uses: https://gitea.cn/actions/cache@v3
@ -178,42 +182,42 @@ jobs:
restore-keys: |
turbo-${{ runner.os }}-
- name: Install dependencies (bun)
- name: 安装依赖 (bun)
run: |
echo "=== Dependency Installation Debug ==="
echo "Current directory: $(pwd)"
echo "Bun version: $(bun --version)"
echo "=== 依赖安装调试信息 ==="
echo "当前目录: $(pwd)"
echo "Bun版本: $(bun --version)"
# 检查node_modules缓存状态
if [ -d "node_modules" ]; then
echo "✅ node_modules cache found"
echo "node_modules size: $(du -sh node_modules 2>/dev/null || echo 'unknown')"
echo "node_modules contents: $(ls -la node_modules | head -10)"
echo "✅ 发现node_modules缓存"
echo "node_modules大小: $(du -sh node_modules 2>/dev/null || echo '未知')"
else
echo "❌ No node_modules cache found"
echo "❌ 未发现node_modules缓存"
fi
# 检查bun.lock文件
if [ -f "bun.lock" ]; then
echo "✅ bun.lock found"
echo "bun.lock hash: $(sha256sum bun.lock)"
echo "✅ 发现bun.lock文件"
else
echo "❌ No bun.lock found"
echo "❌ 未发现bun.lock文件"
fi
echo "=== Starting dependency installation ==="
time bun install --frozen-lockfile
echo "=== 开始安装依赖 ==="
echo "安装开始时间: $(date)"
bun install --frozen-lockfile
echo "安装完成时间: $(date)"
echo "=== Installation completed ==="
echo "Final node_modules size: $(du -sh node_modules 2>/dev/null || echo 'unknown')"
echo "=== 依赖安装完成 ==="
echo "最终node_modules大小: $(du -sh node_modules 2>/dev/null || echo '未知')"
# 验证缓存效果
echo "=== Cache Effectiveness Check ==="
if [ -d "node_modules" ] && [ "$(find node_modules -name '*.js' | wc -l)" -gt 100 ]; then
echo "✅ Dependencies installed successfully"
echo "Package count: $(ls node_modules | wc -l)"
echo "=== 缓存效果验证 ==="
if [ -d "node_modules" ]; then
echo "✅ 依赖安装成功"
echo "包数量: $(ls node_modules | wc -l 2>/dev/null || echo '未知')"
else
echo "⚠️ Dependencies may not be fully installed"
echo "⚠️ 依赖可能未完全安装"
fi
@ -250,6 +254,20 @@ jobs:
- name: Read version from package.json
run: echo "VERSION=$(jq -r .version package.json)" >> $GITHUB_ENV
- name: 根据分支动态设置API地址
run: |
if [ "${{ github.ref_name }}" = "main" ]; then
echo "NEXT_PUBLIC_API_URL=https://api.airoport.co" >> $GITHUB_ENV
echo "为main分支设置生产环境API地址"
elif [ "${{ github.ref_name }}" = "dev" ]; then
echo "NEXT_PUBLIC_API_URL=https://api.kxsw.us" >> $GITHUB_ENV
echo "为dev分支设置开发环境API地址"
else
echo "NEXT_PUBLIC_API_URL=https://api.airoport.co" >> $GITHUB_ENV
echo "为其他分支设置默认API地址"
fi
echo "BRANCH=${{ github.ref_name }}" >> $GITHUB_ENV
- name: Cache Next.js build artifacts (.next/cache)
uses: https://gitea.cn/actions/cache@v3
with:
@ -297,19 +315,19 @@ jobs:
restore-keys: |
typescript-${{ runner.os }}-
- name: Build Admin (turbo via bun)
- name: 构建管理面板
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
run: bun run build --filter=ppanel-admin-web
- name: Build User (turbo via bun)
- name: 构建用户面板
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
run: bun run build --filter=ppanel-user-web
- name: Build Docker (admin)
- name: 构建并推送管理面板Docker镜像
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
run: |
if docker buildx version >/dev/null 2>&1; then
echo "Using Docker Buildx with cache"
echo "使用docker buildx进行优化构建"
docker buildx build \
--platform linux/amd64 \
--cache-from type=registry,ref=${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:cache \
@ -318,16 +336,16 @@ jobs:
-t ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:${{ env.VERSION }} \
--push .
else
echo "Using regular Docker build"
echo "使用常规docker构建"
docker build -f ./docker/ppanel-admin-web/Dockerfile -t ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:${{ env.VERSION }} .
docker push ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:${{ env.VERSION }}
fi
- name: Build Docker (user)
- name: 构建并推送用户面板Docker镜像
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
run: |
if docker buildx version >/dev/null 2>&1; then
echo "Using Docker Buildx with cache"
echo "使用docker buildx进行优化构建"
docker buildx build \
--platform linux/amd64 \
--cache-from type=registry,ref=${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:cache \
@ -336,143 +354,100 @@ jobs:
-t ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }} \
--push .
else
echo "Using regular Docker build"
echo "使用常规docker构建"
docker build -f ./docker/ppanel-user-web/Dockerfile -t ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }} .
docker push ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }}
fi
- name: Debug SSH variables
- name: 部署管理面板到服务器
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
run: |
echo "SSH_HOST: ${{ env.SSH_HOST }}"
echo "SSH_PORT: ${{ env.SSH_PORT }}"
echo "SSH_USER: ${{ env.SSH_USER }}"
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
echo "=== SSH变量调试信息 ==="
echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}"
echo "VERSION: ${{ env.VERSION }}"
if [ -z "${{ env.SSH_HOST }}" ]; then
echo "ERROR: SSH_HOST is empty!"
exit 1
fi
echo "NEXT_PUBLIC_API_URL: ${{ env.NEXT_PUBLIC_API_URL }}"
echo "BRANCH: ${{ env.BRANCH }}"
- name: Deploy Admin via SSH (docker run)
if: env.BUILD_TARGET == 'admin' || env.BUILD_TARGET == 'both'
uses: https://${{ vars.GIT_USERNAME }}:${{ vars.GIT_PASSWORD }}@${{ env.DOMAIN_URL }}/actions/ssh-action@v0.1.10
with:
host: ${{ env.SSH_HOST }}
port: ${{ env.SSH_PORT }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
script: |
set -e
REG="${{ env.DOCKER_REGISTRY }}"
VERSION="${{ env.VERSION }}"
echo "Deploying admin: $REG/ppanel/ppanel-admin-web:$VERSION"
# 拉取新镜像
docker pull "$REG/ppanel/ppanel-admin-web:$VERSION" || true
# 优雅停止并移除容器
if docker ps -q -f name=ppanel-admin-web | grep -q .; then
echo "Stopping existing container..."
echo "=== 部署管理面板 ==="
docker pull ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:${{ env.VERSION }}
docker stop ppanel-admin-web || true
sleep 5
fi
# 移除容器(如果存在)
if docker ps -aq -f name=ppanel-admin-web | grep -q .; then
echo "Removing existing container..."
docker rm ppanel-admin-web || true
fi
docker run -d \
--name ppanel-admin-web \
--restart unless-stopped \
-p 3001:3000 \
-e NEXT_PUBLIC_API_URL=${{ env.NEXT_PUBLIC_API_URL }} \
${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:${{ env.VERSION }}
echo "✅ 管理面板部署成功"
# 启动新容器
echo "Starting new container..."
docker run -d --name ppanel-admin-web --restart=always -p 3000:3000 -e NEXT_PUBLIC_API_URL="https://api.airoport.co" "$REG/ppanel/ppanel-admin-web:$VERSION"
# 验证容器启动
sleep 3
if docker ps -q -f name=ppanel-admin-web | grep -q .; then
echo "Container started successfully"
else
echo "Failed to start container"
exit 1
fi
- name: Debug SSH variables (User)
- name: 部署用户面板到服务器
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
run: |
echo "SSH_HOST: ${{ env.SSH_HOST }}"
echo "SSH_PORT: ${{ env.SSH_PORT }}"
echo "SSH_USER: ${{ env.SSH_USER }}"
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
port: ${{ secrets.PORT }}
script: |
echo "=== SSH变量调试信息 ==="
echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}"
echo "VERSION: ${{ env.VERSION }}"
if [ -z "${{ env.SSH_HOST }}" ]; then
echo "ERROR: SSH_HOST is empty!"
exit 1
fi
echo "NEXT_PUBLIC_API_URL: ${{ env.NEXT_PUBLIC_API_URL }}"
echo "BRANCH: ${{ env.BRANCH }}"
- name: Deploy User via SSH (docker run)
if: env.BUILD_TARGET == 'user' || env.BUILD_TARGET == 'both'
uses: https://${{ vars.GIT_USERNAME }}:${{ vars.GIT_PASSWORD }}@${{ env.DOMAIN_URL }}/actions/ssh-action@v0.1.10
with:
host: ${{ env.SSH_HOST }}
port: ${{ env.SSH_PORT }}
username: ${{ env.SSH_USER }}
password: ${{ env.SSH_PASSWORD }}
script: |
set -e
REG="${{ env.DOCKER_REGISTRY }}"
VERSION="${{ env.VERSION }}"
echo "Deploying user: $REG/ppanel/ppanel-user-web:$VERSION"
# 拉取新镜像
docker pull "$REG/ppanel/ppanel-user-web:$VERSION" || true
# 优雅停止并移除容器
if docker ps -q -f name=ppanel-user-web | grep -q .; then
echo "Stopping existing container..."
echo "=== 部署用户面板 ==="
docker pull ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }}
docker stop ppanel-user-web || true
sleep 5
fi
# 移除容器(如果存在)
if docker ps -aq -f name=ppanel-user-web | grep -q .; then
echo "Removing existing container..."
docker rm ppanel-user-web || true
fi
docker run -d \
--name ppanel-user-web \
--restart unless-stopped \
-p 3002:3000 \
-e NEXT_PUBLIC_API_URL=${{ env.NEXT_PUBLIC_API_URL }} \
${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }}
echo "✅ 用户面板部署成功"
# 启动新容器
echo "Starting new container..."
docker run -d --name ppanel-user-web --restart=always -p 3001:3000 -e NEXT_PUBLIC_API_URL="https://api.airoport.co" "$REG/ppanel/ppanel-user-web:$VERSION"
# 验证容器启动
sleep 3
if docker ps -q -f name=ppanel-user-web | grep -q .; then
echo "Container started successfully"
else
echo "Failed to start container"
exit 1
fi
- name: Notify success to Telegram
uses: chapvic/telegram-notify@master
- name: 发送成功通知到Telegram
if: success()
with:
token: ${{ env.TELEGRAM_BOT_TOKEN }}
chat: ${{ env.TELEGRAM_CHAT_ID }}
status: ${{ job.status }}
title: ✅ 构建成功
message: 构建成功
footer: "触发者: ${{ gitea.actor }}"
run: |
MESSAGE="✅ 部署成功!
- name: Notify failure to Telegram
uses: chapvic/telegram-notify@master
📦 项目: ${{ github.repository }}
🌿 分支: ${{ github.ref_name }}
🔖 版本: ${{ env.VERSION }}
🎯 构建目标: ${{ env.BUILD_TARGET }}
🔗 API地址: ${{ env.NEXT_PUBLIC_API_URL }}
🕐 时间: $(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"
- name: 发送失败通知到Telegram
if: failure()
with:
token: ${{ env.TELEGRAM_BOT_TOKEN }}
chat: ${{ env.TELEGRAM_CHAT_ID }}
status: ${{ job.status }}
title: ❌ 构建失败
message: 构建失败
footer: "触发者: ${{ gitea.actor }}"
run: |
MESSAGE="❌ 部署失败!
📦 项目: ${{ github.repository }}
🌿 分支: ${{ github.ref_name }}
🔖 版本: ${{ env.VERSION }}
🎯 构建目标: ${{ env.BUILD_TARGET }}
🕐 时间: $(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"