From 95674fa47a8ebfd77e75f94900cc83f2360b8be0 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Fri, 7 Aug 2026 22:08:37 +0800 Subject: [PATCH] ci(v3): publish frontend from v3 --- .github/workflows/build.yml | 4 ++-- .github/workflows/test.yml | 4 ++-- docs/code-quality.md | 2 +- docs/testing.md | 2 +- package.json | 2 +- scripts/format-changed.mjs | 6 +++--- tests/config/format-changed.spec.ts | 12 ++++++------ tests/config/frontend-workflow.spec.ts | 19 +++++++++++++++---- 8 files changed, 31 insertions(+), 20 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ce5370cc..0fab69cc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,10 +1,10 @@ -name: Build Moviepilot-Frontend v2 +name: Build Moviepilot-Frontend v3 on: workflow_dispatch: push: branches: - - v2 + - v3 paths: - 'package.json' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bdcffe66..070dda62 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -3,10 +3,10 @@ name: Frontend Tests on: pull_request: branches: - - v2 + - v3 push: branches: - - v2 + - v3 permissions: contents: read diff --git a/docs/code-quality.md b/docs/code-quality.md index d2b3e33a..456be918 100644 --- a/docs/code-quality.md +++ b/docs/code-quality.md @@ -105,7 +105,7 @@ Prettier 初始 CI 只检查 Pull Request 新增或修改的受支持文件, 3. 仅把 Prettier 支持且由仓库管理的文件传给 `prettier --check`。 4. 文件集合为空时正常通过。 -本地直接运行 `yarn format` 或 `yarn format:check` 时,脚本按 `refs/remotes/upstream/v2`、`refs/remotes/origin/v2`、`refs/heads/v2` 的顺序选择与当前提交具有共同祖先的基线,并合并当前工作区与未跟踪文件。完整引用可避免同名标签造成歧义;CI 使用显式提交 SHA 保证输入可复现: +本地直接运行 `yarn format` 或 `yarn format:check` 时,脚本按 `refs/remotes/upstream/v3`、`refs/remotes/origin/v3`、`refs/heads/v3` 的顺序选择与当前提交具有共同祖先的基线,并合并当前工作区与未跟踪文件。完整引用可避免同名标签造成歧义;CI 使用显式提交 SHA 保证输入可复现: ```sh yarn format:check --base --head diff --git a/docs/testing.md b/docs/testing.md index c674faf2..7f2a6605 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -92,4 +92,4 @@ yarn lint yarn build ``` -`Frontend Tests` 工作流使用 Node 24 LTS 和 frozen lockfile,在面向 `v2` 的 Pull Request 和推送到 `v2` 时运行。`typecheck-and-coverage` job 依次执行类型检查和覆盖率门禁;独立的 `lint` job 执行全仓只读 ESLint 检查。变更文件格式检查依赖 Pull Request 的 base/head SHA,因此只在 Pull Request 事件运行。Prettier 和 Node 兼容范围按[前端代码质量工具链演进](code-quality.md)继续渐进接入,新增测试代码不得引入新的 lint 或格式问题。 +`Frontend Tests` 工作流使用 Node 24 LTS 和 frozen lockfile,在面向 `v3` 的 Pull Request 和推送到 `v3` 时运行。`typecheck-and-coverage` job 依次执行类型检查和覆盖率门禁;独立的 `lint` job 执行全仓只读 ESLint 检查。变更文件格式检查依赖 Pull Request 的 base/head SHA,因此只在 Pull Request 事件运行。Prettier 和 Node 兼容范围按[前端代码质量工具链演进](code-quality.md)继续渐进接入,新增测试代码不得引入新的 lint 或格式问题。 diff --git a/package.json b/package.json index 8a12bdac..91bc2390 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "moviepilot", - "version": "2.15.5", + "version": "3.0.0", "private": true, "type": "module", "bin": "dist/service.js", diff --git a/scripts/format-changed.mjs b/scripts/format-changed.mjs index 9f94d9c0..5b8b6671 100644 --- a/scripts/format-changed.mjs +++ b/scripts/format-changed.mjs @@ -5,7 +5,7 @@ import process from 'node:process' import { fileURLToPath, pathToFileURL } from 'node:url' import * as prettier from 'prettier' -const DEFAULT_BASE_REFS = ['refs/remotes/upstream/v2', 'refs/remotes/origin/v2', 'refs/heads/v2'] +const DEFAULT_BASE_REFS = ['refs/remotes/upstream/v3', 'refs/remotes/origin/v3', 'refs/heads/v3'] const GIT_OUTPUT_MAX_BUFFER = 64 * 1024 * 1024 const PRETTIER_ARGUMENT_BUDGET = 24_000 const prettierCliPath = fileURLToPath(new URL('../node_modules/prettier/bin/prettier.cjs', import.meta.url)) @@ -47,14 +47,14 @@ function hasMergeBase(cwd, baseCommit, headCommit) { return spawnSync('git', ['merge-base', baseCommit, headCommit], { cwd, stdio: 'ignore' }).status === 0 } -/** 为本地命令选择与当前提交具有共同祖先的 v2 基线。 */ +/** 为本地命令选择与当前提交具有共同祖先的 v3 基线。 */ function resolveDefaultBase(cwd, headCommit) { for (const ref of DEFAULT_BASE_REFS) { const commit = tryResolveCommit(cwd, ref) if (commit && hasMergeBase(cwd, commit, headCommit)) return commit } - throw new Error('无法定位可比较的 v2 基线,请通过 --base 显式指定比较起点。') + throw new Error('无法定位可比较的 v3 基线,请通过 --base 显式指定比较起点。') } /** diff --git a/tests/config/format-changed.spec.ts b/tests/config/format-changed.spec.ts index f7a2dee2..b8d6e6a1 100644 --- a/tests/config/format-changed.spec.ts +++ b/tests/config/format-changed.spec.ts @@ -20,7 +20,7 @@ function write(repository: string, filePath: string, content: string) { function createRepository() { const repository = mkdtempSync(resolve(tmpdir(), 'moviepilot-format-changed-')) temporaryRepositories.push(repository) - git(repository, 'init', '--initial-branch=v2') + git(repository, 'init', '--initial-branch=v3') git(repository, 'config', 'user.name', 'Format Test') git(repository, 'config', 'user.email', 'format-test@example.invalid') write(repository, '.gitignore', 'coverage/\n') @@ -73,7 +73,7 @@ describe('Prettier 变更文件选择器', () => { git(repository, 'add', '-A') git(repository, 'commit', '-m', 'feature') - expect(listSelected(repository, '--base', 'v2', '--head', 'HEAD')).toEqual([ + expect(listSelected(repository, '--base', 'v3', '--head', 'HEAD')).toEqual([ 'src/line\nbreak.ts', 'src/modified.ts', 'src/new file.vue', @@ -137,7 +137,7 @@ describe('Prettier 变更文件选择器', () => { write(repository, 'src/modified.ts', "export const value='feature'\n") git(repository, 'add', 'src/modified.ts') git(repository, 'commit', '-m', 'feature') - git(repository, 'tag', 'v2', 'HEAD') + git(repository, 'tag', 'v3', 'HEAD') expect(listSelected(repository)).toEqual(['src/modified.ts']) }) @@ -154,8 +154,8 @@ describe('Prettier 变更文件选择器', () => { cwd: repository, encoding: 'utf8', }).trim() - git(repository, 'update-ref', 'refs/remotes/upstream/v2', unrelatedCommit) - git(repository, 'update-ref', 'refs/remotes/origin/v2', baseCommit) + git(repository, 'update-ref', 'refs/remotes/upstream/v3', unrelatedCommit) + git(repository, 'update-ref', 'refs/remotes/origin/v3', baseCommit) expect(listSelected(repository)).toEqual(['src/modified.ts']) }) @@ -174,7 +174,7 @@ describe('Prettier 变更文件选择器', () => { git(repository, 'add', '-A') git(repository, 'commit', '-m', 'type changes') - expect(listSelected(repository, '--base', 'v2', '--head', 'HEAD')).toEqual(['src/to-regular.ts']) + expect(listSelected(repository, '--base', 'v3', '--head', 'HEAD')).toEqual(['src/to-regular.ts']) }) it('Git 路径输出超过默认缓冲区时仍能完成选择', () => { diff --git a/tests/config/frontend-workflow.spec.ts b/tests/config/frontend-workflow.spec.ts index bdffae9b..dbd880aa 100644 --- a/tests/config/frontend-workflow.spec.ts +++ b/tests/config/frontend-workflow.spec.ts @@ -3,19 +3,20 @@ import { resolve } from 'node:path' import { describe, expect, it } from 'vitest' const workflowPath = resolve(process.cwd(), '.github/workflows/test.yml') +const releaseWorkflowPath = resolve(process.cwd(), '.github/workflows/build.yml') const testingGuidePath = resolve(process.cwd(), 'docs/testing.md') const codeQualityGuidePath = resolve(process.cwd(), 'docs/code-quality.md') describe('前端测试 workflow', () => { - it('在 PR 与 v2 push 上运行,并将变更文件格式检查限制为 PR', () => { + it('在 PR 与 v3 push 上运行,并将变更文件格式检查限制为 PR', () => { const workflow = readFileSync(workflowPath, 'utf8') const formatJob = workflow.match(/\n {2}format:\n(?[\s\S]*?)(?=\n {2}[\w-]+:\n|$)/)?.groups?.job const qualityJob = workflow.match(/\n {2}typecheck-and-coverage:\n(?[\s\S]*?)(?=\n {2}[\w-]+:\n|$)/)?.groups ?.job expect(workflow).toContain('permissions:\n contents: read') - expect(workflow).toContain('pull_request:\n branches:\n - v2') - expect(workflow).toContain('push:\n branches:\n - v2') + expect(workflow).toContain('pull_request:\n branches:\n - v3') + expect(workflow).toContain('push:\n branches:\n - v3') expect(workflow).toContain('group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}') expect(formatJob).toBeDefined() expect(formatJob).toContain("if: github.event_name == 'pull_request'") @@ -37,10 +38,20 @@ describe('前端测试 workflow', () => { const codeQualityGuide = readFileSync(codeQualityGuidePath, 'utf8') expect(testingGuide).toContain('`typecheck-and-coverage` job') - expect(testingGuide).toContain('推送到 `v2`') + expect(testingGuide).toContain('推送到 `v3`') expect(testingGuide).toContain('只在 Pull Request 事件运行') expect(codeQualityGuide).toContain('lint 与 `typecheck-and-coverage` 使用不同 job') expect(testingGuide).not.toContain('`unit-tests`') expect(codeQualityGuide).not.toContain('`unit-tests`') }) + + it('V3 前端发布只由 v3 分支上的版本变更触发', () => { + const workflow = readFileSync(releaseWorkflowPath, 'utf8') + + expect(workflow).toContain('name: Build Moviepilot-Frontend v3') + expect(workflow).toContain('push:\n branches:\n - v3') + expect(workflow).toContain(" - 'package.json'") + expect(workflow).toContain('echo "frontend_version=v$frontend_version"') + expect(workflow).not.toContain(' - v2') + }) })