當(dāng)我們討論Jenkins文件結(jié)構(gòu)的時(shí)候,要知道在基于像Jenkins這樣的圖形用戶界面工具和DevOps的基礎(chǔ)設(shè)施即代碼原則之間經(jīng)常會(huì)發(fā)生阻抗失配(impedance mismatch)。
中培的龔老師認(rèn)為,理解這個(gè)問(wèn)題的一種方法是:雖然Jenkins任務(wù)描述器基于文本文件,但它們并不是改變?nèi)蝿?wù)描述的主要界面,web界面才是。這種方式利弊參半。
Jenkins的既存構(gòu)建之上創(chuàng)建定制的解決方案很容易,并不要求你非常熟悉Jenkins。 另一方面,Jenkins的開(kāi)箱即用缺乏我們?cè)诔绦蚴澜缰谐S玫脑S多功能。例如繼承甚至定義函數(shù)這樣的基本功能在Jenkins里需要大量工作。
GitLab的構(gòu)建服務(wù)器功能,用的是另一種方法。構(gòu)建描述器從一開(kāi)始就只是代碼。如果并不需要Jenkins提供的所有能力,GitLab的這個(gè)特性值得你一看。
按依賴順序構(gòu)建
因?yàn)闃?gòu)建的一部分可能會(huì)依賴于其他部分,許多構(gòu)建工具都有構(gòu)建樹(shù)的概念:為完成構(gòu)建而有順序地構(gòu)建依賴。
在像Maven這樣的工具里,構(gòu)件圖來(lái)源于由我們?yōu)楣ぜO(shè)置的依賴。另一個(gè)Java構(gòu)建工具Gradle,也會(huì)在構(gòu)建之前先創(chuàng)建一個(gè)構(gòu)件圖。
Jenkins支持在web界面上可視化Maven的構(gòu)建順序,在Maven術(shù)語(yǔ)里稱為反應(yīng)器(reactor)??上В@個(gè)界面并不支持Make類型的構(gòu)建。
構(gòu)建階段
Maven構(gòu)建工具的主要優(yōu)勢(shì)就是它把構(gòu)建流程標(biāo)準(zhǔn)化了。
這一點(diǎn)對(duì)大型企業(yè)來(lái)說(shuō)非常有幫助,因?yàn)樗恍枰侔l(fā)明自己的構(gòu)建標(biāo)準(zhǔn)了。其他的
構(gòu)建工具實(shí)現(xiàn)各種構(gòu)建流程一般更加隨意。Maven的嚴(yán)苛有好有壞。有時(shí),剛開(kāi)始用Maven的人們會(huì)懷念像Ant那樣工具所帶來(lái)的自由。
你可以用任何工具來(lái)實(shí)現(xiàn)這些構(gòu)建,但是當(dāng)工具本身不強(qiáng)迫構(gòu)建、測(cè)試和部署的標(biāo)準(zhǔn)順序時(shí),很難還能保持習(xí)慣。
我們就應(yīng)該注意的是,測(cè)試階段是非常重要的。持續(xù)集成服務(wù)器需要在捕捉錯(cuò)誤方面表現(xiàn)出色,而自動(dòng)化測(cè)試是實(shí)現(xiàn)這個(gè)目標(biāo)的關(guān)鍵。
可選的構(gòu)建服務(wù)器
雖然以我的經(jīng)驗(yàn)來(lái)看,Jenkins在構(gòu)建服務(wù)器上是絕對(duì)的主流,但是它絕非不可替代。
Travis CI是一個(gè)托管方案,流行在開(kāi)源項(xiàng)目中。Buildbot是一個(gè)用Python編寫和配置的構(gòu)建服務(wù)器。ThoughtWorks出品的Go服務(wù)器是另外一種可選方案。Atlassian提供了Bamboo。GitLab現(xiàn)在也支持構(gòu)建服務(wù)器功能了。
當(dāng)評(píng)估不同的方案時(shí),留意不要被供應(yīng)商套牢( vendor lock-in)了。也要記住構(gòu)建服務(wù)器并不會(huì)取代那些已經(jīng)在本地開(kāi)發(fā)機(jī)上表現(xiàn)良好的構(gòu)建需求。
還有一個(gè)經(jīng)驗(yàn)法則:看看工具是否可以通過(guò)配置文件來(lái)配置。雖然管理人員容易被圖形化配置所打動(dòng),但是開(kāi)發(fā)和運(yùn)營(yíng)人員不會(huì)喜歡被要求使用一個(gè)只能通過(guò)圖形用戶界面配置的工具。
校驗(yàn)質(zhì)量指標(biāo)
構(gòu)建服務(wù)器的一個(gè)用途是校驗(yàn)軟件質(zhì)量指標(biāo)。Jenkins對(duì)此有一些內(nèi)置的支持??梢栽谝粋€(gè)任務(wù)頁(yè)面上執(zhí)行并可視化Java的單元測(cè)試。
另一個(gè)更高級(jí)的可選方案是使用Sonar代碼質(zhì)量可視化器,參見(jiàn)下圖。Sonar測(cè)試在構(gòu)建階段運(yùn)行并傳送到Sonar服務(wù)器上,在那里進(jìn)行存儲(chǔ)和可視化。
一臺(tái)Sonar服務(wù)器是一個(gè)讓開(kāi)發(fā)團(tuán)隊(duì)看到他們努力改良代碼庫(kù)的成果的好辦法。
Sonar服務(wù)器的缺點(diǎn)是有時(shí)會(huì)減緩構(gòu)建速度。建議每天夜里運(yùn)行一次Sonar構(gòu)建。
構(gòu)建服務(wù)器制造了大量可以顯示在公共顯示器上的數(shù)據(jù)。若是構(gòu)建失敗的時(shí)候能夠立即察覺(jué),就會(huì)有很大幫助。
第一步僅僅是連接一個(gè)類似資訊站( kiosk-like)那樣的顯示器,有一個(gè)web瀏覽器指向你構(gòu)建服務(wù)器的web界面。Jenkins有許多插件可以為資訊站顯示提供簡(jiǎn)化的任務(wù)概覽。它們有時(shí)被稱為信息輻射體( Xnformation rzadiators)。
連接構(gòu)建狀態(tài)到其他類型的硬件上也很常見(jiàn),例如熔巖燈或者多彩LED燈。
以我的經(jīng)驗(yàn)來(lái)看,這種類型的顯示可以讓人們對(duì)構(gòu)建服務(wù)器充滿興趣。盡管保持長(zhǎng)期使用比開(kāi)始擁有更加困難。如果你想把屏幕放到一個(gè)不容易被看到的地方以避免分心,那么做這件事就變得毫無(wú)意義了。
慎重放置熔巖燈和屏幕的組合非常有幫助。熔巖燈并不常亮,所以沒(méi)那么吸引人。當(dāng)一個(gè)構(gòu)建失敗發(fā)生時(shí),它亮起來(lái)了,于是你就知道你應(yīng)該看一看構(gòu)建信息輻射體了。熔巖燈甚至能夠表達(dá)構(gòu)建質(zhì)量的歷史記錄。當(dāng)熔巖燈亮的時(shí)候,它會(huì)發(fā)熱,過(guò)一會(huì)兒,熔巖在燈里環(huán)繞。當(dāng)錯(cuò)誤被修復(fù),燈冷卻了,但是熱量還會(huì)存在一小段時(shí)間,所以熔巖還會(huì)環(huán)繞一段時(shí)間,視修復(fù)構(gòu)建錯(cuò)誤的耗時(shí)而定。
想了解更多IT資訊,請(qǐng)?jiān)L問(wèn)中培偉業(yè)官網(wǎng):中培偉業(yè)