如何参与开源贡献

  • 参与开源贡献的常见方法有多种:

1)参与解答

在社区中, 帮助使用过程中遇到困难的人,帮他们解释框架的用法也算是一种贡献。

2)文档贡献

帮助框架来完善文档,比如说将英文文档翻译为中文,纠正文档里面的错误单词,这 是很多人参与开源贡献的第一步。

3)代码贡献

经过阅读源码,发现源码中有Bug,修改后将代码提交给社区。或者,框架有一个新的特性亟待开发,你为新功能的实现提供了解决方案,这属于代码贡献,也是一种重要的参与开源贡献的方式。

4)参与Meetup分享

参与社区定期举行的线上/线下Meetup,以讲师或志愿者的身份参与其中,参与Apache SeaTunnel实践分享、市场、运营等活动,均属于为社区做贡献。

5)投稿

撰写关于Apache SeaTunnel的话题,无论是技术部署文档,还是实践经验、参与开源分享经验总结等,都可以投稿给社区(加小助手微信17743592110),获得发表即可视为非代码贡献。

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

1)contributor (贡献者)

只要参与过一次贡献就算是贡献者,

2)committer (提交者)

成为 contributor 后,如果你能保证持续贡献,而且有扎实的技术功底,经PMC(管理委员会)投票或讨论决定后,可以决定让你成为一名committer 。Committer和 contributor的区别在于,commiter对于项目的仓库是具有写的权限的。他可以审核并合并contributor的代码。而且如果成为commiter,你还会获得一个后缀为@apache.org 的邮箱。

3)PMC(管理委员会)Member

Committer中表现优秀的话,是可以成为PMC Member的。PMC Member要负责整个项目的走向,做出一些重要的决策,要具备前瞻性的技术眼光。

如何修改bug

修改Bug是参与项目贡献的重要途径之一,下面举例说明如何修改Apache SeaTunnel项目中的Bug。

比如,我们发现Kafka输入插件,Kafka输出插件和Doris输出插件是各有一个bug的,当时kafka输入插件的bug在社区中已经有了一个解决方案。Kafka输出插件的bug,和Doris输出插件的bug是我们来做的修改,而且修改后的结果提交给了SeaTunnel社区,并且成功实现了代码合并。下面我们复现一个Doris输出插件bug的场景,并在这个基础上向大家讲解如何一步步去参与开源贡献,成为一名源码贡献者。

问题复现

1)场景

当时,向Doris插入数据时会抛出一个ClassCastException,也就是类型的强转错误。这里会报Java.Util.ArratList不能强转为java.lang.CharSequence。在反复确认我们的配置文件写的没问题后,我们仔细阅读了一下控制台打印的栈追踪信息。

2)问题定位

通过最后打印的栈追踪信息,我们可以知道出错的位置在DorisOutPutFormat.java 文件的第210行,于是我们需要去idea里面打开源码看一下这里的代码是怎么写的。

3)分析问题

定位到210行后, 我们看到下面的问题。

它要将一个batch(它是一个ArrayList集合)强转为CharSequence(字符序列)。这显然是错误的。

要想解决这个问题, 我们要了解这段代码的意图。

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

4)确定问题的解决方案

我们需要看一下 String 提供的这个join 静态方法,对参数的要求。

我们发现, join 方法的第二个参数是一个 CharSequence 类型的可变长参数, 这意味着我们可以向里面传递一个 CharSequence 类型的数组。那么代码可以修改成下面这个样子。

5)方案验证

  • 重新打包

    接着,我们可以重新编译这个包,把重新编译的包放到我们的集群上, 再跑一次任务 看看能不能通过。在这个过程中,因为跨平台性的问题(windows 和 linux 的路径不通用, 其 实也是个 bug),有一些单元测试我们无法通过,因此我们取个巧,用下面的方式进行编译打包, 跳过单元测试和代码的格式审查。

mvn clean package -D maven.test.skip=true -D checkstyle.skip=true

  • 使用新的包

    接着, 我们使用重新编译过的 SeaTunnel 执行我们之前向Doris 导入数据的命令。
  • 到我们的 Doris 上查看数据是否成功导入

    这次我们的数据成功导进了 doris。而且我们的程序并没有因为类型转换错误而崩溃。

