ARTICLE DETAIL

资讯详情

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

RIOT 开源贡献实战指南:编码规范、静态测试与 Git 协作流程全解析

RIOT 开源贡献实战指南:编码规范、静态测试与 Git 协作流程全解析 RIOT 开源贡献实战指南编码规范、静态测试与 Git 协作流程全解析【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本文以 RIOT 官方的贡献指南CONTRIBUTING.md为主体系统梳理向 RIOTThe friendly OS for IoT上游代码库提交代码的完整路径从 Bug 报告与功能请求的规范到编码约定检查uncrustify 格式化与static-test静态测试、提交信息commit约定、Pull Request 的最佳实践再到 fixup commit、squash rebase、手动 rebase 等具体 Git 操作流程最后介绍社区冲突调解机制。读完本文你可以独立完成一份符合 RIOT 项目规范、能够顺利通过审查并合并进 master 分支的贡献。一、上手前文档与工具链准备如果你是第一次接触 RIOT在动手写代码之前建议先阅读官方指南guide与 API 文档。在当前仓库中这些文档的源码与构建产物都有对应目录指南与教程的源文件位于 doc/guidesMarkdown/MDX 格式由 Starlight 框架构建API 文档由 Doxygen 从源码头文件中提取生成Doxygen 的样式与模板资源位于 doc/doxygen仓库根目录的 features.yaml 定义了 RIOT 的 feature 元数据理解 feature 机制是理解模块组织方式的前提。对于社区交流官方提供了 forum 与 Matrix 频道#riot-os:matrix.org。所有贡献者都被要求遵守项目代码行为准则Code of Conduct仓库根目录有 CODE_OF_CONDUCT.md。二、Bug 报告与功能请求无论是 Bug 报告还是功能请求无论大小都欢迎提交。官方给出的流程要点先查重提交功能请求feature request之前先检查是否已存在同类 open issue不存在再新建并描述你的用例use case、为什么需要这个功能、以及它为什么对 RIOT 重要。报告 Bug 同样先查重如果不确定某个现象是不是 Bug也鼓励直接提 Bug 报告不必纠结分类。安全漏洞走私密渠道如果你认为公开报告某个 Bug 会给 RIOT 用户带来安全风险应通过邮件securityriot-os.org私下描述该 Bug。官方希望你在公开渠道报告前等待 6 个月的宽限期grace period以便留出时间发布修复。仓库根目录的 SECURITY.md 对安全披露策略有进一步说明。三、贡献代码的标准流程如果你认为自己的工作应该被合并进 RIOT 主仓库贡献指南给出的标准步骤是Fork RIOT 的 git 仓库如果还没有的话为贡献创建独立的分支确保代码符合 RIOT 的编码约定仓库根目录的 CODING_CONVENTIONS.md 是 C 语言约定的权威版本提交 commit遵循 RIOT 的 commit 约定见下文把该分支推送到你在 GitHub 上的 fork发起 Pull RequestPR并留意其中的模板填写要求维护者会打上标签labels并给出反馈针对反馈进行修改修改流程见 Git 工作流一节代码通过审查后合并进 RIOT 的 master 分支。另外指南特别提到如果使用了 AI 工具辅助开发需同时阅读官方的 AI Policy。3.1 General Tips让贡献更快被合并的六条经验从官方维护者的经验出发以下建议能显著提高代码进入 master 的速度尽早求助Ask around for help!通过线下或官方沟通渠道尽早和别人核对你的功能设计。设计核对得越早在审查阶段被否决的可能性就越小。尽早验证思路Verify your concept early!如果一直独自开发到代码看起来够好才公开很可能会错过别人本可以更早发现的设计缺陷。保持简单Keep it simple!尽量复用已有机制非必要不改动现有 API。保持体量小Keep it small!超过 1000 行改动的 PR 很可能让最活跃的审查者都把它丢进待办列表的末尾。保持模块化Keep it modular!新特性或对现有特性的扩展应做成可选项可选启用。提供测试Provide tests!测试应当通俗易懂、容易执行或者在 PR 中提供完整的测试方案说明。RIOT 的测试目录tests中按模块组织了大量可参考的测试用例结构。3.2 编码约定检查uncrustify 与 static-testRIOT 有详尽的编码约定C 语言见 CODING_CONVENTIONS.mdC 见 CODING_CONVENTIONS_C.md并且提供了自动化工具链来验证代码是否符合约定1用 uncrustify 格式化.c和.h文件仓库根目录自带配置 uncrustify-riot.cfg格式化的标准命令是uncrustify -c $RIOTBASE/uncrustify-riot.cfg --no-backup your file注意--no-backup标志会让 uncrustify直接替换当前文件为格式化后的版本而不是另存备份文件。2用make static-test跑静态测试RIOT 提供了一组静态测试工具cppcheck、行尾空白检查、文档检查等被封装为单一的 make 目标make static-test从源码可以确认该目标定义在 makefiles/tests.inc.mk其内容非常简洁static-test: ./dist/tools/ci/static_tests.sh即它最终调用的是dist/tools/ci/static_tests.sh脚本。使用建议是在开 PR 之前执行它作为最后一次质量检查。注意事项原文档原话的提醒make static-test会把你的分支 rebase 到 master 分支之上因此执行前请确保两者可以顺利 rebase没有潜在的冲突。3.3 Commit 约定每个 commit 应针对 RIOT 中特定模块/部分的改动提交信息采用如下模式area of code: description of changes即代码区域: 改动描述。也可以使用多行提交信息来详细说明改动官方给出的示例periph/timer: Document that set_absolute is expected to wrap Most timers are implemented this way already, and keeping (documenting) it that way allows the generic timer_set implementation to stay as simple as it is.提交信息会被静态测试自动检查凡包含阻止合并的关键词例如fixup、DONOTMERGE的提交无法通过。关键词的完整清单存放在dist/tools/pr_check/no_merge_keywords文件中——该文件与检查脚本check.sh共同位于 dist/tools/pr_check 目录是静态测试中 commit message 校验的直接依据。仓库中还有一个配套工具dist/tools/commit-msg用于在开发过程中约束提交信息格式可视为该约定的落地检查点。四、Pull Request 最佳实践GitHub 的 Pull Request 机制是向 RIOT 代码库贡献的主要途径。RIOT 采用的是fork and pull模型贡献者把改动推送到自己的 fork再发起 PR 把改动带入源仓库。指南列出的实践要点先查已有 PR开新 PR 之前浏览现有 PR包括已关闭的因为之前的工作可能只是因缺乏关注而被关闭。停滞已久的 PR 有时会被打上 State: archived 标签归档。若发现同类 PR可以直接在评论中参与协作。标题即约定PR 标题应反映内容本身且格式与 commit 约定一致area: description。认真填写模板每个 PR 都使用模板目的是帮助维护者理解你的贡献并辅助测试请尽可能详尽地填写每一节。建议勾选 Allow edits from maintainers这允许维护者直接向你的分支推送以最终完善 PR总体上能加快合并速度这是建议不是强制要求。小 PR 合并更快把改动尽量精简每个 PR 只承载一个可独立解释、可独立运行的改动能拆分就拆成更小的 PR。耐心等待但也可以礼貌催审维护者会尽力尽快审查每个 PR但如果长时间没有审查可以在 PR 下评论礼貌提醒或者直接 一位在该领域有经验的维护者也可以在论坛发帖宣传并请求审查。尽快响应审查意见避免 PR 停滞。五、Git 工作流实操这一节给出与 RIOT GitHub 开发流程配合的最小 Git 知识集。5.1 初始化本地仓库开始改代码前先在 GitHub 上 fork RIOT 上游仓库。如果是第一次用 git先配置用户名与邮箱git config --global user.name your name here git config --global user.email your email address here然后克隆你在 GitHub 上的 RIOT fork把account name替换成你的登录名git clone gitgithub.com:account name/RIOT.git要把本地任意分支与上游 master 保持同步git checkout branch name git pull --rebase https://github.com/RIOT-OS/RIOT.git在开 PR 之前执行它至少可以保证 PR 处于可合并mergeable状态并且与上游保持最新。5.2 在分支上工作避免从 fork 的master分支直接向上游 master 开 PR先更新 master再从它切出新的工作分支git checkout master git pull --rebase https://github.com/RIOT-OS/RIOT.git git checkout -b new branch完成修改、提交后推送到你的远程仓库git push origin your branch5.3 审查期间使用 fixup commit为了让审查者更容易追踪改动历史建议把审查反馈的修改以 fixup commit 的方式推送。假设你的 PR 有 3 个被评论的 commitprefix1: change 1、prefix2: change 2、prefix3: change 3。对prefix2的修改不要新增第 4 个 commitprefix2: change 4而是git add /path/of/prefix2 git commit --fixup prefix2 commit hash这样生成的fixup!提交可以之后自动归并回原提交。5.4 审查结束后 Squash 提交一次 PR 过程中会积累大量fixup!commit。为保持项目提交历史整洁这些提交最终需要被合并squash成合理的 commit这也是一次重新核对 commit 约定的机会。注意一静态测试会对fixup、DONOTMERGE等不可合并关键词发出警告——这些提交必须在允许合并之前被 squash 或移除关键词清单见 3.3 节中的no_merge_keywords。注意二除非维护者明确要求否则不要主动 squash 你的提交。否则会丢失审查改动的历史对大型 PR 而言审查者将难以跟踪而且一旦你引入了回归也无法从早期提交恢复工作状态。squash 操作通过 git 的交互式 rebase 完成。最稳妥的做法是先用git merge-base HEAD master找到 master 分支最后一个与你相关的 commit hash然后执行git rebase -i last master hash编辑器会列出你此后做的所有提交你可以 select、drop、reorder、squash。如果在审查阶段使用了 fixup commitsquash 可以用一条命令完成git rebase -i --autosquash last master hash如果遇到合并冲突最简单的办法是使用 merge 工具如 meld 或编辑器/IDE 内置的 merge 工具。解决冲突后继续 rebasegit rebase --continuesquash 完成后需要强制推送分支以更新 PRgit push origin your branch --force-with-lease5.5 手动 Rebase维护者有时会因为各种原因要求你 rebase PR比如上游master已经前进了需要把上游变更应用进你的分支。流程是先让你的 fork 与上游master同步。可以在 GitHub 上访问你的 fork 页面当看到类似This branch is 4 commits behind RIOT-OS/RIOT:master.的提示时点击右侧的Sync Fork按钮执行Update Branch。fork 的master更新后在本地终端执行git pull master拉取最新改动。切到你的开发分支必要时git checkout your branch然后执行git rebase master。理想情况下没有冲突如果发生冲突处理方法见 5.4 节。强制推送更新后的分支git push origin your branch --force-with-lease六、文档贡献与冲突调解6.1 写文档新手的最佳切入点文档改进始终受欢迎也是新贡献者的良好起点这类贡献通常能相当快地被合并。从仓库结构可以印证文档体系的分工Doxygen 读取 RIOT 源码文件生成 modules、CPUs、boards 与 packages 的 API 文档其配置与样式位于 doc/doxygenStarlight 用于生成指南与教程源文件位于 doc/starlight 与 doc/guides。因此写文档贡献的落点也很明确API 级文档写进源码头文件的 Doxygen 注释指南级内容写进 doc 目录下的 Markdown/MDX 文件。6.2 社区冲突调解像 RIOT 这样多元化的社区不可避免地存在观点碰撞即便所有参与者都遵守代码行为准则。当你寻求解决冲突的帮助时可以发邮件到调解邮件列表mediationriot-os.org。邮件会被转发给一个由可信社区成员包括维护者和非维护者组成的调解小组。调解被视为解决冲突的工具而不是惩罚手段——不必害怕联系调解者也不必因为有人发起调解而感到被指控或惩罚。可以申请调解的情形非穷尽列举包括你作为贡献者觉得自己被另一位贡献者或维护者不公平对待你的 PR 被以不正当或非技术原因拒绝/阻塞PR 被以合理的技术原因拒绝/阻塞但你的论据没有得到应有的考虑维护者要求你对 PR 做出与 PR 本身无关的不成比例的修改例如修复与你的 PR 无关的问题才能合入上游你与其他贡献者/维护者在 RIOT 应如何演进上存在分歧例如存在多个覆盖高度相关用例的竞争性 PR团队对其取舍产生分歧某个 PR曾经有意为某个特定用例引入回归比如采用了偏向另一用例的权衡对你的用例很重要的特性被弃用/移除例如为降低维护负担、减少感知的功能重复而你的用例依赖该特性或其实现细节。注意对代码行为准则的违规应通过专门的邮箱conductriot-os.org报告而不是走调解渠道。七、小结一张贡献路径速查表阶段关键动作工具/文件依据准备读指南与 API 文档遵守 Code of Conductdoc/guides、CODE_OF_CONDUCT.md报告问题先查重安全漏洞走 security 邮箱并等待 6 个月宽限期SECURITY.md编码遵守 C 约定uncrustify 格式化uncrustify-riot.cfg、CODING_CONVENTIONS.md自检make static-testrebase 后执行makefiles/tests.inc.mk提交area: description格式避免 no-merge 关键词dist/tools/pr_checkPR 审查fixup commit → 维护者要求后git rebase -i --autosquash→--force-with-lease—分歧调解邮箱 mediation准则违规走 conductCODE_OF_CONDUCT.md按照上述流程操作你的贡献在格式、质量与协作方式上都与 RIOT 社区的标准对齐能够最大程度地减少返工加快代码进入 master 的进程。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表