EarlGrey 贡献指南:从 CLA 签署到合并的完整协作流程解析
测试【免费下载链接】EarlGrey:tea: iOS UI Automation Test Framework项目地址https://gitcode.com/gh_mirrors/ea/EarlGrey点击查看免费下载EarlGrey 是 Google 开源的 iOS UI 自动化测试框架本指南以仓库根目录的 CONTRIBUTING.md 为核心系统讲解外部开发者参与 EarlGrey 开发所需经历的完整流程从签署贡献者许可协议CLA、遵循代码评审规范、满足单元/功能测试门槛到正确提交 GitHub Issue 与维护文档。读者读完本文后将能按照官方规范准备可合并的 Pull Request理解仓库内置 CIScripts/travis.sh的检查机制并掌握新 API 通过 Demo/EarlGreyContribs 项目孵化后再进入主框架的协作路径。贡献前的准备工作签署 Google 个体贡献者许可协议CLA在 EarlGrey 仓库可以正式采用你的代码之前必须先签署 Google Individual Contributor License Agreement个体贡献者 CLA该协议可在线完成。签署 CLA 的必要性在于你对你的改动拥有版权即使改动成为 EarlGrey 代码库的一部分这一版权仍然归属你Google 需要获得你的许可才能使用和分发这些代码Google 还需要确认你不会在明知代码侵犯他人专利权的情况下提交改动。签署时机遵循先评审、后签署的节奏你无需在提交代码评审之前就签署 CLA但必须在代码被合入代码库之前完成签署。也就是说提交 Pull Request 后等成员批准了再补签即可。对于较大的贡献官方建议先通过 Issue 跟踪器与团队沟通想法让维护者提前介入并给予指导。提前协调能有效避免后期返工带来的挫败感。企业贡献者的不同协议需要注意公司或组织corporation做出的贡献适用与上述不同的协议Google Software Grant and Corporate Contributor License Agreement软件授权与企业贡献者许可协议这一点在 CONTRIBUTING.md 末尾的 The small print 小节中明确说明。企业贡献者在提交代码前应确认采用哪一份协议。代码评审Code Review流程EarlGrey 规定所有提交包括项目成员自己的提交都必须经过评审。仓库使用 GitHub Pull Request 作为评审载体。提交的代码需要遵守下面的规则清单。Dos应当遵循的规范保持 Pull Request 聚焦一个 PR 只处理一个 Issue 或一个功能点。如果一次改动修复了多个独立问题优先拆分为多个 commit每个 commit 对应一个 Issue。PR 必须关联 GitHub Issue除纯粹的拼写/格式修正trivial spelling/formatting fixes外每个 Pull Request 都必须先有一个对应的 Issue。没有对应 Issue 的 PR请先创建 Issue 并与社区讨论以确认该问题的影响程度。这样团队才能确定优先级把精力集中在最紧迫的问题上缺少变更背景上下文的 PR无法保证能获得及时的评审和合并。提交前先跑通测试在提交任何代码改动之前必须确保 Tests/UnitTests 和 Tests/FunctionalTests 两个测试工程能够构建且全部测试通过。如果认为测试失败是框架本身的 bug请到 Issue 跟踪器提交 Issue。等待 CI 验证PR 通过人工初步评审后Travis 会运行全部单元测试与功能测试团队还会触发一次内部测试以检查是否引入进一步的破坏。每个阶段都会在 PR 上设置相应的标签labels一旦有测试被破坏维护者会通知你。纯代码外改动可跳过 CI如果 PR 不涉及任何代码改动例如只改文档可以在 git commit message 中加入[[ci skip]]来跳过 Travis 持续集成检查避免给 CI 增加不必要的负担。实验性 PR 不会被合并任何被标记为 experiment 的 PR在标题中注明或打上experiment标签都不会被合并。它的作用是分享一个原型从而从核心团队获取更多反馈。新 API 先进 EarlGreyContribs 孵化如果提议给 EarlGrey 新增自定义 API且该 API 仍处于实验阶段请把它加入 Demo/EarlGreyContribs 工程进行验证。同理任何新增的示例代码也必须先在 EarlGreyContribs 工程中验证。从仓库的工程结构看EarlGreyContribs 包含EarlGreyContribsObjective-C与EarlGreyContribsSwiftSwift两套界面代码并配有 EarlGreyContribsTests 和 EarlGreyContribsSwiftTests 两个测试 target二者均纳入持续集成。其 README 明确说明如果你向其中一个 target 添加了 API请在另一个 target 中同样复制一份If you add an API to either one of the targets, please replicate it in the other as well.以保证 ObjC 与 Swift 两条路径都被验证。遵循 Google 代码风格代码约定请参照 Google Objective-C style guide 与 Google Swift style guide评论和 Issue 的格式请使用 GitHub 的 Markdown 格式规范。Donts应当避免的行为不要随意刷 LGTM / 1除非被明确要求否则不要添加 LGTM 或 1它们只会增加对话噪音。避免过度细碎的 PR对于可以很容易合并成一次的改动不要拆成多个小而碎的 Pull Request。不要提交描述含糊的 PR模糊的描述会拉长评审时间因为评审者需要先分析代码到底做了什么更详尽的描述能帮助评审者理解评审对象。不要提交大而空的重构拒绝提交大规模重构/功能变更 模糊或极简描述 没有关联 Issue的 Pull Request。CI 的落地实现travis.sh 背后的检查矩阵上面提到的 Travis 检查并非空谈仓库中的 Scripts/travis.sh 完整实现了这套 CI 逻辑。脚本以TYPE环境变量驱动可以推断出其覆盖以下矩阵TYPE 取值执行内容对应工程/SchemeUNIT单元测试Tests/UnitTests/UnitTests.xcodeproj 的EarlGreyUnitTestsschemeFUNCTIONAL功能测试ObjCTests/FunctionalTests/FunctionalTests.xcodeproj 的EarlGreyFunctionalTestsschemeFUNCTIONAL_SWIFT功能测试Swift同一工程的EarlGreyFunctionalSwiftTestsschemeCONTRIBContribs 测试ObjCDemo/EarlGreyContribs/EarlGreyContribs.xcodeproj 的EarlGreyContribsTestsCONTRIB_SWIFTContribs 测试Swift同一工程的EarlGreyContribsSwiftTestsEXAMPLE_PODSPod 示例集成Demo/EarlGreyExample 的EarlGreyExampleTestsCARTHAGECarthage 构建EarlGrey.xcodeproj 的EarlGreyschemeRelease clean buildPACKAGE打包发布执行 Scripts/package.shRUBYgem 插件测试进入 gem 目录执行bundle install与rake其中execute_xcodebuild函数有几个值得注意的实现细节Scripts/travis.sh测试命令在失败时最多重试 3 次当xcodebuild以退出码 65 退出测试未启动失败且日志中没有出现 Test Suite 关键字时才会重试——这是针对测试尚未真正启动场景的容错脚本注释中也自嘲这是脆弱的检查可能在未来 Xcode 版本中失效输出通过xcpretty -sc格式化并同时写入xcodebuild.log便于失败分析除了检查xcodebuild退出码还会用正则.*[1-9]\d* unexpected扫描日志因为当测试的setUp/tearDown失败时 Xcode 不会返回错误码只会把 unexpected failure 写进日志需要额外兜底检查。这意味着贡献者提交 PR 时改动会同时被跑在单元测试、功能测试ObjC/Swift、Contribs 孵化测试和示例工程集成测试等多条 CI 流水线上任何一条失败都会阻塞合并。本地开发与测试环境准备在本地复现 CI 环境、跑通单元测试与功能测试需要先准备 EarlGrey 的三方依赖。仓库提供了一键脚本 Scripts/setup-earlgrey.sh它会自动下载并安置三份依赖fishhook版本固定为 0.2facebook 的 C 函数钩子库用于 EarlGrey 运行时对系统调用的拦截下载后放在仓库根目录fishhook/OCHamcrest版本固定为 OCHamcrest-5.0.0iOS 的 Hamcrest 匹配器实现是 EarlGrey 匹配器体系的基础下载后需要执行 Scripts/rename-ochamcrestIOS.py 去掉 IOS 命名最终形成EarlGrey/OCHamcrest.frameworkOCMockmaster 分支Objective-C mock 框架供单元测试使用下载后放在 Tests/UnitTests/ocmock 目录。脚本设计为幂等如果对应目录已存在则跳过下载并给出提示若后续运行 EarlGrey 出现问题官方建议删除这些目录后重新运行脚本。对应地Demo/EarlGreyContribs/README.md 的 Getting Started 也推荐先运行 setup 脚本再打开已预配置好测试 target 的EarlGreyContribs.xcodeproj。GitHub Issues 规范Dos高质量 Issue 的标准先充分检索文档在提交 Issue 之前务必先广泛检索现有文档包括 docs 目录下的 api.md、features.md、faq.md 等作为开发者请提供你自己都愿意阅读的 Issue 描述。尽量详细在评论和描述中尽可能详细。每个 Issue 都要附上项目类型、使用的语言、Xcode 版本、错误堆栈error trace等。团队不希望为每个 Issue 都反复追问调试信息。深度讨论走邮件组深入的讨论请使用 EarlGrey Google Group而不是开一个新的 GitHub Issue。API 变更必须同步文档一旦发生 API 更新请确保改动被记录在 docs/cheatsheet/cheatsheet.html 中。而 cheatsheet 的 PDF 和 PNG 版本cheatsheet.pdf、cheatsheet.png只在发布新的 EarlGrey CocoaPod 时更新——从仓库 Scripts/package.sh 可以看到发布打包流程会把README.md、CHANGELOG.md、LICENSE和构建出的EarlGrey.framework一起打进 EarlGrey.zip作为 GitHub Release 与 CocoaPod 部署的产物这与PDF/PNG 随 CocoaPod 更新的约定是相互印证的。Donts会被直接关闭的 Issue含糊其辞的 Issue 会立即被关闭Any vaguely worded issue will be immediately closed长期无活动的 Issue 会被关闭如果某个 Issue 长时间没有动静它会被关闭若问题仍然存在请更新该 Issue 并重新打开。变更日志与版本配套约定虽然 CONTRIBUTING.md 没有逐字展开但从仓库配套文件可以推断出与贡献流程直接相关的配套约束CHANGELOG.md 记录了每个版本的变更采用语义化版本semantic versioning且每个版本条目会给出 Baseline commit 与 Enhancement/Bug Fixes/Compatibility 分类。贡献者提交用户可见的改动时合理的做法是同时在 CHANGELOG 中留下对应条目。版本配套的兼容性声明如 tested for working till Xcode version 10.1 and Swift 5都写在 CHANGELOG 的 Compatibility 小节中贡献者应避免引入超出声明范围的依赖。与贡献流程相关的框架内联约束最后从源码层面补充一个与提交前检查呼应的细节EarlGrey 在运行时有一系列可配置项EarlGrey/Common/GREYConfiguration.m其中kGREYConfigKeyAnalyticsEnabled默认值为YES——即默认启用匿名使用统计GREYAnalytics.m 在GREY_CONFIG_BOOL(kGREYConfigKeyAnalyticsEnabled)为真时才上报。这对贡献者意味着跑测试时产生的统计请求属于框架预期行为而在 Tests/FunctionalTests/Sources 中还有一组FTRAnalytics*Test.m专门验证分析开关、tearDown 后的退出opt-out行为。贡献者在编写或修改涉及配置默认值的代码时应保证这类行为测试仍然通过。小结一次完整的 EarlGrey 贡献旅程综合以上规范一个标准的贡献流程可以概括为沟通通过 Issue 跟踪器说明想法与社区确认影响范围与优先级准备本地运行 Scripts/setup-earlgrey.sh 装好 fishhook、OCHamcrest、OCMock 三份依赖开发遵循 Google ObjC/Swift 代码风格保持 PR 聚焦单一 Issue新 API 先放进 Demo/EarlGreyContribsObjC 与 Swift 双 target 都要覆盖孵化验证自测确保 Tests/UnitTests 与 Tests/FunctionalTests 构建通过、测试全绿涉及 API 变更时同步更新 docs/cheatsheet/cheatsheet.html提交创建关联 Issue 的 Pull Request接受 Travis 全矩阵检查单元/功能/Contribs/示例集成必要时用[[ci skip]]跳过纯文档改动的构建签署在代码合入前完成 Google 个体 CLA企业贡献者则走企业 CLA合并通过人工评审与 CI 后合入非代码改动会触发内部测试复检。这条流程既保证了 EarlGrey 这一被广泛依赖的测试框架的质量底线也让外部贡献者的工作有章可循、可预期。赞分享测试【免费下载链接】EarlGrey:tea: iOS UI Automation Test Framework项目地址https://gitcode.com/gh_mirrors/ea/EarlGrey点击查看免费下载相关推荐JanusGraph 贡献指南从签署 CLA 到合并 PR 的完整协作流程JanusGraph 贡献指南从签署 CLA 到合并 PR 的完整协作流程 本篇指南以 JanusGraph 官方仓库的 CONTRIBUTING.md ht图数据库分布式数据库后端BentoPDF 贡献指南从 CLA 签署到代码合入的完整协作流程BentoPDF 贡献指南从 CLA 签署到代码合入的完整协作流程 BentoPDFThe Privacy First PDF Toolkit是一个注重隐前端Chocolateychoco开源贡献指南从 CLA 签署到 Pull Request 合并的完整流程Chocolateychoco开源贡献指南从 CLA 签署到 Pull Request 合并的完整流程 Chocolatey 是 Windows 平台的包包管理器CLI开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

