<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hengheng123456789

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks


    對開源 CI 服務(wù)器:CruiseControl、Luntbuild 和 Continuum 的調(diào)查


    Paul Duvall (paul.duvall@stelligent.com), CTO, Stelligent Incorporated

    2006 年 10 月 23 日

    由于有許多持續(xù)集成服務(wù)(CI)服務(wù)器可以選擇,所以很難決定哪個(gè)適應(yīng)自己。在 讓開發(fā)自動化 系列的第二篇文章中,開發(fā)自動化專家 Duvall 采用一致的評估標(biāo)準(zhǔn)和很多說明性示例,介紹了一些開源 CI 服務(wù)器,包括 Continuum、CruiseControl 和 Luntbuild。

    在我腦海里,我至少能想到 12 種在當(dāng)前市場上可用的 CI 服務(wù)器,包括商業(yè)的和開源的。雖然它們都試圖自動進(jìn)行軟件構(gòu)建的過程,但是都有各自的優(yōu)點(diǎn)和不足。而且,有太多工具可供選擇的不良后果就是很難決定究竟應(yīng)該選擇使用哪個(gè)。

    在選用自動化過程的工具時(shí),要時(shí)刻記住的就是:工具要 確實(shí)適用。選擇錯(cuò)誤的工具可能會限制整體的靈活性,會導(dǎo)致執(zhí)行簡單動作反而需要更長時(shí)間,或者會把人鎖定在特定的支持工具或過程。

    選擇 CI 服務(wù)器的標(biāo)準(zhǔn)

    通常,對一個(gè)新工具的決策分析可以歸結(jié)如下:

    我聽說 Tim 在使用 Acme Inc 的工具,而且我認(rèn)為 Tim 是個(gè)聰明人。所以,我也要使用 Acme Inc 的工具。現(xiàn)在我也是個(gè)聰明人了。
    關(guān)于本系列
    作為開發(fā)人員,我們的工作就是為用戶提供自動化處理;但是,我們中的許多人卻忽視了自動化自己的開發(fā)過程的機(jī)會。出于這個(gè)目的,讓開發(fā)自動化 這一系列的文章專門研究了自動化軟件開發(fā)過程的實(shí)際應(yīng)用,并教您 什么時(shí)候如何 成功應(yīng)用自動化。

    反過來,如果您問 Tim 為什么 他選擇使用 Acme Inc 的工具,您可能會發(fā)現(xiàn)是他的公司強(qiáng)制要求使用的。這就是為什么重要的是要根據(jù) 自己的 具體技術(shù)和政策需求對工具進(jìn)行分析。如果不這么做,可能就會選擇到不符合需求的工具,甚至更糟糕的是,不能帶來任何幫助的工具。

    在決策的時(shí)候,通常多數(shù)人都會把重點(diǎn)放在工具的特性上。但是要記住,雖然特性的確重要,但還有其他指標(biāo)需要考慮。在我的實(shí)踐中,我發(fā)現(xiàn)以下五個(gè)指標(biāo)在評估工具時(shí)最有幫助:

    什么是持續(xù)集成?

    持續(xù)集成(CI)是一種實(shí)踐,可以讓團(tuán)隊(duì)在持續(xù)的基礎(chǔ) 上收到反饋并進(jìn)行改進(jìn),不必等到開發(fā)周期后期才尋找和修復(fù)缺陷。諸如 CruiseControl 之類的檢查工具是在后臺運(yùn)行的,它們輪詢版本控制存儲庫,從中尋找更改之處。當(dāng)發(fā)現(xiàn)某一更改時(shí),這類工具就會通過 Ant 執(zhí)行預(yù)定義的構(gòu)建腳本。持續(xù)檢查借助持續(xù)集成的實(shí)踐得以改進(jìn)。

    • 特性
    • 可靠性
    • 壽命
    • 目標(biāo)環(huán)境
    • 易用性

    而且不要忘記,客觀地 檢查這五個(gè)方面也是重要的。

    產(chǎn)品特性

    說到 CI 服務(wù)器的特性,應(yīng)當(dāng)考慮該工具與版本控制系統(tǒng)的集成、處理構(gòu)建平臺(例如 Ant 和 Maven)的能力以及提供反饋和報(bào)告的能力。而且不要忘記檢查其他特性,例如構(gòu)建標(biāo)號和管理項(xiàng)目的依賴項(xiàng)。最后,在需要做一些特定的增強(qiáng)時(shí),理解產(chǎn)品的可擴(kuò)展性會很有幫助。

    表 1 詳細(xì)說明了每個(gè)特性:


    表 1. 詳細(xì)的 CI 服務(wù)器評估特性
    特性 解釋
    版本控制系統(tǒng)集成 如果工具不支持您所使用的特定版本控制系統(tǒng),您真的會為它編寫一個(gè)定制集成么?
    構(gòu)建工具集成 在選擇 CI 服務(wù)器時(shí),需要考慮目前或?qū)⒁褂媚膫€(gè)構(gòu)建工具。對于 Java™ 編程,有兩個(gè)自然的選擇:Ant 和 Maven,幾乎所有 CI 工具都支持它們。如果構(gòu)建系統(tǒng)既不是 Ant 也不是 Maven,那么 CI 工具支持從命令行運(yùn)行程序的功能么?
    反饋和報(bào)告 想想老話 “如果樹倒在森林中,能有人聽到么?” 如果構(gòu)建失敗,會有人知道么?如果沒人知道,那么使用 CI 工具的目的是什么?所有的 CI 工具都提供一些通知機(jī)制,但是哪個(gè)最適合您呢?電子郵件?即時(shí)消息?RSS?
    標(biāo)號 有些開發(fā)團(tuán)隊(duì)喜歡跟蹤構(gòu)建,給構(gòu)建一個(gè)唯一的標(biāo)號,這樣日后就能找到具體的構(gòu)建實(shí)例。如果這對您來說很重要,那么要注意只有少數(shù) CI 服務(wù)器提供了這個(gè)功能。
    項(xiàng)目依賴項(xiàng) 某些情況下,在構(gòu)建了一個(gè)項(xiàng)目之后,可能需要構(gòu)建其他依賴項(xiàng)目。有些 CI 服務(wù)器支持這個(gè)特性,有些不支持。
    易于擴(kuò)展 擴(kuò)展工具當(dāng)前的功能有多容易?是否用插件就可以實(shí)現(xiàn)簡單的擴(kuò)展,還是總得修改代碼?

    從特性的角度來說,以上提到的幾點(diǎn)在選擇所需要的正確的 CI 服務(wù)器時(shí),至關(guān)重要。

    產(chǎn)品可靠性

    因?yàn)橄螺d和使用開源 CI 服務(wù)器很簡單,所以可以試用產(chǎn)品來判斷它的可靠性。而且,在工具的可靠性和它在市場上的時(shí)間之間,通常存在一些相關(guān)性。使用新產(chǎn)品時(shí),就會冒著有未發(fā)現(xiàn)的 bug 的風(fēng)險(xiǎn)。而且,用戶群是發(fā)現(xiàn)工具出現(xiàn)的問題的優(yōu)秀資源。大量的問題貼子或者過多的復(fù)雜問題,就表示用戶對這個(gè)工具的意見較大。

    因?yàn)槲疫@里討論的服務(wù)器是開源的,所以很容易發(fā)現(xiàn)下載的人數(shù),這也會是產(chǎn)品健康程度的一個(gè)指示。用戶少可能意味著反饋渠道少,可能需要換個(gè)地方看看。

    壽命前景

    在下載 CI 服務(wù)器之前,了解這個(gè)服務(wù)器未來的前景會有幫助。簡單地說,使用已經(jīng)死亡或正走向死亡的產(chǎn)品不是個(gè)好主意。可以檢查該工具已經(jīng)出現(xiàn)了多少年、在它的用戶群中是否有正常數(shù)量的活動。就像可以從用戶群來判斷產(chǎn)品的可靠性一樣,活躍的社區(qū)是工具未來前景良好的征兆。

    目標(biāo)環(huán)境

    CI 服務(wù)器不能在 所有 環(huán)境下工作。需要考慮服務(wù)器支持哪個(gè)操作系統(tǒng)以及具體的系統(tǒng)需求。例如,如果工具是用最新版本的 Python 編寫的,那么需要確定這個(gè)版本 Python 能夠用于自己的操作系統(tǒng)。

    易用性

    產(chǎn)品的易用性可能是最主觀的指標(biāo)。有些人愿意手工修改配置文件,而有些人想讓所有管理任務(wù)都在應(yīng)用程序中執(zhí)行,例如 Web 控制臺。有些服務(wù)器要求從一個(gè)屏幕單擊到下一個(gè)屏幕來執(zhí)行簡單的管理,而其他服務(wù)器則提供了直觀的向?qū)А?

    如果想理解 CI 服務(wù)器的具體細(xì)節(jié),那么漂亮的管理 Web 表單就不重要了;但是,如果人手不足、工作繁忙,那么可能不會想在管理 CI 服務(wù)器上花太多時(shí)間。

    記住我在這節(jié)討論的五個(gè)方面,再來看一下三個(gè) CI 服務(wù)器:Apache 的 Continuum、CruiseControl 和構(gòu)建管理服務(wù)器 Luntbuild。





    回頁首


    Apache Continuum

    Continuum 是最新的 CI 服務(wù)器之一,也是值得關(guān)注的一個(gè)新進(jìn)入者。Continuum 的安裝和配置很簡單:只要下載和釋放 ZIP 文件,運(yùn)行命令行程序,就可以運(yùn)行了。基于 Web 的界面使得配置項(xiàng)目很容易。而且,還不需要安裝 Web 服務(wù)器,因?yàn)?Continuum 內(nèi)置了 Jetty Web 服務(wù)器。并且,Continuum 可以作為 Windows 服務(wù)運(yùn)行,還在應(yīng)用程序的某些部分嵌入了上下文敏感的文檔,從而提供了很多幫助。

    想要更多細(xì)節(jié)信息?
    面對如此之多 CI 服務(wù)器可以選擇,本文可以引導(dǎo)您更詳細(xì)地研究每個(gè)服務(wù)器,并決定哪個(gè)最合適。因?yàn)槲冶容^了三個(gè)不同的服務(wù)器,所以我沒有深入每個(gè)服務(wù)器的特定細(xì)節(jié)。我只是把重點(diǎn)放在了這些服務(wù)器安裝后就提供的選項(xiàng)上。如果需要更多信息,請參考每個(gè)服務(wù)器的安裝和配置指南。

    易于使用

    在使用 Continuum 時(shí)會注意到的第一件事就是它的易用性。能夠在幾分鐘之內(nèi)就把服務(wù)器運(yùn)行起來并讓它去查詢修改。實(shí)際上,在 Windows 上啟用 Continuum 只需要四步:

    1. 下載 Continuum ZIP 文件(請參閱 參考資料)。
    2. 把文件的內(nèi)容釋放到本地目錄。
    3. 運(yùn)行 run.bat 文件,然后運(yùn)行 InstallService.bat。
    4. 打開瀏覽器指向 http://localhost:8080/。

    Continuum 內(nèi)置支持五個(gè)版本控制系統(tǒng):Subversion、CVS、StarTeam、Bazaar 和 Perforce。也部分地支持其他版本控制工具,例如 Visual Source Safe 和 ClearCase。 Continuum 還支持四種構(gòu)建機(jī)制:Ant、Maven1、Maven2 和 Shell(命令行)。

    配置 Continuum

    在第一次訪問 Continuum Web 應(yīng)用程序時(shí),默認(rèn)是 guest 帳戶。guest 提供了對所有項(xiàng)目的只讀存取,沒有管理或配置項(xiàng)目的能力。但是,可以很容易地創(chuàng)建 Administrative 用戶,然后設(shè)置一些適用于所有項(xiàng)目的屬性。

    圖 1 顯示了管理頁面,它提供了管理所有項(xiàng)目的 Continuum 設(shè)置的能力,包括創(chuàng)建 Admin 帳戶、構(gòu)建的輸出和部署目錄:


    圖 1. Continuum 的配置很簡單
    配置 Continuum

    把項(xiàng)目添加到監(jiān)視器

    對 Continuum 進(jìn)行配置讓它監(jiān)視項(xiàng)目也非常簡單。簡單到僅僅是選擇期望的構(gòu)建平臺,例如 Ant 或 Maven2,然后把 Continuum 指到期望的版本控制系統(tǒng)。

    圖 2 顯示了設(shè)置 Ant 項(xiàng)目時(shí)需要填充的字段:


    圖 2. 在 Continuum 中創(chuàng)建項(xiàng)目
    在 Continuum 中創(chuàng)建項(xiàng)目

    在保存了這個(gè)信息之后,Continuum 每小時(shí)查詢版本控制系統(tǒng)一次。可以修改項(xiàng)目的設(shè)置,查詢得更頻繁或更少些。我們在這里談到的是 持續(xù) 集成,我建議每五 分鐘檢查修改一次,而不要每小時(shí)一次。

    默認(rèn)情況下,在使用 Ant 時(shí),Continuum 在項(xiàng)目的根目錄查找項(xiàng)目的 build.xml 文件。如果使用不同的名稱或者這個(gè)文件不在項(xiàng)目的根目錄,可以修改這個(gè)設(shè)置。

    雖然 Continuum 還是 CI 舞臺上的新人,但是它以其易用性和對當(dāng)前眾多流行的版本控制系統(tǒng)和構(gòu)建工具的支持,還是給這一領(lǐng)域帶來了巨大的沖擊。我希望在未來的版本中會有添加和查看報(bào)告的功能。





    回頁首


    CruiseControl

    CruiseControl 是 CI 服務(wù)器的老者。它已經(jīng)用了有五年多了,在許多方面, CruiseControl 服務(wù)器 已經(jīng)成為持續(xù)集成實(shí)踐的同義詞。出于完全坦白的目的,我應(yīng)當(dāng)提到,我也是 CruiseControl 的多年的老用戶。

    改進(jìn)的安裝

    如果您從最后一次使用 CruiseControl 到現(xiàn)在已經(jīng)有段時(shí)間,而且認(rèn)為它的安裝和配置是個(gè)負(fù)擔(dān),那么您可以看看最新版本。現(xiàn)有,有許多方式安裝 CruiseControl。例如,如果使用 Windows,會發(fā)現(xiàn)最簡單的方式是下載二進(jìn)制可執(zhí)行文件,然后運(yùn)行它。不用擔(dān)心,還可以下載源代碼。

    安裝之后,CruiseControl 預(yù)先配置了一個(gè)配置文件,輪詢 CVS 存儲庫并執(zhí)行 Ant 構(gòu)建腳本。同樣也不需要安裝 Web 服務(wù)器,因?yàn)?CruiseControl 也內(nèi)嵌了 Jetty。

    輪詢版本控制系統(tǒng)

    比起 Luntbuild 和 Continuum,CruiseControl 提供了對超過十種不同版本控制系統(tǒng)的支持。而且,CruiseControl 對這些工具中的許多定制命令也提供了支持。清單 1 是一個(gè)使用 CruiseControl config.xml 腳本輪詢 Subversion 存儲庫的示例:


    清單 1. 通過 config.xml 文件輪詢存儲庫
    <listeners>
                <currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
                </listeners>
                <modificationset quietperiod="30">
                <svn RepositoryLocation="http://www.qualitylabs.org/svn/ambientorb/trunk"
                username="bfranklin"
                password="G0Fly@Kite"
                />
                </modificationset>
                

    執(zhí)行構(gòu)建腳本

    當(dāng)在版本控制系統(tǒng)(例如 Subversion)中發(fā)現(xiàn)修改時(shí),可以很容易地配置 CruiseControl 去執(zhí)行委托的構(gòu)建腳本。例如,清單 2 演示了從 config.xml 調(diào)用 Ant 腳本,它指示 CruiseControl 每 60 秒鐘查詢 Subversion 存儲庫一次,并執(zhí)行另一個(gè) Ant 腳本。 委托的構(gòu)建腳本(沒有顯示)刪除舊文件,從 Subversion 簽出最新的源代碼,并在代碼上運(yùn)行項(xiàng)目的構(gòu)建腳本。


    清單 2. 執(zhí)行 Ant 構(gòu)建腳本
    <schedule interval="60">
                <ant anthome="apache-ant-1.6.5" buildfile="build-${project.name}.xml"/>
                </schedule>
                

    當(dāng)設(shè)置了 CruiseControl 的這個(gè)方面并啟動服務(wù)器之后,可以訪問如圖 3 所示的 CruiseControl Web 控制板:


    圖 3. CruiseControl 控制板
    CruiseControl 控制板

    CruiseControl 控制板

    要接收最新構(gòu)建的反饋,可以把 htmlemail 插件添加到清單 3 所示的 config.xml 腳本。可以用 config.xml 文件配置更多反饋機(jī)制,例如發(fā)送文本消息、電子設(shè)備(通過 X10)、甚至即時(shí)消息。


    清單 3. 用 CruiseControl 發(fā)送電子郵件
    ...
                <plugin name="htmlemail"
                buildresultsurl="http://${env.COMPUTERNAME}/cruisecontrol/buildresults/${project.name}"
                mailhost="${smtp.server}"
                username="${mail.username}"
                password="${mail.password}"
                returnaddress="${buildmaster.email}"
                returnname="${buildmaster.name}"
                subjectprefix="${project.name} build"
                xsldir="webapps/cruisecontrol/xsl"
                css="${reportdir}/cruisecontrol.css"/>
                ...
                <htmlemail>
                <always address="${buildmaster.email}"/>
                <failure address="${buildmaster.email}"/>
                </htmlemail>
                

    CruiseControl 提供了許多有用的特性,有強(qiáng)大的用戶社區(qū),極具擴(kuò)展性。與本文中評估的其他工具相比,有些開發(fā)人員覺得 CruiseControl 不太容易使用。而另一方面,有些開發(fā)人員則發(fā)現(xiàn)用 XML 腳本進(jìn)行修改提供了更好的控制。





    回頁首


    Luntbuild

    從面市年頭上說,Luntbuild 位于 Continuum 和 CruiseControl 之間。比起 Continuum 和 CruiseControl,Luntbuild 的目標(biāo)是為并行開發(fā)和用戶管理之類的事情提供支持的構(gòu)建管理服務(wù)器。它的整個(gè)配置是通過 Web 應(yīng)用程序管理的,所以沒有配置文件需要處理。它也有商業(yè)版可以使用,叫作 QuickBuild,商業(yè)版中包含用戶支持。

    Jetty 不再必需

    Luntbuild 提供了幾種安裝方式。您可能會發(fā)現(xiàn)最簡單的方式是通過 GUI 安裝。用 Web 應(yīng)用程序配置和管理 Luntbuild;所以,需要確保正在運(yùn)行一個(gè)能夠處理 JSP 的 Web 服務(wù)器,像 Tomcat 或 Jetty。

    版本控制輪詢

    Luntbuild 提供了對八種不同版本控制系統(tǒng)的支持,例如 CVS、Subversion、ClearCase 和 Perforce。圖 4 演示了 Luntbuild 被設(shè)置成輪詢 Subversion:


    圖 4. Luntbuild 輪詢 Subversion 存儲庫
    Luntbuild 輪詢 Subversion 存儲庫

    執(zhí)行構(gòu)建

    Luntbuild 支持五種不同的構(gòu)建平臺,包括 Ant、Maven、Maven2、命令行和 rake (用來構(gòu)建 Ruby 應(yīng)用程序)。圖 5 顯示了 Ant 構(gòu)建器的配置頁面:


    圖 5. 用 Luntbuild 執(zhí)行 Ant 腳本
    用 Luntbuild 執(zhí)行 Ant 腳本

    構(gòu)建安排

    通過使用 Luntbuild 中的 Schedule 標(biāo)簽(如圖 6 所示),可以設(shè)置 Luntbuild 多久輪詢一次版本控制系統(tǒng)來獲得修改。在這個(gè)標(biāo)簽上,還可以指定分配給每個(gè)構(gòu)建的唯一構(gòu)建標(biāo)號。


    圖 6. 在 Luntbuild 中安排構(gòu)建
    在 Luntbuild 中安排構(gòu)建

    在 Luntbuild 中發(fā)布結(jié)果

    配置了項(xiàng)目、版本控制系統(tǒng)適配器、構(gòu)建和計(jì)劃程序之后,就可以指定用戶接收反饋的方式了。但是,Luntbuild 只內(nèi)置了對電子郵件和即時(shí)消息的支持。另外,可以從 Luntbuild 的主頁監(jiān)視構(gòu)建,如圖 7 所示:


    圖 7. 從 Luntbuild Web 應(yīng)用程序監(jiān)視構(gòu)建
    從 Luntbuild Web 應(yīng)用程序監(jiān)視構(gòu)建

    Luntbuild 提供了一整套強(qiáng)大的功能,包括管理項(xiàng)目依賴項(xiàng)和大量的版本控制系統(tǒng)適配器。我認(rèn)為工作流和用戶界面可以簡化,因?yàn)樾枰S多步驟來設(shè)置和配置工具。





    回頁首


    CI 記分卡

    在不理解具體需求的情況下,就推薦哪個(gè)工具合適是非常冒失的。每個(gè)服務(wù)器都有許多優(yōu)秀的特性,而且就像我在開始時(shí)所提到的,僅僅因?yàn)槟硞€(gè) CI 服務(wù)器最適合某人,并不意味著它必然滿足您的需求。

    如果尋找的是易于使用的工具,請選擇 Continuum。如果擴(kuò)展性、靈活性和繁榮的用戶社區(qū)對您很重要,請使用 CruiseControl。如果需要 Web 管理和擴(kuò)展的用戶支持選項(xiàng),請考慮 Luntbuild。圍繞這些服務(wù)器已經(jīng)形成了開發(fā)“生態(tài)”系統(tǒng),所以如果遺漏了某個(gè)特性,一般都會找到適合需求的擴(kuò)展。

    在表 2 中,是我根據(jù)自己的使用經(jīng)驗(yàn)為所考察的每個(gè) CI 服務(wù)器總結(jié)的特性、可靠性、壽命、目標(biāo)環(huán)境和易用性這五個(gè)核心方面:


    表 2. CI 服務(wù)器五個(gè)核心方面
    特性 可靠性 壽命 目標(biāo)環(huán)境 易用性
    Continuum 支持 Ant、Maven1 和 Maven2,以及 shell。

    使用 XML-RPC 和 SOAP 的遠(yuǎn)程管理能力;支持 Maven2;用戶群;期待未來有附加的報(bào)告和反饋機(jī)制——不需要修改代碼。
    在 2005 年發(fā)布。期待通過它與 Apache 的關(guān)系,得到 Continuum 的更多消息。 通過 Apache Maven 的良好用戶社區(qū)支持產(chǎn)品在市場上仍很新。 Linux、Mac OS X、Solaris 和 Win32。 優(yōu)秀的易用性和安裝。
    CruiseControl 許多版本控制集成和擴(kuò)展性。通過 JMX 控制的遠(yuǎn)程訪問。多種反饋機(jī)制,包括 RSS、X10、Jabber 以及其他。 在 2001 年發(fā)布。在三個(gè)服務(wù)器中,CruiseControl 在開發(fā)中應(yīng)用得最多。 繁榮的用戶社區(qū);每個(gè)跡象都表示 CruiseControl 還會存在一段時(shí)間。 Windows 和 Unix;任何能運(yùn)行 Java JVM 的平臺。 易于安裝。有些人寧愿不修改 XML 配置文件。
    Luntbuild 項(xiàng)目依賴項(xiàng)、標(biāo)號、安全性組和并行開發(fā)。 在 2004 年發(fā)布。Luntbuild 提供擴(kuò)展的用戶支持選項(xiàng)。 用戶社區(qū)不如 CruiseControl 活躍。 能夠運(yùn)行 JVM 和 servlet 容器的系統(tǒng)。 易于安裝,但用戶界面/工作流需要大大改進(jìn)。基于 Web 的配置(不需要修改配置文件)。

    我在本文中只評估了三個(gè)服務(wù)器;還有許多服務(wù)器可能更適合您的需求。但是既然您理解了如何挑選 CI 服務(wù)器,那么選擇工作就應(yīng)當(dāng)很容易了。請繼續(xù)關(guān)注下個(gè)月的文章,我將介紹在開發(fā)項(xiàng)目中經(jīng)常會遇到的構(gòu)建問題。



    參考資料

    學(xué)習(xí)

    獲得產(chǎn)品和技術(shù)

    討論
    • Improve Your Java Code Quality discussion forum:Andrew Glover 經(jīng)常在 developerWorks 發(fā)表文章,作為專注于改進(jìn)代碼質(zhì)量的顧問,他將自己的許多專業(yè)意見都帶到了這個(gè)他主持的討論組中。


    關(guān)于作者

    Paul Duvall 是 Stelligent Incorporated 的 CTO,該公司利用有效的開發(fā)人員測試策略,以及能夠讓團(tuán)隊(duì)盡早盡多地監(jiān)視和提高代碼質(zhì)量的持續(xù)集成技術(shù),幫助其他企業(yè)解決軟件的質(zhì)量問題。他還是 UML™ 2 Toolkit 一書的作者之一,目前正在與他人合作撰寫 Continuous Integration: Improving Software Quality and Reducing Risk (Addison-Wesley)


    posted on 2007-04-13 17:52 哼哼 閱讀(640) 評論(0)  編輯  收藏 所屬分類: CMMI-Common
    主站蜘蛛池模板: 国产aⅴ无码专区亚洲av| 免费在线看黄的网站| 亚洲人成人77777在线播放| 亚洲午夜av影院| 国产成人免费高清在线观看| 美女被免费喷白浆视频| 国内精品久久久久影院免费| 日本激情猛烈在线看免费观看| 亚洲色大成网站WWW国产| 青青草原精品国产亚洲av| 亚洲中文字幕无码一久久区| 免费中文字幕一级毛片| 免费观看a级毛片| 一个人在线观看视频免费| 免费国产黄网站在线观看可以下载 | 亚洲国产精品尤物yw在线 | 亚洲成a人片在线观看无码| 亚洲精品国产自在久久| 日韩中文无码有码免费视频| 免费下载成人电影| 久热中文字幕在线精品免费| 91av视频免费在线观看| 免费黄网站在线看| 成全高清在线观看免费| 中文精品人人永久免费| 99视频在线免费观看| 中国人免费观看高清在线观看二区| 成人免费网站久久久| 日本一区二区在线免费观看| 免费的黄色的网站| 美女黄网站人色视频免费| 国产亚洲精品美女久久久久| 精品国产亚洲一区二区三区在线观看 | 自拍偷自拍亚洲精品播放| 亚洲AV无码专区亚洲AV桃| 国产尤物在线视精品在亚洲| 国内成人精品亚洲日本语音| 免费大片av手机看片高清| 久久久精品国产亚洲成人满18免费网站| 亚洲免费视频一区二区三区| 精品国产污污免费网站入口在线|