2021-05-12 14:32:11
改進GitHub工作流的15個建議
我已經有十多年的軟體開發經驗,參與過很多開源專案和非開源專案。在這些專案中,我們使用GitHub作為程式碼共同作業平台。在這十年中,根據專案的不同,我經歷了各種開發流程。在這篇文章裡,我將分享我認為最為高效和實用的開發流程,它可以被用在各種軟體開發專案上,開發出高品質的軟體。
高品質的軟體有很多屬性,比如健壯性、可測性、彈性、模組化、可維護性、可用性、安全性、高效能、可伸縮性等,還有其他很多屬性視具體的專案而定。本文主要關注以下幾點:
- 良好的文件:README、文件頁面、變更紀錄檔。
- 良好的編碼規範。
- 版本管理。
- 自動化測試:不需要太多,專注在功能性非回歸測試就可以了。
- 開發者體驗。
為了達成上述目標,我建議使用開源工具來協助和自動化大部分任務。如果你在開發開源專案,可以將程式碼託管在GitHub上。Git和GitHub已經徹底改變了開源專案的開發方式,Git成為版本管理事實上的標準,而GitHub成為程式碼共同作業的主要平台。
GitHub官方建議的開發流程叫作github flow,官網上提供了詳細的文件https://guides.github.com/introduction/flow。大部分開源專案都遵循這一流程,然後加入一些細微的調整。
GitHub工作流非常靈活,它沒有規定如何發布版本和記錄變更,沒有規定如何合併PR(拉取請求),沒有規定使用哪一種工具,沒有規定程式碼提交標準,沒有規定如何進行程式碼評審,一切都取決於開發者自己。不同的團隊有不同的需求,所以並不存在標準的解決方案。
以下是根據我的經驗總結出來的清單。我主要專注於JavaScript開發,所以我提到的很多工具都是JavaScript生態系統的一部分,不過同樣的原則也適用於其他程式語言。
1.通過GitHub的專案功能給問題安排優先順序和跟蹤進度
2016年9月,GitHub引入了專案功能,讓開發者可以建立看板風格的面板,用於管理、組織和跟蹤工作內容。如果你在使用GitHub,我強烈建議使用這一個功能。更多的細節可以參看https://help.github.com/articles/tracking-the-progress-of-your-work-with-project-boards。
2.使用標籤給問題分類
GitHub提供了非常好用的過濾功能。如果你在開發開源專案,一定希望有人參與到你的專案裡來,並為他們提供良好的開發體驗。通過使用標籤給問題分類,開發者可以更方便地檢視問題列表,從而節省時間。
3.使用GitHub模板
使用問題模板和PR模板將給你帶來很大好處,讓開發者在提交bug和特性請求時使用標準模板可以讓你獲得足夠的資訊,以便在後續修復bug或開發新特性。
提交bug的通用指南
在提交bug之前確保已完成以下兩個步驟:
- 確保你執行的是最新版本的程式碼。
- 通過搜尋功能確保同樣的bug之前沒有被提交過。
bug報告應該包含如下資訊:
- 概要:簡單的問題描述。
- 重現步驟:你是如何發現這個bug的?如何重現?
- 預期行為:預期行為應該是怎樣的?
- 實際行為:實際行為是怎樣的?
- 參照:相關ticket或資訊來源的連結。
- 如果可能,新增一些包含視覺化元素的附件文件,比如截圖、視訊或gif圖片。
PR的通用指南
- 確保不存在要解決同樣問題的PR。
- 通過問題跟蹤器查詢相關的問題。
- 討論需要作出哪些變更。
- 讓別人知道你在解決這個問題。
- 在branch上開發,而不是master。
- 提供有意義的PR描述。
- 遵循專案的提交規範。
- 寫好你的PR描述。
- 在描述中加上問題連結。
4.使用命令列
控制台是我們的好朋友。從我的經驗來看,在開發開源專案時,通過命令列來操作GitHub是最高效的一種方式。雖然有很多很好的GUI,但都沒有命令列那麼靈活。還有一些非常好用的命令列工具,也只有使用這些工具才能讓開發者如虎添翼:
- hub對git命令進行了封裝,不管你是一個初學者還是一個有經驗的老手,hub都可以幫到你。可以用它拉取程式碼庫、瀏覽計畫頁面、建立分支,甚至是提交PR,這些操作都可以在命令列上完成。專案地址https://hub.github.com。
- tj/git-extras是一組git工具,可用於檢視程式碼庫概要、更新變更紀錄檔、檢視貢獻者提交百分比等。專案地址https://github.com/tj/git-extras。
5.遵循嚴格的提交規範
定義清晰的提交規範,並嚴格遵循,以下是一些通用指南:
- 每一次修復作為單獨的變更來提交。
- 提供有意義的提交資訊。
- 在提交資訊的第一行提供簡短的描述(50到100個字元)。如果不明白為什麼要這樣做,看看gitk或git log --oneline命令的輸出就知道了。
- 在訊息體中包含問題的連結。
6.定義編碼規範並設定預提交勾點
定義編碼規範,並通過預提交勾點來強制執行這些規範,這樣非常有助於寫出具有可維護性的程式碼。只要遵循這些規範,不管是誰寫的程式碼,它們看起來都具備了同樣的風格,其他人在接手或維護這些程式碼時會更加省事。
我推薦使用Prettier和StandardJS,不過還有很多其他的選擇,具體根據自己的情況而定。
typicode/husky是一個很好的預提交勾點設定工具,專案地址https://github.com/typicode/husky。
7.為PR設定自動化測試
對PR進行自動化功能測試、安全檢查和程式碼風格檢查是非常有必要的,但不應該通過手動的方式做。每當有PR提交時,持續整合伺服器(如TravisCI)可以在相應的branch上自動執行測試,這樣可以防止開發者將未通過測試的PR提交到GitHub上。如果測試失敗,GitHub會在PR中顯示一條訊息,讓提交者儘快修復問題。
TravisCI文件https://docs.travis-ci.com/user/pull-requests。
8.保護好master,進行程式碼評審
GitHub為保護master提供了可能性,避免程式碼直接提交到master上,或對其進行rebase。當多人合作開發一個專案時,這點是非常重要的。另外,在將程式碼合併到master時,將程式碼評審作為必要的步驟。這個可以在每個程式碼庫的settings頁面進行設定。
保護好master,並強制執行程式碼評審,你就可以高枕無憂,無需擔心糟糕的程式碼會被合併到master上,也不會有人提交未經評審的程式碼。
9.squash你的PR
關於該使用merge、squash還是rebase存在很大的爭議,不過我認為最好是使用squash,因為:
- 不是所有的開發者都知道如何進行rebase,大部分開發者都只是簡單地在他們的變更之上合併master。squash避免了無用的合併資訊和往git紀錄檔中新增噪音。
- 不是所有的開發者都會遵循提交規範,squash有助於控制合併到master上的提交資訊。
為了更好地進行squash,每個PR都應該屬於某個特定的功能、bug修復或任務。
10.版本語意、標籤、發布和自動化變更紀錄檔
版本管理對於軟體來說非常重要,特別是在開源軟體中,有很多其他專案可能會依賴你的專案。有了版本語意,我們通過版本號就可以知道某個版本是否包含了突破性變更,或者版本是否包含了新特性或bug修復。
版本格式通常是這樣的MAJOR.MINOR.PATCH:
- 在做出不相容的API變更時,增大MAJOR。
- 增加向後相容的新特性時,增大MINOR。
- 進行向後相容的bug修復時,增大PATCH。
我們還可以對這個格式進行擴充套件,加入額外的標籤,作為預發布版本和構建後設資料。
Conventional Commits規範(https://conventionalcommits.org)建議基於提交訊息引入一種輕量級的規範,與SemVer一起使用,讓開發者在提交訊息中提供與功能、bug修復和突破性變更相關的描述。
TravisCI有助於自動化這一過程https://docs.travis-ci.com/user/deployment/releases。
11.使用標籤勾點進行自動化部署
GitFlow建議使用release分支進行發布,但這不是必需的。我們可以通過git標籤獲取要部署的檔案,TravisCI的文件(https://docs.travis-ci.com/user/deployment/heroku)介紹了如何將git標籤部署到heroku上。其實很簡單,只需要將標籤屬性設定為true就可以了。其他CI伺服器的設定也類似。
我們可以在開發環境設定勾點,用於部署最新的master程式碼。我們也可以為每個PR建立臨時的測試環境,不過這樣做非常複雜,所以不一定要這麼做。
12.建立GitHub流式通道
這是一種非常方便的跟蹤GitHub活動的方式,可以通過這種方式與其他人進行共同作業溝通。每個GitHub聊天室都會有通知流,GitHub在2013年為此發明了一個新術語,叫作ChatOps。
13.自動化依賴更新
保持依賴更新是一項非常耗時的重複性工作,所以可以將它自動化。所幸的是,有很多工具可用於保持依賴更新,它們會基於專案的最新版本建立PR,然後自動執行非回歸測試,如果測試通過,那麼在合併PR後這些程式碼依然能夠正常執行。不過如果有主版本變化,需要進行雙重檢查。
可以參考這兩個工具:https://greenkeeper.io和https://david-dm.org。
14.使用擴充套件來提升GitHub的UI體驗
開源社群開發了很多非常有用的擴充套件,可用於提升GitHub的使用體驗。可以通過https://github.com/showcases/GitHub-browser-extensions檢視這些擴充套件。
15.持續學習和改進
GitHub和開源軟體的開發實踐一直在演化,我們需要關注GitHub的發布公告,並遵循開源社群的標準,跟上時代的發展步伐。
檢視英文原文:https://gaboesquivel.com/blog/2018/15-recommendations-to-enhance-your-github-flow
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx
本文永久更新連結地址:https://www.linuxidc.com/Linux/2018-07/153032.htm
相關文章