<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [Trac 經驗談之(1)雜談篇](http://blog.csdn.net/lanphaday/article/details/6609256) [Trac 經驗談之(2)雜談篇補遺](http://blog.csdn.net/lanphaday/article/details/6658032) [Trac 經驗談之(3)工作流篇](http://blog.csdn.net/lanphaday/article/details/6620098) [Trac 經驗談之(4)報表篇](http://blog.csdn.net/lanphaday/article/details/6641391) [Trac 經驗談之(5)插件篇](http://blog.csdn.net/lanphaday/article/details/6654027) [Trac 經驗談之(6 完)插件篇補遺](http://blog.csdn.net/lanphaday/article/details/7100118) # trac 經驗談之(3)工作流篇 賴勇浩([http://laiyonghao.com](http://laiyonghao.com)) ![](https://box.kancloud.cn/2016-04-28_5721b384d7e7b.gif) Trac 的工作流 ticket-workflow 其實是一個狀態圖。一個 ticket 從出生到消亡,經歷許多狀態,相關人員的工作(Action)推動著這些狀態變化。在早期,Trac 的 ticket-workflow 是很簡陋的和固定的(見上圖),顯然,這并不能普適廣大用戶的需求,所以自 0.11 版本開始,Trac 拋棄了之前固定的 ticket-workflow,開始使用可以由用戶自定義的 ConfigurableTicketWorkflow,至此,針對 ticket 的工作流可以由插件控制。下面我們先回顧一下 v0.11 新的默認工作流,并從中了解一些基本概念,如狀態(state),動作(action)等: ![](https://box.kancloud.cn/2016-04-28_5721b38500f95.gif) 如上圖,每一個節點稱為狀態(state),而連接結點的有向邊稱為動作(action),由狀態和動作可以構建出狀態轉換表。上圖共有 new、assigned、accepted、reopened 和 closed 等共 5 種狀態,每一條 Ticket 必定處于這些狀態之一。當一個動作(action),如 reassign、accept、resolve 或 reopen 作用在其上時,它的狀態就改變為下一個狀態。通常而言,不同的狀態意味著這個 ticket 正在由不同的團隊負責完成其中的一部分工作,并將在這個團隊完全其所負責的這部分工作后,轉換到下一狀態。關于此點一一說明如下: - new:新建一個 ticket,所有新建的 ticket 都處于這個狀態,一般來說,應該任何人都可以新建 ticket; - assigned:當 ticket 的 owner 發生改變,而 owner 又未 accept 時處于此狀態;意味著這條 ticket 還沒有人負責; - accepted:ticket 已經被接受;意味著開發團隊正在開發功能或修正缺陷; - closed:ticket 被關閉;意味著 QA 團隊正在測試或已經通過測試 - reopened:ticket 被重開,意味著 QA 團隊發現功能未開發完成或缺陷未修復,重新指定 owner 負責跟進。 我們團隊剛開始時使用默認的 basic-workflow,后來發現有幾點不足: 1. reopened 狀態讓美術、策劃很難理解,容易產生困惑,而且配置的時候多一個狀態,麻煩不少; 1. 缺乏一個專門用以 QA 團隊的狀態,看到 closed 的 ticket 無法確定這個功能是否已經通過驗證或缺陷修復是否已經通過回歸測試。 針對上述問題,我們通過編輯 trac.ini 文件的 ticket-workflow 一節,定制了自己的工作流,我們工作流的狀態轉換圖如下: ![](https://box.kancloud.cn/2016-04-28_5721b38520bc9.gif) 通過上圖,可以看到工作流的主線 new->accepted->resolved->closed,比上面的版本都要明晰。我們去掉了 reopened 狀態,代之以 assigned 狀態,因為這兩個狀態本來就很相似,當 reopen 一個 closed ticket 時,需要指定一個 owner,并進入到 assigned 狀態,其中關鍵配置是: ~~~ reopen.operations = del_resolution,set_owner ~~~ 此外,我們增加了一個 resolved 狀態,它表示開發團隊認為該功能已經開發完成或缺陷已經修復,并交由 QA 團隊跟進測試,其中的關鍵配置是 ~~~ resolve.set_owner = tester1, tester2 ~~~ 它把能夠接受 resovled 狀態的 ticket 的 owner 限定為測試人員,其中 tester1 和 tester2 是測試人員的用戶名。這個 (action).set_owner 設置項是一個不傳之秘,一般人都不知道咧。 只有 resovled 的 ticket 才能轉換到 closed,這個動作叫 test,明確地把 QA 的重要性體現了出來,也體現了從提出問題->解決問題->驗證方案->結案記錄的完備流程。 最后,給出我們的工作流的完整配置: ~~~ [ticket-workflow] leave = * -> * leave.default = 1 leave.operations = leave_status accept = new,assigned -> accepted accept.operations = set_owner_to_self accept.permissions = TICKET_MODIFY reassign = new,assigned,accepted,resolved -> assigned reassign.operations = set_owner reassign.permissions = TICKET_MODIFY reopen = closed -> assigned reopen.operations = del_resolution,set_owner reopen.permissions = TICKET_CREATE resolve = assigned,accepted,resolved -> resolved resolve.operations = set_owner resolve.permissions = TICKET_MODIFY resolve.set_owner = tester1, tester2 test = resolved -> closed test.operations = set_resolution test.permissions = TICKET_MODIFY ~~~ to be continued...
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看