Hotdry.
web

tldraw 双仓库测试管理:开源应用测试同步闭源后端的 CI/CD 管道与覆盖率对齐

借鉴 tldraw 项目双仓库测试迁移实践,提供 GitHub Actions 实现的自动化同步、测试执行和覆盖率报告的具体参数与清单。

在开源项目向商业化转型时,如何管理测试套件成为关键挑战。开源前端仓库暴露全面测试容易被竞争者或 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:
    - uses: codecov/codecov-action@v4
      with: { file: ./coverage/lcov.info, flags: tldraw-oss-sync }
    
    阈值规则:branch 覆盖 < main -5% 则 fail。示例 badge:[![Coverage](https://codecov.io/gh/tldraw/tldraw/branch/main/graph/badge.svg)](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%、覆盖趋势。

清单:快速部署步骤

  1. 创建私有仓库 your-org/tldraw-tests-private,迁移测试文件(~327 files)。
  2. OSS workflows:添加 dispatch job,required-status-checks 加 "closed-tests"。
  3. 私有 workflows:监听事件,clone OSS,run tests,post check via gh api checks create
  4. Secrets:CLOSED_REPO_TOKEN (repo deploy key),GH_TOKEN (workflow)。
  5. 覆盖:集成 Codecov,设置 threshold alerts Slack。
  6. 测试:手动 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” 相关讨论。

查看归档