混亂的Commit Messages
好的commit記錄應該包含某些上下文信息,我們可以從commit message中獲取到該commit具體做了什麼工作,並且能利用git指令快速跟蹤相關的問題。但是觀察如下commit記錄(取自RocketMQ 最新的commit記錄)
7e756882 [ISSUE 1931] Remove duplicated doAfterRpcHooks logic7953c4f5 [ISSUE 2044] Fix DefaultLitePullConsumerImpl NPE (49a722f4 Merge pull request 2064 from wcc526/master70da3e01 Merge branch 'develop' into mastera2aa6c18 Fix Fastjson version for RCE pull reuqestoblem3f37c851 [ISSUE 1988] Fix the issue that can not update messageDelay correctly with mqadmin updateBrokerConfig commandb3ec283c Merge pull request 2043 from wqliang/selectNamesrv67b8a2aa Add @Override for RMQOrderListener.java (f12cc81e Init english version of the READMEcf20a26c Fix typo in READMEecdeb1b4 Merge pull request 2039 from lebron374/comment_fix_v141ce16bb Merge pull request 2040 from lebron374/npe_fix_v14feb8cae npe fixfae6825f comment fix1. 許多Commit Messages沒有明確表明代碼修改的內容,我們需要猜測其幹了什麼。2. 一些commit記錄沒有關聯Github上的issue,因此很難從某一個Commit Message跟蹤到具體的issue和pull request。3. Commit Messages 格式不統一。可以看出當前的Commit Messages 比較混亂,我們需要一些約定來幫助 Commit Messages變得清晰而整齊,從而幫助開發者更好的跟蹤問題,明確版本迭代過程中的優化情況。不清晰的issue列表和pull request列表與Commit Messages相同,當前Github上的issue和pull reuqest也較為混亂,主要表現以下幾個方面:1. 雖然RocketMQ社區規約1.0中已經定義標籤的類型,但實際操作過程中,Issue和pull reuqest標籤仍然混亂,比如milestones標籤一些打在issue上,一些打在pull reuqest上。2. 命名混亂,雖然RocketMQ 社區行為規範1.0已經規定了pull reuqest命名方式,但一些開發者並沒有按照要求的格式提交,issue和pull reuqest標題沒有表達出清晰的目的,且出現了中英文混雜的情況。需要進一步明確規約來獲取一個清晰的issue和pull reuqest列表,使開發者能從issue和pull request列表 明確issue 和 pull request的類型和內容,使社區健康發展。Committer在合併pull reuqest時出現一些不規範的操作,比如隨意合併,合併pull reuqest到master分支,自己提交的pull reuqest自己合併等情況。我們需要一種規範來解決這些問題,保證社區的每一個pull reuqest都是經過嚴格審定的,來維護項目健康發展。當有清晰的commit記錄以及清晰issue、pull reuqest列表後,可以幫助Release Manager更好的明確版本迭代之間發生的變化,不需要太多修改就能快速編寫Release Notes。
目標
RIP-14 RocketMQ社區行為規約2.0的目標包括清晰的issue列表和pull request列表Release Manager 能快速編寫清晰簡潔的Release NotesContributor行為規約
Commit Message包含對提交記錄的簡潔描述,包括類型、可選範圍(模塊)和簡單描述。Commit Message格式:<type>(<scope>): <body><tpye>: 描述commit更改屬於什麼類型,可選的類型包括:<scope>:作用域,表示commit更改所屬的模塊。例如log, remoting, rpc, client, console, plugin, storage等,如果沒有更合適的範圍,你可以用 *。<body>: 對Commit更改簡短的描述,需要注意以下幾點:使用動賓結構,注意使用現在時,比如使用change 而非 changed 或 changesfeat(client): simplify pull consumer implementation
refactor(*): polish 'No route info of this topic' exceptiondocs(guide): update the developer guidePull reuqest命名格式:[ISSUE #{issue number}] body需要注意ISSUE和其數字編號之間需要有一個空格,方括號與body之間也需要有空格,body的首字母大寫。[ISSUE #2085] Support graceful shutdown for push consumer[ISSUE #1879] GroupTransferService may be blocked by ResponseCallback in SYNC_MASTER modeenhancement、test、code style、documnet、new feature類型的pull request儘量用動賓結構。比如[ISSUE #2088] Optimize RocketMQ client's stats of RT to make sense.[ISSUE #2007] Upgrade fastjson version to prevent serious security problems.[ISSUE #1976] Improve the security of the system topic operation.[ISSUE #1689] Add interfaces to remove unused statsItem in BrokerStatsManager class.Bug類型的pull request 可以直接描述bug的內容,避免寫長句(定語從句)[ISSUE #1901] Fix the issue that creates reply message fail when using request/reply mode.[ISSUE #1906] Fix the issue that booleanConstantExpression might lead to class loading deadlock.[ISSUE #1901] Create reply messages fail when using request/reply mode.[ISSUE #1906] BooleanConstantExpression might lead to class loading deadlock.Committer行為規約
在RocketMQ 社區規約1.0中,我們初步規定Label的種類。而在規約2.0中,我們將進一步規定打標的方式。
我們需要給每個issue打標籤,一般一個issue需要有兩類標籤,包括code-style,包括單詞拼寫錯誤,方法、變量命名優化,代碼格式優化等。rip,RocketMQ improvement proposal注意:打類型標籤不要濫用enhancement,比如包括文檔優化、代碼格式優化等都打enhancement。Issue不打mailstones標籤。Pull reuqest只打mailstones標籤,由committer來確定該pull reuqest在哪一版本被合併。一般new feature是在大版本被合併。PMC成員可以根據pull reuqest緊急程度打 urgent標籤,urgent標籤只在該pull reuqest需要被緊急修復的情況下使用。document、code style、test類型 :一個committer(或核心contributor)appull reuqestovebug類型:不涉及store,remoting, common,兩個committer(或核心contributor)appull reuqestove, 涉及store,remoting,三個committer(或核心contributor) appull reuqestove。enhancement類型:兩個committer(或核心contributor) appull reuqestove,會導致兼容性問題的需要三個committer appull reuqestove。new feature、RIP:需要四個以上committer(或核心contributor)同意。注意:有效票數不包含pull reuqest發起人自己,嚴禁自己提交pull reuqest自己進行合併。
Merge合併方式
Github提供了committer三種合併方式: Create a merge commit, Squash and merge以及Rebase and merge,如下圖所示
三種合併方式會形成如下Commit Messages可以看到Create a merge commit容易丟失作者信息,Rebase and merge問題在於如果pull reuqest提交者有多個無用的commit記錄,都會被合併到主幹上,並且格式很難規範。因此強制必須都使用 Squash and merge 進行合併,並且Commit標題名必須為pull reuqest名,需要注意的是當提交者的pull reuqest只提交一個commit記錄的情況下,Github上默認命名為commit message,此時需要幫助用戶改為pull reuqest命名,若用戶pull reuqest命名不規範,也需要幫助用戶將pull reuqest命名進行規範。合併前注意pull reuqest合併的目標分支必須為develop,不要合併到master分支。若pull reuqest目標分支有錯,可以通知提交者對target branch進行修改,或者幫助提交者切換分支。Release Manager行為規約
Release Notes 原則上通過pull reuqest的milestones標籤能篩選出來(最好與commit記錄做一個校對,以防有漏掉milestones的pull reuqest),利用pull reuqest標題(或者commit記錄)就能編寫具體release notes entry,根據pull reuqest關聯issue的label情況能對release note entry進行具體分類,包括五大類:new feature、bug、enhancement、test、document and code style。郵件列表:
https://lists.apache.org/thread.html/rb957c90bb93e736fcf8248efe76f55501416a6f005a61ef0fbbb4f1b%40%3Cusers.rocketmq.apache.org%3E
Google文檔:
https://docs.google.com/document/d/1fo_Z4_nUOyykkmQOE2kEmxcLwhhFiQENQwQiy852XUM/edit#heading=h.nwczedg8v2na