ee0408a944
The release workflow was always building with the hardcoded version from package.json (1.0.0), causing Chrome Web Store to reject uploads because 1.0.0 equals the already-published 1.0 (trailing zeros ignored). Added a step to extract the version from the git tag and update package.json before the build, so the zip contains the correct version.
163 lines
4.6 KiB
YAML
163 lines
4.6 KiB
YAML
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
|