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: Run TypeScript type check run: npm run compile 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: 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 Extension Artifacts uses: actions/upload-artifact@v4 with: name: extension-zips path: | .output/*.zip retention-days: 7 # ── 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 Extension Artifacts uses: actions/download-artifact@v4 with: name: extension-zips 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