diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml index 3a85221..0b40fc8 100644 --- a/.gitea/workflows/docker.yml +++ b/.gitea/workflows/docker.yml @@ -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 }}" - 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 + uses: appleboy/ssh-action@v1.0.3 with: - host: ${{ env.SSH_HOST }} - port: ${{ env.SSH_PORT }} - username: ${{ env.SSH_USER }} - password: ${{ env.SSH_PASSWORD }} + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} script: | - set -e - REG="${{ env.DOCKER_REGISTRY }}" - VERSION="${{ env.VERSION }}" - echo "Deploying admin: $REG/ppanel/ppanel-admin-web:$VERSION" + echo "=== SSH变量调试信息 ===" + echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}" + echo "VERSION: ${{ env.VERSION }}" + echo "NEXT_PUBLIC_API_URL: ${{ env.NEXT_PUBLIC_API_URL }}" + echo "BRANCH: ${{ env.BRANCH }}" - # 拉取新镜像 - 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..." - 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 - - # 启动新容器 - 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 + echo "=== 部署管理面板 ===" + docker pull ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-admin-web:${{ env.VERSION }} + docker stop ppanel-admin-web || true + docker rm ppanel-admin-web || true + 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 "✅ 管理面板部署成功" - - 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 }}" - 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 + uses: appleboy/ssh-action@v1.0.3 with: - host: ${{ env.SSH_HOST }} - port: ${{ env.SSH_PORT }} - username: ${{ env.SSH_USER }} - password: ${{ env.SSH_PASSWORD }} + host: ${{ secrets.HOST }} + username: ${{ secrets.USERNAME }} + key: ${{ secrets.KEY }} + port: ${{ secrets.PORT }} script: | - set -e - REG="${{ env.DOCKER_REGISTRY }}" - VERSION="${{ env.VERSION }}" - echo "Deploying user: $REG/ppanel/ppanel-user-web:$VERSION" + echo "=== SSH变量调试信息 ===" + echo "DOCKER_REGISTRY: ${{ env.DOCKER_REGISTRY }}" + echo "VERSION: ${{ env.VERSION }}" + echo "NEXT_PUBLIC_API_URL: ${{ env.NEXT_PUBLIC_API_URL }}" + echo "BRANCH: ${{ env.BRANCH }}" - # 拉取新镜像 - 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..." - 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 - - # 启动新容器 - 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 + echo "=== 部署用户面板 ===" + docker pull ${{ env.DOCKER_REGISTRY }}/ppanel/ppanel-user-web:${{ env.VERSION }} + docker stop ppanel-user-web || true + docker rm ppanel-user-web || true + 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 "✅ 用户面板部署成功" - - 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="✅ 部署成功! + + 📦 项目: ${{ 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: Notify failure to Telegram - uses: chapvic/telegram-notify@master + - 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"