name: Release on: push: tags: - 'v*' permissions: contents: write jobs: # ── Phase 1: 依赖准备 ─────────────────── setup: name: Prepare Dependencies runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - uses: actions/cache@v4 id: cache-nodemodules with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-release-v22- - if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci # ── Phase 2: 质量检查 ────────────────── lint: name: Lint runs-on: ubuntu-latest needs: setup steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - run: npm run lint typecheck: name: TypeScript Check runs-on: ubuntu-latest needs: setup steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - run: npx wxt prepare - run: npm run typecheck test: name: Unit Tests runs-on: ubuntu-latest needs: setup steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - run: npx wxt prepare - run: npm run test # ── Phase 3: 打包 ─────────────────────── build-extension: name: Package Extension runs-on: ubuntu-latest needs: [lint, typecheck, test] steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: '22' - uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - name: Build and Zip Extension run: | npm run zip npm run zip:firefox # 🔍 关键调试步骤:确认 zip 文件位置 - name: Verify output files run: | echo "=== .output/ ===" ls -la .output/ 2>/dev/null || echo "Not found" echo "=== All zip files ===" find . -name "*.zip" -type f 2>/dev/null || echo "No zip files" - name: Upload Extension Artifacts uses: actions/upload-artifact@v4 with: name: extension-zips path: | .output/*.zip dist/*.zip *.zip if-no-files-found: error # ← 如果没有文件,直接报错 retention-days: 7 # ── Phase 4: 发布 ─────────────────────── release: name: Create GitHub Release runs-on: ubuntu-latest needs: build-extension steps: - uses: actions/checkout@v4 - name: Download Extension Artifacts uses: actions/download-artifact@v4 with: name: extension-zips path: release-artifacts # 🔍 调试:确认下载成功 - name: Verify downloaded artifacts run: | echo "=== release-artifacts/ ===" ls -la release-artifacts/ - name: Extract version from tag id: version run: echo "version=${GITHUB_REF_NAME#v}" >> "$GITHUB_OUTPUT" - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: name: "v${{ steps.version.outputs.version }}" tag_name: ${{ github.ref_name }} draft: false prerelease: ${{ contains(github.ref_name, '-') }} generate_release_notes: true files: | release-artifacts/*.zip