TiFlash 项目开源历程
TiFlash 于 2022-04-01 GMT+8 10:35
愚人节 正式官宣开源。
这是加入 PingCAP(aka 贵司)后首次尝试从提出规划到推进落地项目开源,算是值得纪念的事件 Celebrate open-source (#4551),在此存档相关历程。
前言
TiFlash 项目开源,既是秉承和发扬公司开源精神,也能提振客户信心,扩大影响力。但随之而来的问题也很明显:
- 安全:不同于闭源项目,源码公布之后所有的实现细节均显露无疑,任何漏洞都将暴露在阳光下,安全问题是重中之重。以下几点需特别注意:
- 法务:开源协议选择,CLA 流程(Contributor License Agreements),法律和舆论风险,申请相关专利,软件著作权登记等
- 系统安全:清除牵涉 PingCAP 公司内部的逻辑,规范程序后门(Backdoor)
- 质量保障:面向外部水平参差不齐的开发者,质量保障体系需保障其产出的下限。这方面主要靠自动化的 CI/CD 流程和规章制度,例如:
- 代码质量管控:格式化检查,代码静态分析,UT 覆盖率保障,头文件依赖检查
- 规章制度:PR Reviewer 人数,PR & ISSUE 模板,Release Notes 规范,源文件 License 检查,Proposal 流程,代码工程规范
- 工程架构:TiFlash 作为 C++ 为主导的项目,为了对外部开发者更友好,需要优化工程架构,以简化上手难度。主要考虑以下几点:
- 编译流程优化:工具链切换到 LLVM 并升级,外部预装库 & 依赖环境解耦,优化文档
- 清理历史遗留无效代码
- 开源社区:虽然贵司有诸多开源网红产品,但对于 TiFlash 这类偏专项领域的项目是否有必要做社区?如何吸引外部 Contributor?如何沟通?如何扩大影响力?就看后人的智慧了 Orz…
TiFlash 开源准备事项
进度记录
- 2022-04-01
- [DONE] TiFlash 正式开源
- 2022-03-25
- [DONE] 法务正式提交相关专利,法务方面问题都已解决
- CD 流程优化代码缓存
- [DONE] 开源试运行成功,待正式开源以及 CLA 启用
- 2022-03-18
- [DONE] Repo 改名 tiflash
- [DONE] 重构 CI/CD 流程
- [DONE] License
- License 选择:Apache License 2.0
- 源文件 License 补全
- [DONE] 安全相关
- 源代码清理内网链接及相关脚本
- 目前总体上各事项均已完成,以下需等开源后完成:
- 暂不考虑 DCO 同 TiDB 一致使用 CLA
- CI 开启 required 检查:license-checker、CLA
- 2022-03-11
- [WIP] 重构 CD 流程
- [WIP] Repo 改名
- 2022-03-04
- [DONE] PR reviewer 人数增加到 2
- 改名 tiflash 尚待 v5.3.1 发版结束(预计 2022-03-03)
- 2022-02-25
- [DONE] 代码质量管控、UT质量(目前代码覆盖率为 49.19%)
- [DONE] DCO 开启、编译流程优化并支持 cmake install
- TODO:拆分和重构 CI 流程
- 2022-02-18
- [DONE] 外部预装库 & 依赖环境解耦
- README 补全
- [DONE] tiflash-proxy 侧开启 DCO、CLA
- 2022-02-11
- [DONE] zlib、openssl、curl 环境库依赖解耦
- [DONE] 工具链升级 llvm
- 2022-02-04
- [DONE] tiflash-proxy 相关库解耦,自动化编译流程
- [DONE] 补全 tiflash 架构设计文档
- [DONE] grpc 相关环境库依赖解耦
- ∞
- CI 流程构建实现:静态分析机制、格式化检查机制、编译缓存机制,重构 UT 框架和流程,自动化 UT 覆盖率
- Proposal 流程文档,代码工程规范文档,Release Notes 规范
代码质量管控
PR 级代码静态分析
- CI 流程构建基于 clang-tidy 的静态分析机制
- 统一静态分析检查项配置
- 各个模块修复 clang-tidy 报错
- 开启 PR 级代码静态分析检查(P1)
PR 级代码格式化检查
- 统一格式并开启检查
?头文件分析
- include-what-you-use
UT(单元测试)质量
- 重构 UT 框架和流程,CI 集成自动 UT 覆盖率
- UT 框架重构 & CI 集成
- 各个模块提升 UT 覆盖率至 70%+,目前 x%
- Compute
- Storage
- Common
- Others
- 删除|隔离模块中无效代码
- dbms.src.AggregateFunctions
- dbms.src.Columns
- dbms.src.Common
- dbms.src.Client
- dbms.src.Core
- dbms.src.DataStreams
- dbms.src.DataTypes
- dbms.src.Debug
- dbms.src.Dictionaries
- dbms.src.Flash
- dbms.src.Functions
- dbms.src.IO
- dbms.src.Interpreters
- Interpreters/{Users,SecurityManager,Quota}
- dbms.src.Parsers
- dbms.src.Storages
- dbms.src.Storages.MergeTree
- libs
- libs.libdaemon
- libs.libcommon
- libs.libpocoext
- libs.libconsistent-hashing
- dbms.tests
工程架构
- 代码仓库迁移 & 依赖解耦(P1)
- 重命名为 tiflash
- Github Repo 规范(P1)
- PR reviewer 人数增加到 2,开源前打开
- Developer Certificate 检查
- PR & Issue template
- Bug closed checker
- 流程待开源后开启
- CLA: https://cla-assistant.io
- 开源后开启 required 检查
- 代码源文件 License 补全
- 流程待开源后开启
- 编译流程优化(P1)
- 工具链升级
- Clang 替换 GCC
- 新增 llvm 编译环境相关支持,PR 的 ci 流程更换工具链
- CMake 作为唯一入口,全自动化编译流程
- 对外编译打包相关流程更换工具链
- build tiflash multi branch
- Linux: amd64, arm64
- 外部预装库 & 依赖环境解耦(P1)
- tidb-engine-ext 独立开源维护
- 构建 CI 以及相关 QA 体系
- tidb-engine-ext 侧实现全链路独立测试
- 集成到 cmake 编译流程
- GRPC
- OPEN_SSL
- CURL
- RE2
- 移除 cluster-manager 模块 重构 & 优化 tiflash replica 管理机制
- tidb-engine-ext 独立开源维护
- 规范 Proposal 流程
- RFC 流程
- 文档补全
- 开发规范
- Release Notes 规范
- 代码工程规范
- ?代码模块入门分析文档
- 开发规范
安全(P1)
- License 选择
- 规范 Debug 入口,按编译选项开启|关闭
- 早期版本风险通知
- 源代码清理内网链接及相关脚本
- 开启 first time contributor 检查
社区
- Contributor 和内部的沟通方式(可以参考 TiKV,有 slack,wechat 和一些 social media)
- 创建几个简单 issue 方便 contributor 参与( 可使用 label
good first issue
做检索) - Readme 重新组织,比如加上架构图,重要技术点介绍,致谢等
- ?Logo 设计
- 参考 TiDB,添加 github topic