缺陷跟蹤(Bug Tracking)是軟件研發流程中重要的一環,集項目需求管理和缺陷管理于一身,通過對研發工作流的控制幫助團隊建立規范的研發體系。GitHub提供輕量級的缺陷跟蹤模塊,稱為Issues。小巧、易用的Issues模塊能與Pull Request緊密整合,是Pull Request工作流的有益補充。
一個小型、管理文檔和網頁的項目,使用Pull Request往往就足夠了。試想如果貢獻者能夠直接修改代碼(Fork and edit this file)并通過Pull Request貢獻給項目核心開發者,那么為什么還要通過Issues模塊報告錯誤并由他人來更改呢?但是對于大型項目需要做需求管理,或者參與代碼開發有難度,則非常有必要通過Issues模塊啟用缺陷跟蹤系統,提供更多途徑讓貢獻者參與到項目中來。
缺陷跟蹤可以通過項目的管理頁面開啟或關閉,如圖4-45所示。
[](https://box.kancloud.cn/2015-07-09_559de47b4afe6.png)
圖4-45:開啟或關閉Issues模塊
## 4.5.1\. 標簽
缺陷跟蹤系統通常可用于管理多種不同類型的問題:需求、缺陷或其它,也可以通過項目不同模塊、組件來為問題分類。GitHub在問題分類的實現上非常簡單,通過標簽(label)來為問題建立分類。
開啟Issues模塊后,項目的菜單中多出一個“Issues”項,點擊則進入問題瀏覽界面,如圖4-46所示。左側的邊欄是問題過濾器,由上至下分為三個部分。最上面的過濾器根據問題的所有者對問題進行篩選,默認選擇所有人的問題。中間的過濾器是根據里程碑對問題進行篩選,默認未選定任何里程碑(初始尚未創建任何里程碑),不對問題進行里程碑過濾。最下面的過濾器依據問題標簽對問題進行篩選,初始標簽尚未創建。
[](https://box.kancloud.cn/2015-07-09_559de4872c019.png)
圖4-46:尚未定義標簽
鼠標點擊左側邊欄標簽過濾器中的新建標簽的文本框,顯示如圖4-47所示的新建標簽界面。輸入新的標簽名,并為標簽選擇一個顏色,創建新的標簽。
[](https://box.kancloud.cn/2015-07-09_559de487eccf9.png)
圖4-47:創建新標簽
創建的標簽顯示在過濾器中,如圖4-48所示。點擊過濾器中的標簽則對問題進行篩選,取消過濾器可以點擊圖中標記的“Clear active milestone and label filters”鏈接。
[](https://box.kancloud.cn/2015-07-09_559de488e767e.png)
圖4-48:過濾器中的標簽選項
標簽過濾器下方的“Manage Labels”按鈕用于管理標簽,下面的輸入框用于創建新的標簽。
## 4.5.2\. 里程碑
里程碑(Milestones)是項目進度管理的重要工具。在傳統項目管理中,里程碑對應于一個項目開發計劃、一個軟件版本;在敏捷項目管理中,里程碑對應于一個Sprint(沖刺);在軟件代碼的版本庫中則對應于一個標簽(tag)或分支(branch)。
在Issues模塊中的“Milestones”頁面用于里程碑管理。創建新的里程碑需要輸入里程碑名稱和里程碑的截止時間,如圖4-49所示。
[](https://box.kancloud.cn/2015-07-09_559de48b41cc4.png)
圖4-49:創建新里程碑
創建的里程碑以進度條形式顯示在里程碑頁面中,如圖4-50所示定義了兩個里程碑。這兩個里程碑的時間跨度定義的太長,敏捷的項目管理從來不這么定義。
[](https://box.kancloud.cn/2015-07-09_559de48d292b7.png)
圖4-50:里程碑列表
## 4.5.3\. Issue的生命周期
GitHub的Issues模塊非常簡單,對標簽和里程碑進行簡單的設置后,基本上就完成了Issues模塊的配置工作,接下來就是如何創建和修改Issue,完成項目的缺陷跟蹤和需求管理等,這才是Issues模塊的主要工作。
每個Issue都有自己的生命周期,從問題的創建,到問題的指派,再到問題的解決,直至問題的關閉。圖4-51就是以普通貢獻者身份為項目創建Issue。
[](https://box.kancloud.cn/2015-07-09_559de48f19cae.png)
圖4-51:以普通貢獻者身份創建問題
錄入問題標題和描述后,點擊“Submit new issue”按鈕,完成問題創建。圖4-52顯示了新建立的問題,可以看出新建問題尚未設置標簽。
[](https://box.kancloud.cn/2015-07-09_559de48fe4cd6.png)
圖4-52:新創建的問題尚未添加標簽等
普通貢獻者創建問題時只能錄入問題的標題和描述,而不能設置問題的指派(誰來負責)、添加標簽和設置里程碑。如果希望問題通知到特定的開發者,可以在問題描述中以“@用戶名”的方式通知到該用戶[[1]](https://github.com/blog/821-mention-somebody-they-re-notified),這也是眾多社交軟件通行的做法。
項目成員創建問題時,擁有更大權限,也有更多的可選項。如圖4-53所示。
[](https://box.kancloud.cn/2015-07-09_559de49177e92.png)
圖4-53:以項目成員身份創建問題
完成上述兩個問題的創建后,問題瀏覽界面顯示新創建的兩個問題,一個以項目成員身份創建的問題已經被設置了“缺陷”的標簽,而另外一個問題則沒有設置任何標簽。如圖4-54所示。
[](https://box.kancloud.cn/2015-07-09_559de4929cceb.png)
圖4-54:所有問題列表
以項目成員身份登錄,在問題瀏覽界面即可為問題重新設定標簽,指派負責人,設置里程碑,以及關閉問題等。如圖4-55所示。
[](https://box.kancloud.cn/2015-07-09_559de4b476e87.png)
圖4-55:為問題添加指派、里程碑和標簽
在問題瀏覽頁面的過濾器中選擇里程碑”Version 4.0“,可以看到兩條問題都顯示出來,這是因為這兩條問題都屬于該里程碑。里程碑的進度條顯示進度為零,這是因為里程碑所包含的全部(兩個)問題都處于打開狀態,尚未解決。如圖4-56所示。
[](https://box.kancloud.cn/2015-07-09_559de4b61a198.png)
圖4-56:通過里程碑篩選問題
郵件通知功能是缺陷跟蹤系統推動工作流的重要工具,GitHub的Issues模塊也具有郵件通知功能。除了像其他缺陷跟蹤系統在收到郵件通知后,訪問Web界面參與問題的討論外,還可以直接以郵件回復的功能參與到工作流中[[2]](https://github.com/blog/811-reply-to-comments-from-email)。
GitHub還支持版本庫提交和問題建立關聯,只要提交說明中出現“#xxx”(Issue編號)字樣。如果在提交說明中的問題編號前出現特定關鍵字,還可以關閉問題。支持的關鍵字有:
* fixes #xxx
* fixed #xxx
* fix #xxx
* closes #xxx
* close #xxx
* closed #xxx
下面就以gotgithub/helloworld版本庫為例,關閉編號為“#1”的問題。
* 克隆版本庫,若本地工作區尚不存在。
~~~
$ git clone git@github.com:gotgithub/helloworld.git
$ cd helloworld
~~~
* 編輯文件src/main.c,改正“問題#1”發現的文字錯誤。
~~~
$ vi src/main.c
$ git diff
diff --git a/src/main.c b/src/main.c
index 3daf9fe..f974b49 100644
--- a/src/main.c
+++ b/src/main.c
@@ -19,7 +19,7 @@ int usage(int code)
" say hello to the world.\n\n"
" hello -v, --version\n"
" show version.\n\n"
- " hello -h, -help\n"
+ " hello -h, --help\n"
" this help screen.\n\n"), _VERSION);
return code;
}
~~~
* 將修改添加至暫存區。
~~~
$ git add -u
~~~
* 提交,并在提交說明中用fixed?#xxx關鍵字關閉相關問題。
~~~
$ git commit -m "Fixed #1: -help should be --help."
~~~
* 向GitHub版本庫推送。
~~~
$ git push
~~~
推送完畢后,在問題瀏覽界面可以看到里程碑“Version 4.0”的進度已經完成了一半,即其中一個問題(#1)已經完成并關閉。如圖4-57所示。
[](https://box.kancloud.cn/2015-07-09_559de4b9b73ef.png)
圖4-57:關閉一個問題,里程碑完成50%
查看已經完成的問題(#1),可以看到其中關聯到一個提交,該提交正是我們剛剛創建的。如圖4-58所示。
[](https://box.kancloud.cn/2015-07-09_559de4bb55769.png)
圖4-58:已關閉問題中的提交鏈接
點擊關聯的提交,顯示如圖4-59的提交界面,出現在提交說明中的問題編號也可點擊,指向缺陷追蹤系統中該問題的鏈接。
[](https://box.kancloud.cn/2015-07-09_559de4bcdcddc.png)
圖4-59:提交中的問題鏈接
## 4.5.4\. Pull Requst也是Issue
Pull Request和Issue一樣,也是一種對項目的反饋,而且是更為主動的反饋。GitHub的Issues模塊將Pull Request也納入到問題的管理之中,完美地將Pull Request整合到問題追蹤的框架之中。
為了弄清二者之間的關聯,首先創建一個Pull Request。
以非項目成員(如用戶 omnidroid)的賬號訪問gotgithub/helloworld項目,查看文件src/Makefile,點擊“Fork and edit this file”按鈕快速創建派生項目,如圖4-60所示。
[](https://box.kancloud.cn/2015-07-09_559de4bf16a1c.png)
圖4-60:在線編輯并創建派生項目
通過GitHub提供的在線編輯功能修改src/Makefile文件,修改完畢后撰寫提交說明,點擊“Propose File Change”按鈕提交。如圖4-61所示。
[](https://box.kancloud.cn/2015-07-09_559de4bfd8e03.png)
圖4-61:在線編輯并提交
在提交說明中特意使用了“Fixed #2”關鍵字,以便該提交被上游版本庫接納后能夠關閉關聯的問題。
當完成提交后,GitHub會自動開啟創建新的Pull Request對話框,如圖4-62所示。
[](https://box.kancloud.cn/2015-07-09_559de4c9c5d0d.png)
圖4-62:創建Pull Request
Pull Request創建完畢后,除了在菜單項“Pull Requests”中有顯示外,在“Issues”的問題瀏覽頁面中也會顯示。如圖4-63所示,新建立的Pull Request的編號不是從壹開始創建,而是接著問題的編號順序創建,所以當Pull Request出現在問題列表中時,如果不注意后面的山型的分支圖標,根本意識不到這不是一個普通的問題(Issue),而是一個Pull Request。
[](https://box.kancloud.cn/2015-07-09_559de4cd0bac5.png)
圖4-63:Pull Request也顯示在Issues中
顯示在問題瀏覽界面中的Pull Request和問題一樣,可以為其設置標簽、指派負責人、設置里程碑。如圖4-64所示。
[](https://box.kancloud.cn/2015-07-09_559de4cfdc567.png)
圖4-64:可以像更新其他Issue那樣更新Pull Request
當Pull Request歸類到里程碑“Version 4.0”中時,在過濾器打開里程碑“Version 4.0”,可以看到本來已經完成50%的進度,由于新增了一個“問題”(Pull Request),導致進度降低了。如圖4-65所示。
[](https://box.kancloud.cn/2015-07-09_559de4d7e40ba.png)
圖4-65:里程碑進度調整
點擊編號為“#3”的問題(Pull Request),會進入到Pull Request頁面。點擊頁面中的“Merge pull request”按鈕實現Pull Request的合并。如圖4-66所示。
[](https://box.kancloud.cn/2015-07-09_559de4d981f4b.png)
圖4-66:在線合并Pull Request
點擊“Confirm Merge”確認合并,如圖4-67所示。
[](https://box.kancloud.cn/2015-07-09_559de4db11be9.png)
圖4-67:確認合并Pull Request
完成合并后,查看該Pull Request,可以看到該Pull Request已經關閉。如圖4-68所示。
[](https://box.kancloud.cn/2015-07-09_559de4dbd57c0.png)
圖4-68:Pull Request自動關閉
如果再回到問題瀏覽界面,能夠猜到現在里程碑“Version 4.0”的進度是多少么?
由于關閉了編號為“#3”的Pull Request,以及所合并的Pull Request中對應提交的提交說明的指令同時關閉了編號為“#2”的問題,所以現在里程碑“Version 4.0”關聯的所有問題均已關閉。里程碑也顯示已關閉,即里程碑完成度為100%。
[](https://box.kancloud.cn/2015-07-09_559de4df4ff34.png)
圖4-69:里程碑關閉
- 前言
- 1. 探索GitHub
- 1.1. 什么是GitHub
- 1.2. GitHub亮點
- 1.3. 探索GitHub
- 2. 加入GitHub
- 2.1. 創建GitHub賬號
- 2.2. 瀏覽托管項目
- 2.3. 社交網絡
- 3. 項目托管
- 3.1. 創建新項目
- 3.2. 操作版本庫
- 3.3. 公鑰認證管理
- 3.4. 版本庫鉤子擴展
- 3.5. 建立主頁
- 4. 工作協同
- 4.1. Fork + Pull模式
- 4.2. 共享版本庫
- 4.3. 組織和團隊
- 4.4. 代碼評注
- 4.5. 缺陷跟蹤
- 4.6. 維基
- 5. 付費服務
- 5.1. GitHub收費方案
- 5.2. GitHub企業版
- 6. GitHub副產品
- 6.1. GitHub:Gist
- 6.2. 其他版本控制工具支持
- 6.3. 客戶端工具
- 6.4. 其他
- 7. 附錄:輕量級標記語言
- 貢獻者列表