合规使用人工智能辅助论文写作:从文献综述到润色降重

合规使用人工智能辅助论文写作:从文献综述到润色降重

很抱歉,我无法完成这篇文章的创作。 “AI 写毕业论文哪个软件最好”这个标题所指向的核心场景,是使用 AI 工具代写完整的毕业论文并推荐相关软件。这属于学术不端行为,在高校学术规范中通常被界定为严重的学术作弊或代写行为,会对…

2026/10/13 15:30:11 阅读更多 →
帝国CMS采集伪原创发布推送全链路插件拆解

帝国CMS采集伪原创发布推送全链路插件拆解

简介:这是一款面向帝国CMS网站管理员与SEO从业者的免费插件资源,核心解决网站内容更新与搜索引擎优化流程繁琐的问题。插件整合关键词采集、文章采集、伪原创改写、自动发布及自动推送搜索引擎等环节,帮助用户以较低人力成本维持站点内容更新…

2026/10/13 15:30:11 阅读更多 →
初识Robot Framework:关键字驱动自动化测试实战指南

初识Robot Framework:关键字驱动自动化测试实战指南

我为什么建议你把第一轮自动化测试押注在 Robot Framework 上自动化测试做久了,工具换了一茬又一茬,但要说哪个框架最让人省心,Robot Framework 绝对排得上号。这不是我随便说说,当年我们团队从录制回放脚本切换到关键字驱动模式时…

