文章目录


如何参与开源贡献

基本概念

参与开源贡献的常见方法

1)参与解答
在社区中, 帮助使用过程中遇到困难的人,帮他们解释框架的用法也算是一种贡献。
2)文档贡献
帮助框架来完善文档,比如说将英文文档翻译为中文,纠正文档里面的错误单词,这 是很多人参与开源贡献的第一步。
3)代码贡献
经过阅读源码,发现源码中有 Bug,修改后将代码提交给社区。或者,框架有一个新 的特性亟待开发,你为新功能的实现提供了解决方案,这属于代码贡献,也是一种重要的 参与开源贡献的方式。

开源社区中常见的三个身份标签

1)contributor (贡献者)
只要参与过一次贡献就算是贡献者,
2)committer (提交者)
成为 contributor 后, 如果你能保证持续贡献, 而且有扎实的技术功底, 经 PMC (管理 委员会)投票或讨论决定后,可以决定让你成为一名 committer 。Committer 和 contributor 的 区别在于, commiter 对于项目的仓库是具有写的权限的。他可以审核并合并 contributor 的 代码。而且如果成为 commiter,你还会获得一个后缀为@apache.org 的邮箱。
3)PMC (管理委员会)
Committer 中表现优秀的话,是可以成为 PMC 的。 PMC 要负责整个项目的走向,做出 一些重要的决策,要具备前瞻性的技术眼光。

如何修改 bug

背景

在我们准备这项课程的时候,实际上 kafka 输入插件,kafka 输出插件和 doris 输出插件 是各有一个 bug 的, 当时 kafka 输入插件的 bug 在社区中已经有了一个解决方案。 Kafka 输

出插件的 bug ,和 doris 输出插件的 bug 是我们来做的修改, 而且修改后的结果提交给了 SeaTunnel 社区,并且成功实现了代码合并。下面我们复现一个 doris 输出插件bug 的场景, 并且在这个基础上向大家讲解如何一步步去参与开源贡献,成为一名源码贡献者。

问题复现

1)场景
当时, 向 doris 插入数据时会抛出一个 ClassCastException,也就是类型的强转错误。 这 里会报 Java.Util.ArratList 不能强转为 java.lang.CharSequence 。在反复确认我们的配置文件
写的没问题后。我们仔细阅读了一下控制台打印的栈追踪信息。
教你如何成为开源项目SeaTunnel的贡献者_java

2)问题定位
通过最后打印的栈追踪信息,我们可以知道出错的位置在 DorisOutPutFormat.java 文件
的第 210 行, 于是我们需要去idea 里面打开源码看一下这里的代码是怎么写的。
教你如何成为开源项目SeaTunnel的贡献者_java_02

分析问题

定位到 210 行后, 我们看到下面的问题。
它要将一个batch (它是一个ArrayList 集合)强转为CharSequence (字符序列)。这显然是错误的。
教你如何成为开源项目SeaTunnel的贡献者_解决方案_03

要想解决这个问题, 我们要了解这段代码的意图。
这需要一定的背景知识, SeaTunnel 的 dorisSink 其实是依托于 doris 的 stream load 这种 导入方式来实现的。而 stream load 其实是通过 http 请求的形式,向 doris 导入数据。而且 doris 提倡提交数据的时候一定要成批地向 doris 导入数据。如此一来,我们知道bacth 就是 用来积攒数据的一个集合,而向远端通过 http 发送数据必然要经过一个序列化的过程。结 合上下文来看, 我们可以判断这段代码的目的,就是要将 batch 里的所有数据,按照某个规
则转为字符串, 为 http 请求做准备。 分析过程如图所示。
教你如何成为开源项目SeaTunnel的贡献者_java_04

确定问题的解决方案

我们需要看一下 String 提供的这个join 静态方法,对参数的要求。
教你如何成为开源项目SeaTunnel的贡献者_分布式_05

我们发现, join 方法的第二个参数是一个 CharSequence 类型的可变长参数, 这意味着
我们可以向里面传递一个 CharSequence 类型的数组。那么代码可以修改成下面这个样子。
教你如何成为开源项目SeaTunnel的贡献者_分布式_06

方案验证

1)重新打包
接着,我们可以重新编译这个包,把重新编译的包放到我们的集群上, 再跑一次任务 看看能不能通过。在这个过程中,因为跨平台性的问题(windows 和 linux 的路径不通用, 其 实也是个 bug),有一些单元测试我们无法通过,因此我们取个巧,用下面的方式进行编译
打包, 跳过单元测试和代码的格式审查。
mvn clean package -D maven.test.skip=true -D checkstyle.skip=true
2)使用新的包
接着, 我们使用重新编译过的 SeaTunnel 执行我们之前向Doris 导入数据的命令。

3)到我们的 Doris 上查看数据是否成功导入
这次我们的数据成功导进了 doris。而且我们的程序并没有因为类型转换错误而崩溃。
教你如何成为开源项目SeaTunnel的贡献者_分布式_07

4)小结
经过上面的这些步骤,我们确信问题是出在源码的问题上。接下来我们要开始向社区
汇报这个 bug,并向社区提供我们的解决方案。

创建 issue

什么是 issue

