聚焦 SIG Architecture:程式碼組織

「這是 SIG 架構焦點系列訪談的第三篇,將涵蓋不同的子專案。我們將介紹SIG 架構:程式碼組織。」

「在這個 SIG 架構焦點中,我與程式碼組織子專案的成員 Madhav Jivrajani (VMware) 進行了對談。」

「介紹程式碼組織子專案」

Frederico (FSM):哈囉 Madhav,感謝您撥冗接受訪談。您可以先簡單介紹一下自己、您的職責,以及您是如何參與 Kubernetes 專案的嗎?」

Madhav Jivrajani (MJ):哈囉!我叫 Madhav Jivrajani,我擔任 SIG 貢獻者體驗的技術主管,以及 Kubernetes 專案的 GitHub 管理員。除此之外,我也為 SIG API Machinery 和 SIG Etcd 做出貢獻,但最近,我一直在協助 Kubernetes 保持在受支援的 Go 版本上的工作,也因此我參與了 SIG 架構的程式碼組織子專案。」

FSM:像 Kubernetes 這樣規模的專案,在程式碼組織方面一定有其獨特的挑戰——這樣的假設合理嗎?如果合理,您認為 Kubernetes 特有的主要挑戰有哪些?」

MJ:這是個合理的假設!第一個有趣的挑戰來自 Kubernetes 程式碼庫的龐大規模。我們有大約 220 萬行的 Go 程式碼(感謝 dims 和這個子專案的其他成員,這個數字正在穩步下降!),以及超過 240 個我們直接或間接依賴的相依性,這就是為什麼有一個專門協助處理相依性管理的子專案至關重要的原因:我們需要知道我們引入了哪些相依性、這些相依性的版本是什麼,以及有工具可以協助確保我們以一致的方式管理程式碼庫不同部分的這些相依性。」

「Kubernetes 的另一個有趣的挑戰是,我們在 Kubernetes 發布週期中發布了許多 Go 模組,其中一個例子是 client-go。然而,作為一個專案,我們也希望擁有將所有內容放在一個儲存庫中的好處,以獲得使用單一儲存庫的優勢,例如原子提交... 因此,程式碼組織與其他 SIG(如 SIG Release)合作,自動化從單一儲存庫發布程式碼到下游個別儲存庫的過程,這些儲存庫更容易使用,這樣您就不必匯入整個 Kubernetes 程式碼庫!」

「程式碼組織與 Kubernetes」

FSM:對於剛開始以程式碼方式貢獻 Kubernetes 的人來說,在程式碼組織方面,他們應該考慮哪些主要事項?您會如何總結關鍵概念?」

MJ:我認為至少在您剛開始時,要記住的關鍵事項之一是暫存目錄的概念。在 kubernetes/kubernetes 儲存庫中,您會遇到一個名為 staging/ 的目錄。此目錄中的子資料夾充當許多虛擬儲存庫。例如,發布 client-go 版本的 kubernetes/client-go 儲存庫實際上是一個暫存儲存庫。」

FSM:所以暫存目錄的概念從根本上影響了貢獻?」

MJ:正是如此,因為如果您想貢獻任何暫存儲存庫,您需要將 PR 發送到 kubernetes/kubernetes 中對應的暫存目錄。一旦程式碼在那裡合併,我們就有一個名為 publishing-bot 的機器人,它會將合併的提交同步到所需的暫存儲存庫(如 kubernetes/client-go)。這樣我們既能獲得單一儲存庫的好處,又能以模組化的方式發布程式碼以供下游使用。附註:publishing-bot 需要更多人來協助!」

「有關暫存儲存庫的更多資訊,請參閱貢獻者文件。」

FSM:說到貢獻,貢獻者人數眾多,包括個人和公司,這也一定是一個挑戰:子專案如何運作以確保標準得到遵循?」

MJ:在專案的相依性管理方面,有一個專門的團隊協助審查和批准相依性變更。這些人協助奠定了 Kubernetes 今天用於相依性管理的許多工具的基礎。此工具組有助於確保貢獻者可以以一致的方式變更相依性。該專案還開發了額外的工具來顯示正在新增或移除的相依性的統計資訊:depstat

「除了相依性管理之外,專案執行的另一個關鍵任務是暫存儲存庫的管理。用於實現此目的的工具(publishing-bot)對貢獻者完全透明,並有助於確保暫存儲存庫獲得提交給 kubernetes/kubernetes 的貢獻的一致視圖。」

「程式碼組織也致力於確保 Kubernetes 保持在受支援的 Go 版本上。連結的 KEP 提供了更多關於我們為什麼需要這樣做的背景資訊。我們與 SIG Release 合作,以確保我們盡可能嚴格且盡早地在 Go 版本上測試 Kubernetes,並致力於修復作為此過程一部分而破壞我們 CI 的變更。關於我們如何追蹤此過程的範例,請參見此處。」

「發布週期與目前優先事項」

FSM:在發布週期中,是否有任何變化?」

MJ:在發布週期中,尤其是在程式碼凍結之前,經常會有新增/更新/刪除相依性、修復需要修復的程式碼(作為我們保持在受支援的 Go 版本上的努力的一部分)的變更。」

「此外,其中一些變更也是向後移植到我們支援的發布分支的候選項目。」

FSM:目前子專案正在進行的,您想要特別強調的重大專案或主題是什麼?」

MJ:我認為最近新增的一個非常有趣且非常有用的變更(我藉此機會特別強調 Tim Hockin 在這方面的工作)是在 Kubernetes 儲存庫中引入了 Go 工作區。我們目前用於相依性管理和程式碼發布的許多工具,以及在 Kubernetes 儲存庫中編輯程式碼的體驗,都可以透過此變更得到顯著改進。」

「總結」

FSM:對這個主題感興趣的人如何開始協助子專案?」

MJ:第一步,就像 Kubernetes 中任何專案的第一步一樣,是加入我們的 Slack:slack.k8s.io,然後加入 #k8s-code-organization 頻道。還有一個程式碼組織辦公時間,您可以選擇參加。時區很難協調,所以也歡迎查看錄影或會議記錄,並在 Slack 上追蹤!」

FSM:太棒了,謝謝您!您還有其他想分享的最終評論嗎?」

MJ:程式碼組織子專案總是需要協助!尤其是在發布機器人等領域,所以請隨時參與 #k8s-code-organization Slack 頻道。」