十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Apache Thrift 提交者(Committer)补丁审查与提交流程指南:从 Jira 到 master 的九步实战

Apache Thrift 提交者(Committer)补丁审查与提交流程指南:从 Jira 到 master 的九步实战 Apache Thrift 提交者Committer补丁审查与提交流程指南从 Jira 到 master 的九步实战【免费下载链接】thriftApache Thrift项目地址: https://gitcode.com/gh_mirrors/thrift2/thriftApache Thrift 是一个跨语言的高性能 RPC 框架其代码库横跨编译器和二十余种语言的运行时库任何一处改动都可能影响多个组件。因此项目对谁能提交、如何提交有一套严格且可复用的工作流。本文以仓库 doc/committers.md 为核心完整讲解提交者在将补丁合入 master 前必须经历的九个步骤并结合 CONTRIBUTING.md、test/README.md、Makefile.am 等仓库内文档与脚本深入剖析每一步背后的测试设施与工程规范。读完本文你将掌握 Apache Thrift 从 Jira 建单、应用补丁、跨语言测试到规范提交推送的完整链路也能理解贡献者Contributor与提交者Committer在流程中的协作边界。一、Committer 工作流全景九步流程总览doc/committers.md 将提交者审查并提交补丁的流程归纳为九个步骤核心目标只有一个保证合入 master 的每一笔提交都经过问题追踪、法律合规、自动化测试与信息规范四重校验。步骤动作关键命令/产物1确认补丁在 Jira 中有对应 issueTHRIFT-####票据2检出最新源码git clone/git pull3应用补丁curl ... \| git apply --ignore-space-change4法律合规检查Apache 贡献提交条款5运行单元测试与跨语言测试make check/make cross6提交补丁git config、git add -A、git commit7按规范书写提交信息THRIFT-####: Jira description格式8复查并推送git status、git show HEAD、git push origin master9解决 Jira issue 并设置 changelog 字段Component、fixVersion这条流程既是提交者的操作手册也是贡献者理解我的补丁被合入后经历了什么的窗口。下面逐一展开。二、第 1~2 步问题追踪与源码准备1. 确认 Jira 票据存在流程的第一步不是写代码而是确认问题被追踪。提交者在提交任何补丁之前必须确保 Jira issue tracker 中存在对应的THRIFT票据。这与 CONTRIBUTING.md 中对贡献者的要求完全一致所有重大变更都需要 Apache Jira THRIFT 票据仅修复拼写错误或编译器警告等琐碎变更除外。Jira 票据编号THRIFT-####不仅用于追踪它还会成为最终提交信息的第一要素见第六节并串联起 changelogCHANGES.md 中每一条记录都以 THRIFT 编号为锚点例如THRIFT-5744 - Switch to slog for go library。2. 检出最新版本源码提交前必须基于最新 master 工作避免在过时代码上应用补丁git clone https://gitcode.com/gh_mirrors/thrift2/thrift thrift如果本地已有克隆则先拉取最新改动git fetch origin git checkout master git pull origin master从仓库根目录的 .github 目录可以看到项目还通过 GitHub Actions 工作流.github/workflows/cmake.yml、.github/workflows/pypi.yml以及 Dependabot.github/dependabot.yml维护持续集成与依赖更新提交前保持本地与上游同步是避免合并冲突的基础。三、第 3~4 步应用补丁与法律合规检查3. 应用补丁两种来源、一条命令补丁通常来自两个渠道Jira 票据附件或 GitHub 上的某次提交。提交者统一通过管道方式应用补丁并加上--ignore-space-change忽略空白差异降低补丁因格式漂移而失败的几率# 来自 Jira 附件 curl https://issues.apache.org/jira/... | git apply --ignore-space-change # 来自 GitHub 提交 curl https://github.com/GitHub User/thrift/commit/Commit ID.patch | git apply --ignore-space-changegit apply --ignore-space-change的关键作用当补丁上下文中的缩进或尾随空格与当前分支不完全一致时仍能尽量完成应用。应用后应立即用git status和git diff检查改动是否符合预期。如果补丁无法干净应用CONTRIBUTING.md 提供了配套的 Git 修复手法冲突时先git checkout THRIFT-9999切到对应分支git rebase upstream master解决冲突后强制推送当 PR 混入了他人提交时可用git cherry-pick只挑选自己的提交并 squash 成单个提交再推送到新的THRIFT-9999-take-2分支替换原 PR。4. 法律合规检查应用补丁后提交者必须逐项核对补丁是否满足 Legal aspects on Submission of Contributions (Patches) 的要求。这是 Apache 项目的硬性红线核心关注点包括贡献者是否确认过 Apache 贡献者许可协议CLA相关条款补丁是否包含第三方代码或受其他许可证约束的内容补丁头部是否带有 Apache License 声明。仓库的代码规范也与之呼应doc/coding_standards.md 要求每个文件必须以包含 Apache License 的注释开头。这一步从源头避免版权与许可证纠纷进入代码库。四、第 5 步运行单元测试与跨语言测试验证补丁这是九步流程中技术含量最高的一步。Thrift 是跨语言框架一个编译器改动可能影响 C、Java、Python、Go、Ruby 等所有语言的生成代码因此仅跑单一语言测试远远不够。4.1 测试设施总览仓库的测试体系分为两层各语言单元测试位于 lib/语言/test 下例如lib/cpp/test、lib/java/src等跨语言集成测试位于 test 目录由 test/test.py 驱动测试定义在 test/tests.json 中。顶层 Makefile.am 定义了测试入口precross: all precross-test precross-lib cross: cross-.*其中cross目标展开为对所有已构建语言的cross-%递归调用实际执行$(CROSS_PY) test/test.py --retry-count 5 --skip-known-failures \ --server $(CROSS_LANGS_COMMA_SEPARATED) --client $(CROSS_LANGS_COMMA_SEPARATED) --regex $*CROSS_LANGS由 configure 阶段的MAYBE_*变量构成涵盖 cpp、c_glib、java、python、ruby、perl、php、go、nodejs、dart、erlang、lua、rs、netstd 等凡是本机构建过的语言都会参与交叉测试。4.2 推荐验证路径test/README.md 给出了两种运行方式方式 A整体运行make cross该命令会跳过未在本地构建的语言以及已知失败的用例适合全量回归。方式 B定向运行提交者更常用例如改动只涉及nodejs库可以只针对 nodejs 和参考实现官方推荐 cpp、java 作为基准做双向交叉验证./configure --without-c_glib --without-erlang --without-lua ... make precross -j8 test/test.py --server cpp,java --client nodejs test/test.py --server nodejs --client cpp,java--regex参数可以进一步缩小范围例如只跑 Java TBinaryProtocol 相关用例test/test.py --regex java.*binary4.3 测试客户端/服务端的统一命令行契约为了让所有语言可以自由交叉组合test/README.md 规定每个语言的测试可执行程序如TestServer、TestClient必须遵循统一的命令行接口服务端TestServer关键参数--portarg (9090) 监听端口 --transportarg (buffered) transport: buffered, framed, http, anonpipe, zlib --protocolarg (binary) protocol: binary, compact, header, json --server-typearg (simple) server: simple, thread-pool, threaded, nonblocking --ssl 使用 SSL 加密传输 -narg | --workersarg (4) 线程池 worker 数量客户端TestClient关键参数--hostarg (localhost) 连接主机 --portarg (9090) 连接端口 --transportarg (buffered) Transport: buffered, framed, http, evhttp, zlib --protocolarg (binary) Protocol: binary, compact, header, json --ssl 使用 SSL 加密传输 -narg | --testloopsarg (1) 测试循环次数 -targ | --threadsarg (1) 测试线程数测试退出码采用位掩码约定0 表示成功便于精确定位失败类别#define TEST_BASETYPES 1 // 0000 0001 #define TEST_STRUCTS 2 // 0000 0010 #define TEST_CONTAINERS 4 // 0000 0100 #define TEST_EXCEPTIONS 8 // 0000 1000 #define TEST_UNKNOWN 64 // 0100 0000 (环境准备失败等) #define TEST_TIMEOUT 128 // 1000 0000例如客户端返回10 2 | 8即表示 Struct 测试2与 Exception 测试8同时失败。4.4 已知失败机制跨语言测试因各语言对异常处理的支持不完全一致存在一批已知失败。仓库通过known_failures_platform.json如 test/known_failures_Linux.json记录这些用例--skip-known-failures会跳过它们使 CI 只报告此前未知的新失败。该文件由以下命令维护test/test.py --update-expected-failuresoverwrite # 全量运行后生成 test/test.py --skip-known-failures # 只跑非已知失败 test/test.py --update-expected-failuresmerge # 合并增量更新对应 Makefile.am 中的fail目标。提交者在验证补丁时务必确认没有任何新增的未知失败。五、第 6~7 步提交补丁与规范化的提交信息5.1 配置身份并提交补丁验证通过后进入提交环节。由于提交者可能在同一台机器上为多个 Apache 项目工作文档明确要求在提交前显式配置身份确保提交记录与 Apache ID 对应git --config user.name Your Name git --config user.email YourApacheIDapache.org git add -A git commitgit add -A会暂存包括删除与重命名在内的全部改动避免遗漏新增的测试文件或生成代码。5.2 提交信息格式必须遵守提交信息采用结构化的三段式这是整个流程中最容易被新人忽视、却对生成 changelog 至关重要的规范THRIFT-####:Jira description Client: component Patch: Name of person contributing the patch Description of what was fixed or addressed.各字段含义字段说明示例THRIFT-####:Jira description首行Jira 票据号加一行式问题描述THRIFT-5744: Switch to slog for go libraryClient: component受影响的组件/语言Client: go、Client: cpp,erl,perlPatch: Name补丁贡献者姓名Patch: John Doe正文详细说明修复内容自由文本如果补丁来自 GitHub Pull Request还需在提交信息中附加一行以在合并时自动关闭对应的 PRThis closes #NNNN其中#NNNN是 PR 编号。这与 CONTRIBUTING.md 对 PR 提交者的要求完全对齐——该文档规定 PR 标题必须以 Jira 票据号开头如THRIFT-9999: an example pull request titlecommit message 必须遵循THRIFT-9999: [summary]Client: [languages]的格式偏差将不会被合并。仓库的 .github/pull_request_template.md 也承担了在 PR 创建阶段引导填写这些信息的职责。5.3 为什么格式如此重要从 CHANGES.md 的目录结构可以直观看出原因每个版本说明按C、Compiler (General)、Go、Java、netstd、Python等组件分类罗列条目每一条都以THRIFT-####编号为锚。规范的结构化提交信息让 changelog 的生成与回溯几乎零成本也让后续的代码考古git blame / git log一目了然。六、第 8~9 步复查、推送与收尾6.1 推送前双重检查提交完成后文档要求先做double check确认没有遗漏任何改动git status git show HEAD git push origin mastergit status确认工作区干净、没有未暂存的遗漏文件git show HEAD完整审查最新一次提交的 diff 与提交信息确认内容与 Jira 票据一致git push origin master推送至主干分支。6.2 解决 Jira issue 并设置 changelog 字段推送成功并不代表流程结束。提交者还需要回到 Jira将对应 issue 标记为已解决Resolve并为该 issue 设置两个关键字段以服务版本发布Component补丁所属的组件对应提交信息中的Client:字段如 Go - LibraryfixVersion当前 master 上的版本号即该修复将随哪个版本发布。这一步保证了 CHANGES.md 中的版本条目能够准确归类是版本发布流程见 doc/ReleaseManagement.md的上游输入。七、与贡献者工作流的衔接从 PR 到合入虽然 doc/committers.md 面向提交者但理解整条链路有助于贡献者配合。在 Apache Thrift 中普通贡献者的标准路径是 GitHub Pull Request见 CONTRIBUTING.mdFork 仓库并克隆到本地为每个 issue 创建独立分支推荐以 issue 编号命名如THRIFT-9999修改源码并必须附带测试推荐采用 TDD先写能暴露 bug 的测试再实现修复遵循编码规范可运行make style对应 Makefile.am 中的style-local目标基于 codespell 检查拼写做格式校验将改动 squash 成单个提交PR 标题以 Jira 票据号开头等待 CIAppveyor 与 Travis/CMake 工作流在多种 Linux/Windows 配置上运行全部测试套件等待提交者合并——此时 doc/committers.md 的九步流程开始接管从法律审查、跨语言测试到规范化提交与推送。如果贡献者选择以补丁文件方式提交git diff ../THRIFT-NNNN.patchCONTRIBUTING.md 明确指出这不是首选方式因为它会额外增加提交者代建 PR 的负担——这也是流程设计上鼓励 PR 路径的原因。八、提交者实战检查清单将全文浓缩为一份可粘贴到终端旁的执行清单确认 Jira 存在对应THRIFT-####票据补丁内容与票据描述一致同步最新 mastergit pull origin mastercurl ... | git apply --ignore-space-change应用补丁并检查 diff核对 Apache 贡献提交法律条款许可证、第三方代码、文件头声明make precross后运行定向交叉测试如test/test.py --server cpp,java --client nodejs确认无新增未知失败全量回归可make cross配置身份并提交git config user.name、git config user.email、git add -A、git commit提交信息符合THRIFT-####: Jira descriptionClient: componentPatch: name格式PR 来源补丁追加This closes #NNNNgit status、git show HEAD复查后git push origin master在 Jira 中 Resolve issue设置 Component 与 fixVersion当前 master 版本。结语Apache Thrift 的提交者工作流本质上是一套质量闸门Jira 票据保证每笔提交可追溯法律审查守住合规底线跨语言测试矩阵test/test.py、test/tests.json兜住多语言兼容性风险结构化提交信息则让 CHANGES.md 的版本记录始终整洁。对于贡献者而言理解这九步不仅能提高补丁被合入的概率也能更清楚地看到Apache 项目里合入一个补丁远不止一次代码合并而是一次完整的工程与治理协作。【免费下载链接】thriftApache Thrift项目地址: https://gitcode.com/gh_mirrors/thrift2/thrift创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表