name: Release on: push: tags: - 'v*' permissions: contents: write jobs: # ── Phase 1: 全量 CI 检查 ──────────────────────────────────────────── lint: name: Lint runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' - name: Install dependencies run: npm ci - name: Run ESLint run: npm run lint typecheck: name: TypeScript Check runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' - name: Install dependencies run: npm ci - name: Run TypeScript type check run: npm run compile test: name: Unit Tests runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '22' cache: 'npm' - name: Install dependencies run: npm ci - name: Run tests run: npm run test # ── Phase 2: 打包 & 发布 ───────────────────────────────────────────── release: name: Package & Release 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' cache: 'npm' - name: Install dependencies run: npm ci - name: Package Chrome extension run: npm run zip - name: Package Firefox extension run: npm run zip:firefox - name: Find zip artifacts id: find_zips run: | CHROME_ZIP=$(find .output -name "*.zip" | grep -v firefox | head -1) FIREFOX_ZIP=$(find .output -name "*.zip" | grep firefox | head -1) echo "chrome_zip=$CHROME_ZIP" >> "$GITHUB_OUTPUT" echo "firefox_zip=$FIREFOX_ZIP" >> "$GITHUB_OUTPUT" echo "Found Chrome zip: $CHROME_ZIP" echo "Found Firefox zip: $FIREFOX_ZIP" - 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: | ${{ steps.find_zips.outputs.chrome_zip }} ${{ steps.find_zips.outputs.firefox_zip }}