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: Sync version from tag run: | VERSION="${GITHUB_REF_NAME#v}" echo "Setting version to $VERSION" npm version "$VERSION" --no-git-tag-version - name: Build and Zip Extension run: | npm run zip npm run zip:firefox # 🔍 调试:确认 zip 文件位置 - name: Verify output files run: | echo "=== .output/ contents ===" ls -la .output/ || echo "Not found" echo "=== All zip files ===" find . -name "*.zip" -type f # 💡 关键修复:将 zip 文件复制到固定目录,避免 glob 问题 - name: Prepare release artifacts run: | mkdir -p release-archives cp .output/*.zip release-archives/ 2>/dev/null || true echo "Files in release-archives:" ls -la release-archives/ - name: Upload Extension Artifacts uses: actions/upload-artifact@v4 with: name: extension-zips path: release-archives/ 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