讀古今文學網 > Java程序員修煉之道 > 第12章 構建和持續集成 >

第12章 構建和持續集成

內容提要

  • 構建管道和持續集成(CI)的重要性
  • Maven 3:慣例優先於配置的構建工具
  • Jenkins:得到公認的CI工具
  • 使用FindBugs和Checkstyle等靜態代碼分析工具
  • Leiningen:Clojure構建工具

我們接下來要講的故事取材於MegaCorp的真實事件,出於對當事人的保護隱去了真實姓名。故事的主角是:

  • Riley,剛畢業的新人;
  • Alice和Bob,兩個「經驗豐富」的開發老手;
  • Hazel,緊張的項目經理。

時間是週五下午兩點,新開發的Sally支付功能要在週末跑批前上線。

Riley:我能為上線做點什麼嗎?

Alice:當然,我想最後一版是Bob構建的。Bob?

Bob:是的,是我幾周前用Eclipse生成的。

Riley:但現在我們都用IntelliJ了;那麼,該怎麼構建呢?

Bob:哦,這需要些經驗!總之我們會搞定它,年輕人!

Riley:好。我沒這方面的經驗,但支付功能的構建應該沒問題,對吧?

Alice:當然沒問題。我在兩周前剛創建的代碼分支,其他人對代碼的改動肯定還不多。

Bob:但是,實際上,你知道我們添了些泛型的修改,對不對?

[尷尬的沉默] Hazel:改完你們要經常在一起試試。這個我們強調過很多次了!

Riley:要不要我訂外賣?貌似今晚我們得加班了。

Hazel:你說對了,學得挺快嘛!

Alice:實際上,我已經將訂餐電話設成快速撥號狀態了,這是常態!

Hazel:趕緊把它搞定!我們已經因為延遲發佈和bug太多損失很多了,高管正想找機會殺雞儆猴呢。

Alice、Bob和Riley明顯沒有優秀的構建和持續集成(CI)經驗,但「構建和CI」究竟是什麼意思?

構建和持續集成 快速和重複地為各種環境產生高質量二進制部署工件的過程。

開發團隊經常談論「構建」或「構建過程」1。就本章而言,我們在提到構建時是指遵循構建週期用構建工具將源碼轉化成二進制工件的過程。像Maven這種構建工具有很長的、詳細的構建週期,它們中的大多數對於開發人員來說是不可見的。一個相當基礎的、典型的構建週期如圖12-1所示。

1 如果你的團隊在談論這些內容時或虔誠、或害怕,或話不多,那這一章就是為你準備的。

清除——>編譯——>測試——>打包

圖12-1 一個簡化的典型構建週期

持續集成是指團隊成員按照「盡早提交,經常提交」的口號頻繁地集成工作成果。每個開發人員至少按天把代碼提交到版本控制系統中,CI服務器會自動定期構建,以盡快檢查集成錯誤2。CI服務器通常會在大屏幕上顯示開心/悲傷的表情給團隊以反饋。

2 構建時間可配置:間隔可以是幾分鐘,也可以在提交時觸發,或在其他特定時間運行。

那麼構建和CI為什麼重要?本章的每一節都會強調某些獨特的好處,表12-1中列出了其中最為重要的幾個。

表12-1 構建和CI的主要優勢

主題解釋 重複性任何人都可以隨時隨地運行構建。也就是說整個開發團隊都可以自如地運行構建,而不需要一個專門的「構建負責人」做這件事。如果一個新加入的團隊成員需要在週日的凌晨三點運行構建,他可以毫不猶豫地這麼干 盡早反饋一旦出了問題,你馬上就能知道。在開發者處理需要集成的代碼時這跟CI尤其相關 一致性你知道部署的軟件是什麼版本,並且完全清楚每個版本的代碼 依賴管理大多數Java項目都有幾個依賴項,比如log4j、Hibernate、Guice等。手工管理這些依賴項可能會非常困難,而且有一個版本發生變化就可能會導致軟件不可用。良好的構建和CI能確保你總是針對同一個第三方依賴項進行編譯和運行

為了將源碼部署到運行時環境中,需要經過構建週期將其轉變成二進制工件(JAR、WAR、RAR、EAR等)。比較老的Java項目通常都使用Ant,而比較新的則使用Maven或Gradle。很多開發團隊還有夜間集成構建,有些已經升級成用CI服務器定期執行構建了。3

3 合作極其默契的項目團隊能讓非技術隊友運行構建。

警告 如果你從IDE中構建JAR文件或其他工件,那是在自找麻煩。從IDE中構建得到的不是與本地IDE設置無關的可重用構建,那簡直就是埋下了禍根。作為朋友,我再怎麼強調這一點都不為過:不允許你用IDE構建工件!

但大多數開發人員都覺得構建和CI不值得他們投入精力,他們覺得這個工作做起來不夠爽,也得不到什麼回報。構建工具和CI服務器經常是在項目一開始的時候搭起來,但很快就被遺忘了。這麼多年來,我們聽到過很多類似的說法:「我們為什麼還要在構建和CI服務器上花時間呢?現在弄得也挺好用的。夠用就好,對不對?」

我們堅信良好的構建和CI能加快編碼速度,提高代碼質量。跟TDD(見第11章)相結合的構建和CI意味著你可以毫無後顧之憂地快速重構。你可以把它當做在你身後默默提供支持的導師,它為你營造一個安全的環境,讓你可以快速編寫並大膽修改代碼。

本章,我們會首先介紹Maven 3。Maven 3是一個流行(還有爭議,有些開發人員挺討厭它)的構建工具,會強迫你按照嚴格定義好的構建週期工作。介紹Maven 3的內容中,除了常見的Java代碼,還會涉及Groovy和Scala代碼的構建。

Jenkins是CI界的流行天王,可以通過多種方式配置(以插件系統的方式)持續執行構建,並產生質量指標。在學習Jenkins時,我們還會深入瞭解FindBugs和Checkstyle產生的代碼質量指標。

在學完Maven和Jenkins之後,你應該會徹底熟悉典型的Java構建和CI流程。之後我們會重點討論Clojure的構建工具Leiningen,完全從另一個角度看看構建和部署工具。你會看到它在提供了工業級強度的構建和部署能力的同時又如何實現了極其迅速、易用的TDD風格。

與Maven 3的相遇將開啟你的構建和CI之旅!