如何向OpenDaylight社区贡献代码

本文由两部分构成,第一部分简要介绍了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/

原文发布于微信公众号 - SDNLAB(SDNLAB)

原文发表时间:2016-03-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

那些吓人的 Linux 命令

哪些Linux命令会让人联想到妖魔鬼怪?不妨好好瞧一瞧! ? 每年一度的万圣节马上就要到来,是时候稍微关注一下Linux那吓人的一面了。哪些Linux命令会让...

4198
来自专栏互联网技术栈

Hbase原理解析

[HBase]——Hadoop Database的简称,Google BigTable的另一种开源实现方式,从问世之初,就为了解决用大量廉价的机器高速存取海量数...

8116
来自专栏FreeBuf

Java反序列化漏洞:在受限环境中从漏洞发现到获取反向Shell

Java反序列化漏洞可以说是Java安全的一块心病,近年来更是在安全界“出尽风头”。其实说到Java反序列化的问题,早在2015年年初的在AppSecCali大...

1162
来自专栏微服务生态

深入浅出Netflix Conductor使用

Netflix Conductor框架是典型的服务编排框架,通过Conductor还可以实现工作流和分布式调度,性能非常卓越。

8253
来自专栏大魏分享(微信公众号:david-share)

上酒桌,今儿咱保证把容器SDN的这事一把唠清楚!

容器的SDN 很多人都说2017将是容器年,大卫也这么认为。但在很长一点时间里,容器与虚拟化都是相互依存,相互补充的问题。 之前笔者发表过一篇文章,放开眼界,看...

3065
来自专栏大闲人柴毛毛

0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)

本文你将学到什么? 本文将以原理+实战的方式,首先对“微服务”相关的概念进行知识点扫盲,然后开始手把手教你搭建这一整套的微服务系统。 项目完整源码下载 h...

2.9K8
来自专栏bboysoul

linux 终端下最简单的代理方式(proxychains)

我以前写过给linux终端设置代理 这个是用polipo这个工具把socks5代理转换成为http和https代理来实现终端下代理的,那么终端下有没有原生的使...

1792
来自专栏编程

我是如何利用CSRF Get DedeCms Shell的

说实话,有一两个月没有审计大厂了,然后随便看到群里有人问dede最新有没有漏洞,就下了一套最新的dede,结果我一看还真发现了。 ? 我们发现后台添加广告的地方...

2137
来自专栏张善友的专栏

Linux 连接SQL Server支持

在Windows平台下可以直接连,而在Unix/Linux下如何连接呢?因为Unix/Linux下没有SQL Server的驱动,那么我们就需要安装驱动,这个驱...

2598
来自专栏FreeBuf

WAF绕过技巧浅谈

远程命令执行漏洞是Web应用中常见的漏洞之一,在2017年发布的10项最严重的Web应用程序安全风险列表中”注入“毫不意外的被放在了第一位。 当不可信数据作为命...

42310

扫码关注云+社区

领取腾讯云代金券