作为一个程序员,给世界上顶级的apache社区贡献一下自己的代码,成为一个apache contributer,把这个写到简历里,是不是觉得很爽,下面我结合apache flink来简单讲讲如何给apache 贡献你的第一行代码。
当我们想给apache贡献代码的时候,想必你是遇到了一个apache项目的bug、或者是想添加一个新功能。这时候我们可以这样做,比如对于一些很小的bug、非常明显的bug、或者一些非常小的功能的改进,我们可以直接在https://issues.apache.org/上创建一个ISSUE。比如说我创建的这个issue,https://issues.apache.org/jira/browse/FLINK-16646 ,这个ISSUE主要的问题是flink在读取处理多个orc文件的时候会抛出来一个空指针异常。
对于一些稍微大点的改动,最好是先发一个讨论到flink的邮件列表,听取一下大家的意见.如果是一些更大的改进,需要开启一个FLIP (Flink Improvement Proposals),
在这个地址,https://cwiki.apache.org/confluence/display/FLINK/Flink+Improvement+Proposals ,大家经过讨论之后,最后发起投票,在有3个committer通过之后,就可以自进入开发阶段了。然后可以创建相关的issue或者其子issue。
我觉得没有必要刻意去issue列表去找issue,其实只是你在工作或者学习的过程中,一定会遇到各式各样的问题,也许是遇到了一个bug,也许是发现开源软件无法满足我们的需求,这个时候你可以先去issue列表找找有没有相关的问题,如果有的话,看看现在什么进度了,可以一起参与进来,如果没有,可以自己提交一个。
下面我们讲讲怎么具体开发一个issue。
首先我们要有一个自己的github账号,我们需要把flink的代码fork到自己的账号下,打开https://github.com/apache/flink,点击这个fork按钮,之后我们就会在我们自己的账号下看到相应的工程了。
之后我们就可以把刚才fork的flink的代码下载到我们的本地,可以用下面的命令:
cd my_workspace
git clone https://github.com/zhangjun0x01/flink.git
接下来我们添加一个apache的远程仓库,主要是为了后期更新代码。
git remote add apache https://github.com/apache/flink.git
之后执行查询远程仓库命令git remote -v,可以看到有两个远程仓库。
origin https://github.com/zhangjun0x01/flink.git (fetch)
origin https://github.com/zhangjun0x01/flink.git (push)
apache https://github.com/apache/flink.git (fetch)
apache https://github.com/apache/flink.git (push)
接下来,添加一个新分支,用于开发我们的代码。分支的名字可以自己随便起,比如为了方便区分和查询,我们可以起一个和这issue同名的分支名,或者根据功能起一个自己好识别的分支名.
我这个是我起了一个和这个功能相关的分支名.
https://github.com/zhangjun0x01/flink/tree/flink-orc-input
然后我们现在就可以在这个分支上开发自己的代码了,开发完代码之后,我们需要检查一下代码的规范,这个也就是checkstyle,具体的使用可以参考这篇文章: 【flink教程-在IntelliJ IDEA 中玩转 checkstyle】
最后开发完了相关的代码之后,需要在相关的测试类里面添加相应的测试代码,如果添加一个新功能,还需要添加相应的文档。
我们开发完了代码之后,这段时间可能flink的主分支已经有了代码的更新,所以我们为了避免冲突,还需要把最新的代码更新下来。首先切换到主分支
git checkout master
git pull apache master
之后,我们切换到我们的分支:
# 切换到自己的分支
git checkout flink-orc-input
# 添加刚才改动的代码,如果不确定改了哪些,可以git status看一下
git add your_code
git commit -m '注释'
# 把变化的代码添加到我们的分支
git rebase
# 提交分支到自己的仓库
git push origin flink-orc-input
我们提交分支之后,就可以提交相应的PR(Pull Request)了,比如我的这个PR: https://github.com/apache/flink/pull/11434 。
提交的时候注意标题要写成 [ISSUE] + title的形式,比如 [FLINK-16646] [orc] Flink read orc file … 这样的话就能把你这个pr和issue自动关联上。
之后我们就能在相应的issue页面看到关联的PR
你的代码提交完之后,之后会有相关的committer或者其他人帮你review代码,当然你也能帮别人review代码,这个也是你贡献社区的一种方式。
如果committer认同了你的改动,然后他就会把你的改动合并到master分支,或者是其他相应的分支。
比如我这个,不仅仅是改了master,还改了1.10分支,所以这里有两个关联的PR。
等下一次版本发布的时候,然后你的名字就出现了apache的官网上,你就成了apache的contributer。 https://flink.apache.org/news/2020/07/06/release-1.11.0.html#list-of-contributors
上面我们提到,我们在提交了一个PR之后,需要写一个测试用例,那么其他人在开发新功能的时候也是写了大量的测试用例,当flink新发布了一个版本,你想要了解最新功能的使用方法,那么如何去获取一手的最新资料呢,去源码中学习相关的测试类无疑是最好的方法,因为这些测试用例都是这个功能的开发者提供的,是最权威的。
因为新开发的功能一般都是开发者自己做了自测,没有经过生产环境大规模的各种测试用例的测试,所以新出来的版本在使用的过程中很容易出现一些意想不到的问题,所以当我们使用新版本的时候,出了问题的时候,这个时候网上一定搜不到答案,想解决问题,就只能看源码了,这个就是一个很好的成长过程。
当我们使用了免费的开源服务的时候,遇到问题,我们可以帮忙解决问题,然后把解决方案贡献给社区,形成一个良性循环,这样才能让社区发展的越来越好,我们所有人都从中受益。