name: 构建测试 on: push: branches: - main - dev pull_request: branches: - main workflow_dispatch: inputs: debug: description: "启用调试模式" required: false type: boolean default: false env: NODE_VERSION: "24" jobs: # ==================== Windows 构建 ==================== build-Windows: strategy: fail-fast: false matrix: arch: [x64, arm64] runs-on: windows-latest name: 构建 Windows (${{ matrix.arch }}) steps: - name: 检出代码 uses: actions/checkout@v4 - name: 配置 Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: 缓存依赖 uses: actions/cache@v4 id: cache with: path: node_modules key: windows-${{ matrix.arch }}-modules-${{ hashFiles('yarn.lock') }} - name: 安装依赖 if: steps.cache.outputs.cache-hit != 'true' run: yarn install --frozen-lockfile env: npm_config_arch: ${{ matrix.arch }} - name: 调试 - 显示环境信息 if: ${{ inputs.debug }} run: | echo "===== 系统信息 =====" systeminfo | findstr /B /C:"OS" echo "===== Node 版本 =====" node -v echo "===== Yarn 版本 =====" yarn -v echo "===== 目标架构 =====" echo "${{ matrix.arch }}" - name: 构建应用 run: yarn build - name: 调试 - 显示构建产物 if: ${{ inputs.debug }} run: | echo "===== 构建目录内容 =====" dir dist 2>nul || echo "dist 目录不存在" - name: 打包 Windows 安装程序 run: yarn dist:win --${{ matrix.arch }} env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 调试 - 显示打包产物 if: ${{ inputs.debug }} run: | echo "===== 最终产物 =====" dir dist\*.exe - name: 上传构建产物 uses: actions/upload-artifact@v4 with: name: windows-${{ matrix.arch }} path: dist/*.exe retention-days: 7 # ==================== macOS 构建 ==================== build-macOS: strategy: fail-fast: false matrix: include: - arch: arm64 os: macos-latest name: Apple Silicon - arch: x64 os: macos-latest name: Intel runs-on: ${{ matrix.os }} name: 构建 macOS (${{ matrix.name }}) steps: - name: 检出代码 uses: actions/checkout@v4 - name: 配置 Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} - name: 缓存依赖 uses: actions/cache@v4 id: cache with: path: node_modules key: macos-${{ matrix.arch }}-modules-${{ hashFiles('yarn.lock') }} - name: 安装依赖 if: steps.cache.outputs.cache-hit != 'true' run: yarn install --frozen-lockfile - name: 调试 - 显示环境信息 if: ${{ inputs.debug }} run: | echo "===== 系统信息 =====" uname -a echo "===== 系统架构 =====" uname -m echo "===== Node 版本 =====" node -v echo "===== Yarn 版本 =====" yarn -v - name: 调试 - 验证 native 模块架构 if: ${{ inputs.debug }} run: | echo "===== sharp 模块架构 =====" file node_modules/sharp/build/Release/*.node 2>/dev/null || echo "sharp 未安装" echo "===== 其他 native 模块 =====" find node_modules -name "*.node" -exec file {} \; 2>/dev/null | head -20 - name: 构建应用 run: yarn build - name: 调试 - 显示构建产物 if: ${{ inputs.debug }} run: | echo "===== 构建目录内容 =====" ls -la dist/ 2>/dev/null || echo "dist 目录不存在" - name: 打包 macOS 安装程序 run: yarn dist:mac env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 调试 - 显示打包产物 if: ${{ inputs.debug }} run: | echo "===== 最终产物 =====" ls -la dist/*.dmg - name: 上传构建产物 uses: actions/upload-artifact@v4 with: name: macos-${{ matrix.arch }} path: dist/*.dmg retention-days: 7 # ==================== Linux 构建 ==================== build-Linux: runs-on: ubuntu-latest name: 构建 Linux (x64) steps: - name: 检出代码 uses: actions/checkout@v4 - name: 配置 Node.js uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "yarn" - name: 安装依赖 run: yarn install --frozen-lockfile - name: 调试 - 显示环境信息 if: ${{ inputs.debug }} run: | echo "===== 系统信息 =====" uname -a echo "===== 系统架构 =====" uname -m echo "===== Node 版本 =====" node -v echo "===== Yarn 版本 =====" yarn -v - name: 调试 - 验证 native 模块架构 if: ${{ inputs.debug }} run: | echo "===== sharp 模块架构 =====" file node_modules/sharp/build/Release/*.node 2>/dev/null || echo "sharp 未安装" - name: 构建应用 run: yarn build - name: 打包 Linux 安装程序 run: yarn dist:linux env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: 调试 - 显示打包产物 if: ${{ inputs.debug }} run: | echo "===== 最终产物 =====" ls -la dist/*.AppImage - name: 上传构建产物 uses: actions/upload-artifact@v4 with: name: linux-x64 path: dist/*.AppImage retention-days: 7 # ==================== 构建摘要 ==================== summary: needs: [build-Windows, build-macOS, build-Linux] runs-on: ubuntu-latest name: 构建摘要 if: always() steps: - name: 输出构建结果 run: | echo "===== 构建测试完成 =====" echo "Windows x64: ${{ needs.build-Windows.result }}" echo "Windows arm64: ${{ needs.build-Windows.result }}" echo "macOS Apple Silicon: ${{ needs.build-macOS.result }}" echo "macOS Intel: ${{ needs.build-macOS.result }}" echo "Linux x64: ${{ needs.build-Linux.result }}" echo "" echo "构建产物将保留 7 天,可在 Actions 页面下载。"