6)小结

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

如何创建 issue

什么是 issue

每个 Github 的仓库下都会有一个项目独立的 issue 板块。在这个板块里面,大家可以提出自己的问题,也可以去和大家讨论 SeaTunnel 是否要添加一些特性。而且,这是一个可以汇报 bug 的地方。

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

创建 issue

1)点击 new issue 按钮进入下一个页面

2)选择你要创建的 issue 类型,我们选择 bugreport(bug 汇报),进入下一个页面

3)按照表单的提示,一步步填写完整。注意,表单提醒你,创建 issue 之前应该先去搜索

社区中是否已经有讨论同一问题的 issue 。同样的问题,无需重复。

4)按照要求填写表单后,点击下方的 Submit new issue。创建这个 issue。

5)查看我们已经创建好的 issue

如何创建 pull request

pull request 的意思是拉取请求, 也就是我这有代码写好了,请你把我的代码拉过去吧。 所以, 发起拉取请求之前应该要先有自己的代码。这样一来, 创建 pull request 并不是一上 来就创建, 而是要先搞好自己的代码仓库。

pull request 的简称是 pr。

5.4.1 fork 项目到自己的仓库中。

对于第一次为 SeaTunnel 做贡献的同学来说,应该先 fork (叉子) 官方的仓库。

点击 fork 按钮后,你自己的 github 账号上会出现一个一模一样的仓库。如下图所示。

git clone 自己 fork 的仓库

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

如何修改代码

1)在项目的跟目录右键,用 idea 打开我们 clone 的项目

2)在我们之前确定的位置,改代码

3)commit 提交

(这个地方应该先建一个分支,从 dev 上分出来,在新建分支的基础上 commit。这里成反面教材了_)

4)push 到我们fork 的仓库里去,这个时候在远端的目标分支上, 我们写一个新的分支名

如何创建 PR

1)去我们的 github 上, 看一下自己的仓库,发现它会提示我们可以创建一个pr 了。 点击这个按钮,进入下一个页面

2)在新的页面中,按照对话框里给出的模板,说明我们这个 pr 的目的。最终,不要忘了 和你之前的 issue 关联起来,关联的方式就是直接粘贴你创建的issue 的链接。

3)全部搞定之后, 点击 create pull request 按钮,创建一个pr

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

5)我们的PR 已经提交完毕,我们可以看到github会启动一个自动的检查。这个叫做CI/CD。 持续交付/持续部署的意思。简单来说,你上传的代码,云端会自动拉取,然后自动地跑一边编译,然后进行单元测试,代码格式等一系列检查。这些测试都通过后,你的代码才有被合并的可能。

6)接下来你可以去干点别的,自动测试的时间会比较久,而且你需要等待社区人员注意到你的Pull Request​。

成功成为源码贡献者

过一段时间就可以回来看一下你的 pr 了。我们看到有一个 apache member 审核了我们 的代码,并将我们的代码合并到了项目中。以后,大家使用 seatunnel 将数据从 flink 写入 doris,就有你的一份功劳了。

你的发言记录上,会出现 contributor 的标记。

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

寻找贡献机会

Apache 的开源项目中, 社区成员们通常会维护一个待办列表,里面是一些好做的任务。适合新手上路。

本文由 白鲸开源 提供发布支持!