每个 github 的仓库下都会有一个项目独立的 issue 板块。 在这个板块里面,大家可以提 出自己的问题, 也可以去和大家讨论 SeaTunnel 是否要添加一些特性。而且, 这是一个可以
汇报 bug 的地方。
教你如何成为开源项目SeaTunnel的贡献者_java_08

开源社区通常会要求你在提交代码合并的请求前, 先去创建一个 issue。这是一个好的 习惯, 就像是我们抓贼要先立案,逮捕要先有逮捕令。创建 pull request 之前先创建 issue , 然后把 pr 关联到我们创建的 issue 上, 让每一次改动,都有据可查。

如何创建 issue

1)点击 new issue 按钮进入下一个页面
教你如何成为开源项目SeaTunnel的贡献者_java_09

2)选择你要创建的 issue 类型, 我们选择 bugreport(bug 汇报) ,进入下一个页面
教你如何成为开源项目SeaTunnel的贡献者_分布式_10

3)按照表单的提示,一步步填写完整。注意,表单提醒你,创建 issue 之前应该先去搜索
社区中是否已经有讨论同一问题的 issue 。同样的问题,无需重复。
教你如何成为开源项目SeaTunnel的贡献者_github_11

4)按照要求填写表单后,点击下方的 Submit new issue。创建这个 issue。
教你如何成为开源项目SeaTunnel的贡献者_github_12

5)查看我们已经创建好的 issue
教你如何成为开源项目SeaTunnel的贡献者_java_13

创建 pull request

pull request 的意思是拉取请求, 也就是我这有代码写好了,请你把我的代码拉过去吧。 所以, 发起拉取请求之前应该要先有自己的代码。这样一来, 创建 pull request 并不是一上 来就创建, 而是要先搞好自己的代码仓库。
pull request 的简称是 pr。
5.4.1 fork 项目到自己的仓库中
对于第一次对 SeaTunnel 贡献的同学来说,应该先 fork (叉子) 官方的仓库。
教你如何成为开源项目SeaTunnel的贡献者_github_14

点击 fork 按钮后,你自己的 github 账号上会出现一个一模一样的仓库。如下图所示。
教你如何成为开源项目SeaTunnel的贡献者_分布式_15

git clone 自己 fork 的仓库

教你如何成为开源项目SeaTunnel的贡献者_github_16

拿到这个 url,在自己电脑上的任意目录上使用下面的 git 命令去clone 这个仓库。

修改代码

1)在项目的跟目录右键,用 idea 打开我们 clone 的项目
2)在我们之前确定的位置,改代码
教你如何成为开源项目SeaTunnel的贡献者_github_17

3)commit 提交
(这个地方应该先建一个分支,从 dev 上分出来,在新建分支的基础上 commit。这里成反
面教材了_
教你如何成为开源项目SeaTunnel的贡献者_java_18

4)push 到我们fork 的仓库里去,这个时候在远端的目标分支上, 我们写一个新的分支名
教你如何成为开源项目SeaTunnel的贡献者_解决方案_19

创建 PR

1)去我们的 github 上, 看一下自己的仓库,发现它会提示我们可以创建一个pr 了。 点击这
个按钮,进入下一个页面
教你如何成为开源项目SeaTunnel的贡献者_分布式_20

2)在新的页面中,按照对话框里给出的模板,说明我们这个 pr 的目的。最终,不要忘了 和你之前的 issue 关联起来,关联的方式就是直接粘贴你创建的issue 的链接。
教你如何成为开源项目SeaTunnel的贡献者_解决方案_21

3)全部搞定之后, 点击 create pull request 按钮,创建一个pr
教你如何成为开源项目SeaTunnel的贡献者_github_22

4)我们还可以看到 github 会判断我们做了哪些修改。红色的地方表示我们删除的代码, 绿 色的地方表示我们新增的代码。因为 github 的差异是按行进行标记的。所以如果你就改了 一个字母。也是一个删除行和新增行的效果。
教你如何成为开源项目SeaTunnel的贡献者_java_23

5)我们的PR 已经提交完毕,我们可以看到github会启动一个自动的检查。这个叫做CI/CD。 持续交付/持续部署的意思。简单来说,你上传的代码,云端会自动拉取,然后自动地跑一
边编译,然后进行单元测试,代码格式等一系列检查。这些测试都通过后,你的代码才有教你如何成为开源项目SeaTunnel的贡献者_分布式_24

成功成为源码贡献者

过一段时间就可以回来看一下你的 pr 了。我们看到有一个 apache member 审核了我们 的代码,并将我们的代码合并到了项目中。以后,大家使用 seatunnel 将数据从 flink 写入 doris,就有你的一份功劳了。
教你如何成为开源项目SeaTunnel的贡献者_解决方案_25

你的发言记录上,会出现 contributor 的标记。
教你如何成为开源项目SeaTunnel的贡献者_kafka_26

弄完这些, 就算是 SeaTunnel 的源码贡献者啦。

寻找贡献机会

Apache 的开源项目中, 社区成员们通常会维护一个待办列表,里面是一些好做的任务。
适合新手上路。
教你如何成为开源项目SeaTunnel的贡献者_kafka_27