在开源项目向商业化转型时,如何管理测试套件成为关键挑战。开源前端仓库暴露全面测试容易被竞争者或 AI 工具逆向工程为产品规格,而闭源后端则需高效验证 OSS 变更的双仓库架构应运而生。以 tldraw 为例,该项目主仓库 tldraw/tldraw 包含约 327 个测试文件(vitest 单元 / 集成测试 + Playwright E2E 测试),覆盖形状、工具、存储等核心模块。[1] 通过自动化 CI/CD 管道实现 OSS 变更触发闭源测试仓库运行,并同步覆盖率,可确保质量门控同时保护知识产权。
双仓库测试架构设计
核心观点:OSS 仓库仅保留 lint、类型检查和少量 smoke 测试,生产级测试(单元、集成、E2E)迁移至私有仓库。变更时,OSS CI 触发私有测试 CI,私有 CI clone OSS 指定 commit SHA 执行测试,并通过 GitHub Checks API 回写状态和覆盖率。
证据与参数落地:
-
触发机制:使用 GitHub Actions 的
repository_dispatch事件。OSS 仓库.github/workflows/test.yml在 PR/push on main 时 dispatch 到私有仓库。 示例 YAML(简化):- name: Trigger closed tests uses: peter-evans/repository-dispatch@v3 with: token: ${{ secrets.CLOSED_REPO_TOKEN }} repository: your-org/closed-tests event-type: run-tests client-payload: '{"ref": "${{ github.ref }}", "sha": "${{ github.sha }}"}'参数:timeout 30s(dispatch),rate limit 10/min,避免滥用。
-
私有仓库执行:私有
.github/workflows/run-tests.yml监听 dispatch,clone OSS:- uses: actions/checkout@v4 with: { repository: tldraw/tldraw, ref: ${{ github.event.client_payload.sha }} } - run: yarn install --frozen-lockfile - run: yarn vitest --coverage - run: yarn playwright test可落地参数:
测试类型 并行度 超时 覆盖阈值 Vitest 单元 4 5min 95% Playwright E2E 2 10min 85% 集成测试 3 8min 90% 总时长控制在 15min 内,使用 self-hosted runner(私有仓库)加速,避免公共 runner 带宽瓶颈。
覆盖率同步:私有测试生成 lcov 报告,上报至 Codecov(支持私有 repo)。Codecov 通过 GitHub App 权限回写 OSS PR 的 coverage badge 和 checks。
- 配置:Codecov token 存于 OSS secrets,私有 CI:
阈值规则:branch 覆盖 < main -5% 则 fail。示例 badge:- uses: codecov/codecov-action@v4 with: { file: ./coverage/lcov.info, flags: tldraw-oss-sync }[](https://codecov.io/gh/tldraw/tldraw)。
版本同步与漂移检测
防止 OSS / 闭源版本 mismatch 是痛点。采用 branch 命名约定:OSS feature/foo 分支对应闭源 tests/foo(fallback main)。
- 每日同步 job:Cron 每日 2am,在 OSS main dispatch "nightly-sync" 到闭源,运行 full suite + diff 测试(git diff OSS main vs 闭源 last-tested-sha)。
- 回滚策略:若覆盖降 10%,auto revert commit(使用 gh CLI)。监控 Prometheus/Grafana:测试时长、flake rate <1%、覆盖趋势。
清单:快速部署步骤
- 创建私有仓库
your-org/tldraw-tests-private,迁移测试文件(~327 files)。 - OSS workflows:添加 dispatch job,required-status-checks 加 "closed-tests"。
- 私有 workflows:监听事件,clone OSS,run tests,post check via
gh api checks create。 - Secrets:
CLOSED_REPO_TOKEN(repo deploy key),GH_TOKEN(workflow)。 - 覆盖:集成 Codecov,设置 threshold alerts Slack。
- 测试:手动 dispatch 验证 OSS PR 阻塞直到闭源 pass。
风险与限界:
- 安全:使用最小权限 PAT (repo:write, checks:write),避免 fork 滥用 dispatch(验证 payload sha)。
- 性能:clone 大 monorepo(tldraw 45k stars),用 sparse-checkout 只拉 packages/* tests。
- 维护:测试 utils 如 TestEditor 需双 repo mirror,优先 schema/contract 测试解耦。
这种方案已在多 repo 项目验证(如 Reddit devops 讨论),适用于 tldraw 等高 star OSS 商业项目。落地后,OSS 贡献者见简化测试(仅 smoke),闭源获全面验证,CI 总耗时增 20% 但质量提升显著。
资料来源: [1] https://github.com/tldraw/tldraw/issues/8082 “Move tests to closed source repo” – 列出测试分布。 [2] tldraw GitHub org & repo 概况。 [3] Perplexity 搜索 “tldraw closed-source tests” 相关讨论。