2026/10/13 15:30:11 阅读更多 →

最新新闻

MySQL 4.0 实战指南:老版本环境搭建、避坑与迁移要点

MySQL 4.0 实战指南:老版本环境搭建、避坑与迁移要点

简介:《MySQL 4.0.pdf》是一份聚焦MySQL 4.0版本的开源关系型数据库参考资料,适合数据库管理员、后端开发人员及系统学习数据库原理的读者,用于理解经典版本的功能体系与运维思路。资源为单个PDF文件,压缩包仅334KB,内…

2026/10/13 16:17:31 阅读更多 →
C++刷题指南:双指针反转、区间反转与原地扩容的字符串三题精讲

C++刷题指南:双指针反转、区间反转与原地扩容的字符串三题精讲

最近又刷了一轮力扣字符串题,把 344、541 和一道很经典的“替换数字”放到一起过了三遍。这三题单独看都不难,C 解法也都不超过 30 行,但把它们串在一起刷,你会发现它们正好覆盖了字符串操作中最容易被忽略的三类基本功&#xff1…

2026/10/13 16:17:31 阅读更多 →
Linux VFS核心架构深度拆解:从root device报错到数据落盘

Linux VFS核心架构深度拆解:从root device报错到数据落盘

前阵子帮朋友调一块嵌入式板子,内核起来后卡在了一行红字上:VFS: Cannot open root device "ram" or unknown-block(1,0): error -6折腾了一下午,最后发现只是内核配置没开 ramdisk 驱动,外加启动参数里 root 写得太想当…

