如何參與開源貢獻
- 參與開源貢獻的常見方法有多種:
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 的開源專案中, 社群成員們通常會維護一個待辦列表,裡面是一些好做的任務。適合新手上路。
本文由 白鯨開源 提供釋出支援!