name: Release on: push: tags: - 'v*' permissions: contents: write jobs: # ── Phase 1: 依赖统一前置基础架构(Infrastructure Stage) ─────────────────── setup: name: Prepare Dependencies runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Cache Node Modules id: cache-nodemodules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-release-v22- - name: Install dependencies if: steps.cache-nodemodules.outputs.cache-hit != 'true' run: npm ci # ── Phase 2: 全量生产级断言检查(秒级瞬时恢复缓存,安全闭环) ────────────────── lint: name: Lint runs-on: ubuntu-latest needs: setup steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Restore Node Modules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - name: Run ESLint run: npm run lint typecheck: name: TypeScript Check runs-on: ubuntu-latest needs: setup steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Restore Node Modules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - name: Generate WXT types run: npx wxt prepare - name: Run TypeScript type check run: npm run typecheck test: name: Unit Tests runs-on: ubuntu-latest needs: setup steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Restore Node Modules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} - name: Generate WXT types run: npx wxt prepare - name: Run tests run: npm run test # ── Phase 3: 多端分布式高精打包(Compile & Upload Artifacts) ─────────────── build-extension: name: Package Extension runs-on: ubuntu-latest needs: [ lint, typecheck, test ] steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' - name: Restore Node Modules uses: actions/cache@v4 with: path: node_modules key: ${{ runner.os }}-release-v22-${{ hashFiles('**/package-lock.json') }} # 执行 WXT 高阶打包压缩指令 - name: Build and Zip Extension run: | npm run zip npm run zip:firefox # 💡 核心自愈补丁:显式将 .output 下打包出的真实生产绝对路径文件, # 稳固地上存至 GitHub 的常驻产物箱中进行安全物理隔离,防范后期发布网络崩溃导致产物蒸发! - name: Upload Chrome Extension uses: actions/upload-artifact@v4 with: name: chrome-extension path: .output/testing-tools-*.zip retention-days: 7 if-no-files-found: error - name: Upload Firefox Extension uses: actions/upload-artifact@v4 with: name: firefox-extension path: .output/testing-tools-*-firefox.zip retention-days: 7 if-no-files-found: error - name: Upload Source Code uses: actions/upload-artifact@v4 with: name: source-code path: .output/testing-tools-*-sources.zip retention-days: 7 if-no-files-found: error # ── Phase 4: 独立中央签发发布(Atomic Release Publisher) ─────────────────── release: name: Create GitHub Release runs-on: ubuntu-latest needs: build-extension steps: - name: Checkout uses: actions/checkout@v4 # 💡 独立下载打包完好的绝对产物包 - name: Download Chrome Extension uses: actions/download-artifact@v4 with: name: chrome-extension path: release-artifacts - name: Download Firefox Extension uses: actions/download-artifact@v4 with: name: firefox-extension path: release-artifacts - name: Download Source Code uses: actions/download-artifact@v4 with: name: source-code path: 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 # 百分之百精准指向被下载下来的、毫无路径污染风险的 Zip 包实体 files: | release-artifacts/*.zip