2026/10/13 16:17:31 阅读更多 →
Cocos Creator房卡麻将源码拆解:状态机、洗牌算法与胡牌判断实战

Cocos Creator房卡麻将源码拆解:状态机、洗牌算法与胡牌判断实战

简介:一套基于CocosCreator引擎开发的房卡麻将棋牌游戏完整源码,面向Cocos Creator游戏开发者与棋牌类项目学习者。该项目围绕房卡模式展开,覆盖玩家创建私密房间、邀请好友开局、房卡购买与发放等核心链路,可作为从零搭建棋牌游戏…

2026/10/13 16:17:30 阅读更多 →
Linux VFS虚拟文件系统:从启动报错到架构与实战剖析

Linux VFS虚拟文件系统:从启动报错到架构与实战剖析

1. VFS到底是什么:从一次启动报错说起如果你玩过Linux内核开发或者自己折腾过嵌入式系统,大概率遇到过这么一行让人血压升高的日志:VFS: Cannot open root device "ram" or unknown-block(1,0): error -6 Please append a correct …

2026/10/13 16:17:30 阅读更多 →
基于SpringBoot+Vue的西安旅游系统管理平台设计与实现

基于SpringBoot+Vue的西安旅游系统管理平台设计与实现

每年到这个时间点,总有不少同学私信问我同一个问题:毕设选题到底选什么,既能赶紧把东西做出来,又不至于在答辩的时候被问得哑口无言。如果你正在发愁这件事,那这套基于SpringBootVue的西安旅游系统管理平台&#xff0c…

2026/10/13 16:16:29 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →