name: 测试构建 permissions: contents: read on: push: branches: [main, develop] paths-ignore: - "**.md" - "docs/**" - "LICENSE" - ".gitignore" - ".editorconfig" - "images/**" - "screenshots/**" - ".vscode/**" pull_request: branches: [main] paths-ignore: - "**.md" - "docs/**" - "LICENSE" - ".gitignore" - ".editorconfig" - "images/**" - "screenshots/**" - ".vscode/**" workflow_dispatch: jobs: test-build: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v6 - name: 设置 Python uses: actions/setup-python@v6 with: python-version: "3.11" - name: 设置 Node.js uses: actions/setup-node@v6 with: node-version: "18" - name: 安装 Node.js 依赖 run: npm ci - name: 验证 manifest 文件 run: | echo "验证 Chrome manifest..." node -e " const manifest = JSON.parse(require('fs').readFileSync('manifest.json', 'utf8')); console.log('Chrome manifest 版本:', manifest.version); console.log('Manifest 版本:', manifest.manifest_version); if (manifest.manifest_version !== 3) { throw new Error('Chrome manifest 应该使用 Manifest V3'); } " echo "验证 Firefox manifest..." node -e " const manifest = JSON.parse(require('fs').readFileSync('manifest-firefox.json', 'utf8')); console.log('Firefox manifest 版本:', manifest.version); console.log('Manifest 版本:', manifest.manifest_version); if (manifest.manifest_version !== 2) { throw new Error('Firefox manifest 应该使用 Manifest V2'); } " - name: 检查必需文件 run: | echo "检查必需文件是否存在..." required_files=( "manifest.json" "manifest-firefox.json" "src/background/index.js" "src/content/index.js" "src/popup/popup.js" "src/popup/index.html" "src/shared/download-core.js" "src/userscript/index.js" "src/shared/compat/webext-compat.js" "src/shared/compat/firefox-compat.js" "src/shared/platform-detector.js" "src/shared/platforms.js" "build.py" "dev.py" ) for file in "${required_files[@]}"; do if [ -f "$file" ]; then echo "[OK] $file" else echo "[FAIL] $file 缺失" exit 1 fi done - name: 运行基础测试 run: | echo "运行基础测试..." python dev.py test npm run test:unit - name: 运行代码检查 run: | echo "运行代码检查..." python dev.py lint - name: 测试 Chrome 构建 run: | echo "测试 Chrome 构建..." python build.py --platform chrome # 验证构建结果 if [ -d "build/chrome" ]; then echo "[OK] Chrome 构建目录已创建" ls -la build/chrome/ else echo "[FAIL] Chrome 构建失败" exit 1 fi - name: 测试 Firefox 构建 run: | echo "测试 Firefox 构建..." python build.py --platform firefox # 验证构建结果 if [ -d "build/firefox" ]; then echo "[OK] Firefox 构建目录已创建" ls -la build/firefox/ else echo "[FAIL] Firefox 构建失败" exit 1 fi - name: 测试 userscript 构建 run: | echo "测试 userscript 构建..." python build.py --platform userscript if [ -f "build/userscript/xget-now.user.js" ]; then echo "[OK] userscript 构建文件已生成" ls -la build/userscript/ else echo "[FAIL] userscript 构建失败" exit 1 fi - name: 测试扩展包生成 run: | echo "测试扩展包生成..." python build.py --platform all --package VERSION=$(node -p 'require("./package.json").version') # 验证扩展包 if [ -d "packages" ]; then echo "[OK] 扩展包目录已创建" ls -la packages/ # 检查是否有 Chrome、Firefox 和 userscript 包 if [ -f "packages/Xget-Now_${VERSION}.chromium.zip" ]; then echo "[OK] Chrome 扩展包已生成" else echo "[FAIL] Chrome 扩展包生成失败" exit 1 fi if [ -f "packages/Xget-Now_${VERSION}.firefox.xpi" ]; then echo "[OK] Firefox 扩展包已生成" else echo "[FAIL] Firefox 扩展包生成失败" exit 1 fi if [ -f "packages/Xget-Now_${VERSION}.userscript.user.js" ]; then echo "[OK] userscript 包已生成" else echo "[FAIL] userscript 包生成失败" exit 1 fi else echo "[FAIL] 扩展包生成失败" exit 1 fi - name: 验证构建的 manifest 文件 run: | echo "验证构建的 manifest 文件..." # 检查 Chrome 构建的 manifest echo "检查 Chrome manifest..." node -e " const manifest = JSON.parse(require('fs').readFileSync('build/chrome/manifest.json', 'utf8')); console.log('Chrome 构建版本:', manifest.version); if (manifest.manifest_version !== 3) { throw new Error('Chrome 构建应该使用 Manifest V3'); } if (!manifest.action) { throw new Error('Chrome 构建应该有 action 字段'); } " # 检查 Firefox 构建的 manifest echo "检查 Firefox manifest..." node -e " const manifest = JSON.parse(require('fs').readFileSync('build/firefox/manifest.json', 'utf8')); console.log('Firefox 构建版本:', manifest.version); if (manifest.manifest_version !== 2) { throw new Error('Firefox 构建应该使用 Manifest V2'); } if (!manifest.browser_action) { throw new Error('Firefox 构建应该有 browser_action 字段'); } if (!manifest.applications && !manifest.browser_specific_settings) { throw new Error('Firefox 构建应该有 applications 或 browser_specific_settings 字段'); } " echo "检查 userscript 构建..." node -e " const fs = require('fs'); const userscript = fs.readFileSync('build/userscript/xget-now.user.js', 'utf8'); if (!userscript.includes('@grant GM_xmlhttpRequest')) { throw new Error('userscript 构建缺少 GM_xmlhttpRequest grant'); } if (!userscript.includes('@run-at document-start')) { throw new Error('userscript 构建缺少 document-start 配置'); } console.log('Userscript 元数据验证通过'); " - name: 上传构建结果 uses: actions/upload-artifact@v7 with: name: extension-builds-${{ github.sha }} path: | build/ packages/ retention-days: 7 - name: 测试总结 run: | echo "" echo "所有测试通过" echo "================================" echo "[OK] Manifest 文件验证" echo "[OK] 必需文件检查" echo "[OK] 基础测试" echo "[OK] 代码检查" echo "[OK] Chrome 构建" echo "[OK] Firefox 构建" echo "[OK] userscript 构建" echo "[OK] 扩展包生成" echo "[OK] 构建结果验证" echo "================================" echo "准备发布"