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