成为Apache SeaTunnel贡献者的N种方式的更多相关文章

  1. 【转】Apache 配置虚拟主机三种方式

    Apache 配置虚拟主机三种方式  原文博客http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html 一.基于IP 1. 假 ...

  2. Apache和Nignx基于三种方式搭建web站点并设置用户访问控制达到优化整个站点性能

    个人用户主页: 1:Vim  /etc/http/con.d/userdir: UserDir  disabled   //个人用户主页开启 UserDir   public_html    //指定 ...

  3. linux下的apache服务自启动的几种方式

    1,如果是安装包安装在Linux系统下,那么可以使用 [root@localhost ~]# service httpd restart 从而可以开启或者重启apache服务 与此同时,它的标准方式是 ...

  4. Apache 配置虚拟主机三种方式

    一.基于IP 1. 假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP: [root@localhost root]# ifconfig et ...

  5. ***阿里云ECS实战配置虚拟主机 + Apache 配置虚拟主机三种方式

    阿里云ECS实战配置虚拟主机 买了一台ECS阿里云服务器,性能感觉有点富余,想着可以陪着虚拟主机多一些WWW目录好放一些其他的程序.比如DEMO什么的. 今天研究了下,主要是就是做基于不同域名的虚拟主 ...

  6. [转]Apache 配置虚拟主机三种方式

    转自: http://www.cnblogs.com/hi-bazinga/archive/2012/04/23/2466605.html 一.基于IP 1. 假设服务器有个IP地址为192.168. ...

  7. apache配置虚拟主机的三种方式

    Apache 配置虚拟主机三种方式   一.基于IP 1. 假设服务器有个IP地址为192.168.1.10,使用ifconfig在同一个网络接口eth0上绑定3个IP: [root@localhos ...

  8. Apache Spark探秘:三种分布式部署方式比较

    转自:链接地址: http://dongxicheng.org/framework-on-yarn/apache-spark-comparing-three-deploying-ways/     目 ...

  9. apache、nginx的虚拟域名配置和rewrite配置,以及web缓存的几种方式

    web缓存一般用来缓解数据库压力. 通常有几种方法,文件静态化,缓存服务memcached.redis等. 伪静态,一般指在url上貌似访问静态html页的形式,这样有利于搜索引擎访问到网站页面,实际 ...

  10. apache+tomcat负载均衡3种实现方式

    1.首先安装apache,编译完成后,通过IP:端口就行访问,如果返回“it workers”证明Apache启动成功(注意apache的工程路径要正确) 2.下载JK,下载地址为http://mir ...

随机推荐

  1. ISO pod 使用

    pod 安装 相关依赖包 新建podfile 文件 pod init 编辑podfile文件添加第三方库 // pod '第三方依赖库名', '版本号' pod 'SDWebImageSwiftUI' ...

  2. Java与React轻松导出Excel/PDF数据

    前言 在B/S架构中,服务端导出是一种高效的方式.它将导出的逻辑放在服务端,前端仅需发起请求即可.通过在服务端完成导出后,前端再下载文件完成整个导出过程.服务端导出具有许多优点,如数据安全.适用于大规 ...

  3. 含税仅498元起!复旦微ARM + FPGA SoC全国产工业核心板,性价比真高!

     

  4. VS图片

  5. 移动WEB开发之 -- flex布局

    flex布局原理 常见的父项属性 flex-direction设置主轴方向 justify-content 设置主轴上的子元素排列方式 flex-wrap属性 align-items属性 align- ...

  6. yb课堂 视频详情页模块开发《三十八》

    CourseDetail基础模块开发 CourseDetail模块开发,拆分组件 CourseDetail.vue Header.vue Course.vue Tab.vue Summary.vue ...

  7. C#——接口

    先来看看微软官方对接口的定义与说明. 接口定义协定. 实现接口的类或结构必须遵循它的协定. 接口可以从多个基接口继承,类或结构可以实现多个接口. 接口可以包含方法.属性.事件和索引器. 接口本身不提供 ...

  8. sql server 编写函数,去除小数点后多余的0

    sql server 编写函数,去除小数点后多余的0 要在 SQL Server 中编写一个函数来去除小数点后多余的零,你可以使用以下示例的方法: CREATE FUNCTION dbo.Remove ...

  9. [oeasy]python0127_中文系统_gbk_BIG5_南极星_内码转化

    中文系统bgk 回忆上次内容 汉字字形通过 点阵式打字机 像素级寻址的屏幕 进入了计算机的世界   ​   添加图片注释,不超过 140 字(可选)   在海峡对岸的台湾同胞 也进入了汉字时代   他 ...

  10. [oeasy]python0090_极客起源_wozniac_苹果公司_Jobs_Wozniac

    极客起源 回忆上次内容 上次回顾了 DEC公司的兴起 从IBM的大型机 到DEC的小型机Mini Computer 再到DEC的终端 VT-100 计算机基础元器件发生了进化 从ENIAC的 电子管 ...