162 lines
4.5 KiB
YAML
162 lines
4.5 KiB
YAML
name: CI
|
||
|
||
on:
|
||
push:
|
||
branches:
|
||
- main
|
||
pull_request:
|
||
branches:
|
||
- main
|
||
|
||
concurrency:
|
||
group: ${{ github.workflow }}-${{ github.ref }}
|
||
cancel-in-progress: true
|
||
|
||
jobs:
|
||
# 💡 1. 提速核心:前置基建节点(Infrastructure Initialization)
|
||
# 专门负责锁死环境、同步下载并缓存 node_modules,下游节点直接满血复用!
|
||
setup:
|
||
name: Prepare Dependencies
|
||
runs-on: ubuntu-latest
|
||
outputs:
|
||
cache-key: ${{ steps.cache-info.outputs.key }}
|
||
steps:
|
||
- name: Checkout
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Setup Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '22'
|
||
|
||
# 建立基于 package-lock.json 唯一哈希的缓存大闸
|
||
- name: Cache Node Modules
|
||
id: cache-nodemodules
|
||
uses: actions/cache@v4
|
||
with:
|
||
path: node_modules
|
||
key: ${{ runner.os }}-node-v22-${{ hashFiles('**/package-lock.json') }}
|
||
restore-keys: |
|
||
${{ runner.os }}-node-v22-
|
||
|
||
- name: Install dependencies
|
||
if: steps.cache-nodemodules.outputs.cache-hit != 'true'
|
||
run: npm ci
|
||
|
||
- name: Output Cache Key
|
||
id: cache-info
|
||
run: echo "key=${{ runner.os }}-node-v22-${{ hashFiles('**/package-lock.json') }}" >> $GITHUB_OUTPUT
|
||
|
||
# 💡 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 Instantantly
|
||
uses: actions/cache@v4
|
||
with:
|
||
path: node_modules
|
||
key: ${{ runner.os }}-node-v22-${{ hashFiles('**/package-lock.json') }}
|
||
|
||
- name: Run ESLint
|
||
run: npm run lint
|
||
|
||
# 💡 3. 强类型守卫节点(2秒瞬时恢复,开箱即查)
|
||
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 Instantantly
|
||
uses: actions/cache@v4
|
||
with:
|
||
path: node_modules
|
||
key: ${{ runner.os }}-node-v22-${{ hashFiles('**/package-lock.json') }}
|
||
|
||
- name: Generate WXT types
|
||
run: npx wxt prepare
|
||
|
||
- name: Run TypeScript type check
|
||
run: npm run typecheck
|
||
|
||
# 💡 4. 单元测试节点(无缝运行你刚刚修复完的 setupTests.ts 套件)
|
||
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 Instantantly
|
||
uses: actions/cache@v4
|
||
with:
|
||
path: node_modules
|
||
key: ${{ runner.os }}-node-v22-${{ hashFiles('**/package-lock.json') }}
|
||
|
||
- name: Generate WXT types
|
||
run: npx wxt prepare
|
||
|
||
- name: Run tests
|
||
run: npm run test
|
||
|
||
# 💡 5. 多端分布式最终编译节点(Production Matrix Compliance)
|
||
build:
|
||
name: Build (${{ matrix.browser }})
|
||
runs-on: ubuntu-latest
|
||
# 只有当 Linter、类型大闸、Vitest 单元测试全数满分通过,才放行最终打包编译
|
||
needs: [ lint, typecheck, test ]
|
||
strategy:
|
||
matrix:
|
||
# 💡 完美对齐 WXT 跨端架构:将 firefox 同步纳入生产编译大矩阵,
|
||
# 如果 firefox 编译因任何多端不兼容挂掉,CI 会立刻拉起警报,防护力拉满!
|
||
browser: [ chrome, firefox ]
|
||
fail-fast: false
|
||
steps:
|
||
- name: Checkout
|
||
uses: actions/checkout@v4
|
||
|
||
- name: Setup Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '22'
|
||
|
||
- name: Restore Node Modules Instantantly
|
||
uses: actions/cache@v4
|
||
with:
|
||
path: node_modules
|
||
key: ${{ runner.os }}-node-v22-${{ hashFiles('**/package-lock.json') }}
|
||
|
||
# 💡 动态代理编译指令:完美匹配 WXT / 各类多端打包器的标准构建命令
|
||
- name: Generate WXT types
|
||
run: npx wxt prepare
|
||
|
||
- name: Build Extension (${{ matrix.browser }})
|
||
run: |
|
||
if npm run | grep -q "build:${{ matrix.browser }}"; then
|
||
npm run build:${{ matrix.browser }}
|
||
else
|
||
npm run build -- --browser ${{ matrix.browser }}
|
||
fi |