怎么给openstack提交patch?

HULK虚拟化团队 360云计算

女主宣言

该文章出自于HULK虚拟化团队(网络小分队),主要是给大家分享一下给openstack官方提交代码的一些注意事项和一些小坑,希望大家从中获取一些启发,在以后的openstack使用中也能积极的回馈社区。 PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

背景描述

在openstack的自动建网设计中,使用特殊建网步骤的时候触发了一个neutron bug,最后通过trace源码解决了这个问题。现在是想把这个bug和相应的patch提交给社区,让社区帮忙review一下,同时也算是取之于社区,反馈于社区吧。

摘要

其实在平常的使用过程中,由于生产环境的特殊性,有可能会遇到一些openstack的代码方面的bug。一般分为两种情况。 第一种:就是遇到了社区已有的bug,一般在这个时候,会先google,然后看看官方是否已经有了相关的bug提交和patch描述。例如我们遇到的dnsnameserver patch就是这种类型,当初在遇到neutron 建网时候dns顺序会自动排序,不能和给定的参数顺序保持一致,当初遇到这个问题的时候,google发现ustack已经提交了这个patch,需求与我们的完全吻合,接下来就是消化这个patch,然后将该patch手动打到我们的neutron代码中。

第二种:就是遇到了社区也没有遇到的bug,例如本文提到的特殊建网步骤触发的neutron bug,这时候我们只能根据报错,自己trace源码来解决问题,要做到百分百复现和解决,然后将该bug和patch提交给社区,回馈社区。

整体流程:

这里我主要记录一下给社区提交bug和patch时候的一些流程和坑。

一、提交一个bug

在我们经过google和社区bug搜索,都确定我们遇到的bug都没有被提交过,那就可以从下图开始report a bug。

开始提交bug,project 选择 neutron,简单描述为:can not reload dnsmasq after update dhcp port,

然后出来一些与我们报告的bug相类似的bug list,该list中bug 有 invalid的,fix 的,和正在进行的等等,先看一遍有没有一样的,没有就继续提交。

然后点击仍然要提交一个新的bug,最后有一个bug概述,这里我对该bug的描述如下。

至此一个bug就提交成功了,还是挺简单的。然后如果我们自己想改这个bug,那就直接将该bug assigned给自己。同时调整status为in progress。

然后等待该bug notify 社区的其他的人。大概一天左右会有人对该bug 按重要性评级等等,这里可能是该bug藏得比较深,所以重要性被定了个low。如下图。

OK,至此,bug提交和评级等就算结束了。接下来就是和别人讨论该bug。我们这里需要给该bug提交patch。

二、提交patch

首先:我们要提交代码,这里官方默认的是用ssh方式提交,所以先设置一下launchpad的ssh key

设置您的 ssh key密钥,在linux下,使用ssh-keygen -t rsa命令生成秘钥对,复制~/.ssh/id_rsa.pub的内容,并上传到 SSH keys下,将key复制到这里,如下图:

然后在这里就能看到提交的ssh-keys了,这里顺便能看到我们的karma,刚开始还是0,karma就是威望了,在社区贡献越大,karma值越高,以后提交代码被通过的速度越快等。

然后登陆https://review.openstack.org是OpenStack代码审查页面,使用Launchpad账户登录。登陆后进入如下界面

设置你openstack 的Gerrit的SSH key, gerrit就是与git配合的代码review服务器,可参考http://blog.csdn.net/benkaoya/article/details/8680886

导入第一步中的公钥,进入setting即可,然后将前面ssh key复制到这里即可

三、提交代码

首先,我们下载相应代码


mkdir openstack
cd openstack
git clone https://github.com/openstack/neutron -b master

然后配置本地计算机


设置 git 全局配置:
打开一个终端。
运行 git config --global user.name "Firstname Lastname" 命令。
运行 git config --global user.email "your_email@youremail.com" 命令。
安装 git-review 工具:
对于 Ubuntu 12.04 或更高版本,在一个终端中运行 sudo apt-get install git-review 命令。
对于 Ubunu 12.04 之前的版本,则运行 sudo pip install git-review 命令。
配置您的项目以了解 Gerrit:
打开一个终端并转到项目目录,例如 neutron。
运行 git review -s 命令。系统会要求您输入您的  username 并按下 Enter 键。 这里我的是wbaoping

git review的时候是连到openstack的官方的gerrit代码审核去了,官方使用的代码审核是通过review.openstack.org的29418端口,所以这里肯定得保证与该端口的连通性。

这里我们的普通网络都不能正常ssh 29418,但是国外的vps可以正常访问。所以断定是该ssh端口被墙了。

下面是两篇专门针对openstack git review被墙的问题解决方法:


http://kiwik.github.io/openstack/2014/08/26/git-review%E6%8F%90%E4%BA%A4%E4%BB%A3%E7%A0%81%E5%A4%B1%E8%B4%A5%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/

这里我们使用https代替ssh的方式

这里该方式有个坑:

注意:我们在使用自动生成的http密码,这个密码生成的有"/",这样容易对url产生误差。所以会报http地址无法解析等,所以我们得让重新生成密码,知道生成的密码没有‘/’,多让生成几次,让生成不带/的http密码。

然后, git remote set-url gerrit https://wbaoping:密码串@review.openstack.org/openstack/neutron.git

最后执行 git-review -s,初始化git review环境

然后开始修改该bug,将其设置为In Progress ,表示正在修改该bug

然后在下载的代码目录中修改相应的patch文件,修改完成以后 git commit -a,提交commit消息,这里是我写的第一版的commit信息。 最后git review提交代码到gerrit上。

四、git review时候的一些坑

这里第一个报错,这里说明我们还没有完成开发者手册 在gerrit上看一下,确实没有agree开发agreement 接下来就是填一下这个agreement。首先选个人contributor。注意下面的联系方式不能空白。不然还是不给过的。这里点save的时候报错。

该报错可参考:

https://ask.openstack.org/en/question/56720/cannot-store-contact-information-when-updating-info-in-openstack-gerrit/

这里主要是看首先是Foundation Member,然后Primary Email Address与gerrit上的email必须保持一致,这里我的Email写错了,与gerrit上的Email不一致,所以会报这个内部错误

这样就完成了个人协议的签署,我们可以给gerrit提交代码了。继续git review, done,代码提交成功

然后到gerrit上查看如下,最后就等社区的专家们review了。

至此所有流程描述完毕。

接下来会对我们的patch中的一些问题,再开一篇文章描述。比如:commit写的不好的问题,单元测试的问题。

总结

给社区贡献感觉是一个非常严谨的事,可能就两三行的修改,但是流程会很多,尤其是第一次提交的话,可能会持续很长时间,最后可能还不一定被merge。但是整体的过程对提交者的提升还是挺大的,因为平常可能公司内部提交代码时候,对commit的规范与否不会很追究。更不用说单元测试了。所以多参与社区对自己的全方位提升有好处。也使自己以后的开发中更加严谨和规范化。