GitHub項目的同行審查自動化工具
作為一名程序員,肯定聽說過GitHub。作為全球最大的社交編程及代碼托管網站,GitHub允許程序員們分享和協作開發開源項目。對于微軟的開源軟件工程師 Felix Rieseberg 來說,他們的團隊有時會在GitHub上,通過撰寫研究案例的方式向微軟內部和外部的工程師們來介紹他們所做的一些具有技術含量的工作。為了在研究案例發布之后盡量少發現錯誤,在將案例合并到代碼庫之前通過一些同行評審(peer review,PR)是必要的過程。假如用戶的博客是一個GitHub的頁面,意味著每一個后面增加到網站的post都是以pull request的形式。然而檢查和跟蹤GitHub上同行評審的pull request是相當繁瑣的工作,因此Felix Rieseberg編寫了一個 基于Node.js的機器人 來自動化整個流程。
管理工作流程很困難
管理同行評審工作的流程并不是一件有趣的事情。根據團隊的規模,可能同時有一大堆的pull request,如果再加上團隊的工程文化比較好,會經常提前收集一些反饋信息,這就意味著pull request列表中會有各種不同階段的pull request,導致同行評審工作的流程變得困難。
有人會認為自我管理是一個很好的解決方案,的確現實中往往也是這樣的。很多團隊對一些未完成的pull request僅僅是在標題中加上一個“WIP”或“wip”的標簽,任何人打開這個pull request,它都會被更新。對一個極具創意和非常有成效的團隊來說,如果是通過手動的方式檢查和跟蹤研究案例的狀態,比如它們在哪里評審,以及它們是否已經準備好發布等,這往往是說不過去的。
自動化卻很容易
代替雇人去不斷檢查所有pull request,Rieseberg決定自己開發一個自動化工具,通過注冊了一個小的Node.js機器人,可以對以下事件作出響應:
- 檢查是否有新的pull request被打開或對已有的pull request有新的評論。
- 如果有,機器人從GitHub上收集關于pull request的最新信息。
- 一旦得到信息,檢查pull request是否已被標記。如果它被標記為“no-review”或“peer-reviewed”,停止一切動作。
- 如果還沒有這樣做,發表評論來對過程進行解釋。
- 如果其他人已經評論過,檢查是否收到了足夠的'LGTM'或' Looks good to me! “評論。如果收到,更新標簽。
- 如果機器人被配置為允許自動合并pull request,讓GitHub合并它。如果pull request是不可以合并的,GitHub會自動拒絕。
在這種情況下,這個機器人還只是單一接口的小規模應用程序:
http://botaddress.com/pullrequests
一個GET HTTP請求為打開的pull request檢查配置,而POST HTTP request需要一個GitHub風格JSON有效載荷,并且僅僅處理提到的pull request。
自行構建機器人
除了簡要介紹他們的自動化機器人,Felix還為讀者提供了如何自行構建機器人的方法。如果想查看代碼庫中pull request的同行評審,在開始之前,需要做一些必要的準備工作:
為機器人創建一個GitHub用戶
機器人需要一個GitHub用戶來與GitHub交互。在GitHub網頁上,可以使用已有的用戶,或者從眾多的機器人( Terminator,Tinman,Bender )中選擇一個,創建一個新用戶。雖然機器人使用用戶名/密碼組合就可以正常工作,但我們還是建議建立一個OAuth2令牌。 GitHub上有API速率限制, OAuth認證的機器人可以獲得更高一些的速率。
部署機器人
如果是使用Azure,建立一個機器人大約只需要一分鐘。只需導航到同行評審機器人的代碼庫,并點擊“Deploy to Azure '按鈕。 Azure的部署向導會自動為用戶創建一個網站,而且還會為配置機器人設置環境變量。
如果是使用其他平臺,確保是在運行的節點(至少在0.10.x)上。然后,通過直接編輯config.js或通過設置環境變量來設置配置。選項如下:
- User 擁有代碼庫的用戶/組織
- repo 代碼庫(研究案例)
- botUser 機器人的GitHub用戶名
- botPassword 機器人的Github密碼
- labelReviewed 表示獲得足夠的同行評審的標簽名
- labelNeedsreview 表示沒有同行評審的標簽名
- reviewsNeeded 需要的評審數量
- instructionsComment當一個新PR打開,機器人發布的評論,如果在評論中使用reviewsNeeded,它會自動替換為需要的評審數量
- mergeOnReview(默認值:false) 如果設置為true,機器人會自動合并PR,并迅速將其當做評審過的PR
- pullRequestsStatus(默認:open)pull request狀態。選項包括:all|open|closed
- oauth2token 如果設置,將使用OAuth令牌代替用戶名/密碼組合對機器人驗證。
- excludeLabels 如果設置,機器人會自動忽略帶有“no-review”、“ i-hate-reviews”標簽的PR。
配置完成后,使用npm start或node ./bin/www啟動機器人。這樣,一個機器人就可以幫助管理同行評審工作流了,而程序員則可以將精力放在更需要他們的地方。