本文由两部分构成,第一部分简要介绍了Gerrit的工作原理以工作流程,第二部分结合自己成功提交代码的例子,向大家展示向OpenDaylight提交源码的过程。向开源项目提交代码也没有大家想象的那么难,所以希望日后能够看见大家在OpenDaylight提交代码。
Gerrit概述
Gerrit是一个基于Git的,用于review code commit的框架,无论是OpenDaylight、ONOS或者是OpenStack都使用Gerrit作为他们的代码管理工具。它的最大特点就是,每一个commit都需要被review之后才能够被接受。Commit:被记录的对于代码的改动(存在本地)。
下图是Gerrit的架构,可以看出开发者并不是直接向Authoritative Repository提交自己的代码,而是向Pending Changes提交自己的代码。只有Reviewer同意之后,开发者提交的代码才会被提交到Authoritative Repository。
Authoritative Repository:中央仓库,整个项目的被review过的代码。
一个通用的Gerrit所管理的代码发生改变的流程如下:
1.Cloning the Repository 下载源码,你将在这个基础上,添加代码或者修改现有的代码
2.Creating the Review 将你的本地的代码推到远端的Gerrit,等待进行review
3.Reviewing the Change Reviewer(审查者)将会利用Gerrit对你的代码进行review。有两个概念需要理解一个是Verified,另一个是Code-Review。Verifying代表着对代码进行实际编译、单元测试等,主要是自动化程序。Code-Review是一个人来查看你的代码,确保这段代码的逻辑正确,编码风格良好等。
4.Reworking the Change 如果你或者代码的审查者发现你提交的代码存在一些问题,你需要重新修改你的这个提交。这是通过git commit --amend实现的,详见下文示例。
5.Trying out the Change 在本阶段中,审查者可以直接下载你的patch,并做一些额外的测试,保证代码的正确性。
6.Manually Verifying the Change 拥有Verify权限的人将会对你的代码进行投票,通过的话verified 1,不通过的话-1 Fails。
7.Submitting the Change 到了这个阶段,你离代码被merge只有一步之遥了。如果拥有相应权限的审查者认为你的代码符合要求,他就可以Submit Patch Set X。然后你的代码就已被merge到源码中了。Patch Set X可以理解为你第X次amend了你的一个commit。
向OpenDaylight社区贡献代码主要流程
0. 下载必要的工具
安装git、gitk、git-review工具。Git是一个版本控制系统、gitk是一个对commit图的可视化工具、git-review是Gerrit的命令行工具,它能使得Git clone或者提交change或者fetch变得简单。
1. 注册OpenDaylight的Gerrit账号
https://wiki.opendaylight.org/view/Submit_a_Patch#Getting_started_with_Git_and_Gerrit
此链接的第二部分Getting started with Git and Gerrit有对于注册的详细步骤。
2. 克隆你所要进行开发的项目
https://git.opendaylight.org/gerrit/#/admin/projects/
此链接给出了所有的OpenDaylight项目。当你点击某一个项目名的时候,以ALTO项目,会进入如下页面:
红色框内的命令,即为需要在terminal中输入的命令。可以点击红色框内右侧的小图标,进行复制。建议大家在登陆后选择以ssh的方式下载源码。
3. 设置基本信息
克隆好源码之后,就要进行基本信息的设置。
请注意有一步会让你输入用户名,输入你之前注册的OpenDaylight账户用户名即可。
事实上在这些操作中,最主要的是在你的./.git/config文件中加入了这个关于远程repo(仓库)的信息
4.提交Patch
4.1 将远端代码拉取到本地
这样做的目的是让你基于最新的code base进行开发,尽可能减少需要merge或者rebase的情况。
注:proxychains只是我自己用的本地代理,在执行这条命令时不需要输入proxychains,下文中出现proxychains时也可省略。
4.2 在新的分支上进行开发
比如我将在一个叫做submit-patch-guide的分支上进行我的开发。新建一个文件夹,叫做submit-patch-guide。
4.3 将你修改的文件加入staging area(暂存区)
你可以一次性添加多个文件到暂存区。
4.4 commit你在4.3中的修改到本地仓库中
-s参数是用来对commit进行签名的。关于commit的信息如何填写可以参考这个链接(推荐的commit信息格式):http://chris.beams.io/posts/git-commit/
4.5 将你的代码发布到Gerrit,等待审查者审查
在你提交成功后,你可以在git.opendaylight.org/gerrit上面找到你的提交,本例的提交截图如下:
请注意红框中的内容,OpenDaylight项目中,你每一个提交都会经过jenkins-releng的自动验证。 只有通过自动验证的代码才可能被merge。
5.更新Patch
事实这一步骤在开源社区中是最关键的,在你的代码提交后,拥有相应权限的管理员会对你的代码进行审查,他会进行review,会给你提出建议与你交流。这是一个提高你代码风格、易读性的机会。
例如他给我的建议就是希望让我的代码拥有更好的docstring。简单来说就是让我用一定的格式把每个函数的功能写出来。Python有一个可以利用docstring自动生成文档的工具。
如果你按照4中的流程重新走一遍,那么你会提交一个新的patch。这是没有必要的,下面就是本小节的内容,如何更新你的patch。要更新其实也很简单,使用如下这个命令就好了:
在执行过git commit --amend之后,你在本地的同一个commit就会被更新。你可以再输入git log确认一下没有新的commit被增加,而是原来的commit被修改。下面需要做的就是将本地commit,发送到远端,输入git review就可以了
这时候在观察你提交的change页面可以看到,你已经往同一个commit(同一个commit通过commit ID来区分,也就是下图中上面一个红色框内的内容)更新了一个patch set。
至此,一个向OpenDaylight共享代码的基本流程和基本工具已经介绍好了。最后就是贡献代码并没有大家想的那么难,希望大家的代码早日被merged!
参考资料
OpenDaylight提交patch的官方指南:https://wiki.opendaylight.org/view/Submit_a_Patch#Getting_started_with_Git_and_Gerrit
关于git的基本概念的定义:https://help.github.com/articles/github-glossary/#
Gerrit用户手册:https://gerrit-documentation.storage.useso.com/Documentation/2.12.2/intro-quick.html
Git超简单入门指南:http://rogerdudler.github.io/git-guide/