標籤:
前不久接觸了持續整合(Continuous Integration,CI)。
一、持續整合是什麼
首先說說“整合”的概念。在實際的軟體開發中,常常會發生兩種情境:
1.幾個項目組對同一個系統的不同功能分別開發,最終需要將所有的軟體功能整合到一個系統中;
2.軟體開發出來後,由於種種原因要進行更新升級。
上述兩種情境其實就是整合的含義。
瞭解了“整合”的概念之後,“持續整合”的概念就好理解了。顧名思義,就是比較頻繁地進行【自動整合】這個環節。(為什麼要自動整合呢?請參考本文第三部分:什麼情況要用到持續整合)
二、使用持續整合能有什麼好處
從持續整合的概念很容易看出,它的核心思想是“步步為營”,這種思想帶來如下好處:
- 當測試失敗或者出現錯誤時,允許及時復原代碼。
- 不斷測試修複整合問題,避免臨時抱佛腳。
- 預警問題和衝突代碼。
- 所有的代碼變化可以及時得到測試。
- 及時向開發人員反饋他們編寫代碼的功能、品質和對系統的影響情況。
- 頻繁的代碼檢查促進開發人員寫出模組化和簡潔的代碼。
- 項目任何時候都保持在可運行狀態。
---------------------------------------
有好處自然也會有劣勢存在,這裡簡要說一下:
- 強大的測試套件和編寫良好的測試代碼才能發揮自動化測試的優勢。
- 一定的硬體成本(小項目忽略不計)。
- 初始部署的人力成本。
三、什麼情況要用到持續整合
整合軟體的過程不是新問題,如果項目開發的規模比較小,軟體整合不是問題。但是如果項目很大,需要不斷添加新功能,則需要常常整合,這個時候就需要用到持續整合了。
四、持續整合如何實施
持續整合的實施,有不少說法,我比較認同阮一峰老師的說法(連結:http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html?utm_source=tuicool)。
為了方便查看,我直接引用了阮老師的關於實施的內容:
----------------------------------------------------------------------------------------------------------------------------------------
1 提交
流程的第一步,是開發人員向代碼倉庫提交代碼。所有後面的步驟都始於本地代碼的一次提交(commit)。
2 測試(第一輪)
代碼倉庫對commit操作配置了鉤子(hook),只要提交代碼或者合并進主幹,就會跑自動化測試。
測試有好幾種。
- 單元測試:針對函數或模組的測試
- 整合測試:針對整體產品的某個功能的測試,又稱功能測試
- 端對端測試:從使用者介面直達資料庫的全鏈路測試
第一輪至少要跑單元測試。
3 構建
通過第一輪測試,代碼就可以合并進主幹,就算可以交付了。
交付後,就先進行構建(build),再進入第二輪測試。所謂構建,指的是將源碼轉換為可以啟動並執行實際代碼,比如安裝依賴,配置各種資源(樣式表、JS指令碼、圖片)等等。
常用的構建工具如下。
- Jenkins
- Travis
- Codeship
- Strider
Jenkins和Strider是開源軟體,Travis和Codeship對於開源項目可以免費使用。它們都會將構建和測試,在一次運行中執行完成。
4 測試(第二輪)
構建完成,就要進行第二輪測試。如果第一輪已經涵蓋了所有測試內容,第二輪可以省略,當然,這時構建步驟也要移到第一輪測試前面。
第二輪是全面測試,單元測試和整合測試都會跑,有條件的話,也要做端對端測試。所有測試以自動化為主,少數無法自動化的測試案例,就要人工跑。
需要強調的是,新版本的每一個更新點都必須測試到。如果測試的覆蓋率不高,進入後面的部署階段後,很可能會出現嚴重的問題。
5 部署
通過了第二輪測試,當前代碼就是一個可以直接部署的版本(artifact)。將這個版本的所有檔案打包( tar filename.tar * )存檔,發到生產伺服器。
生產伺服器將打包檔案,解包成本地的一個目錄,再將運行路徑的符號連結(symlink)指向這個目錄,然後重新啟動應用。這方面的部署工具有Ansible,Chef,Puppet等。
6 復原
一旦目前的版本發生問題,就要復原到上一個版本的構建結果。最簡單的做法就是修改一下符號連結,指向上一個版本的目錄。
----------------------------------------------------------------------------------------------------------------------------------------
需要說明的是,其中重要的是第3步——構建,它是持續整合實施的核心步驟。目前使用量比較大的是Jenkins,讀者可以參考相關Jenkins的部落格內容。
五、致謝
非常感謝阮一峰老師提供的視角,大學時期曾買過阮老師的書籍《如何變得有思想》,他的思想及寫作風格讓我大受裨益。
六、參考連結
持續整合是什嗎? - 阮一峰的部落格 http://www.ruanyifeng.com/blog/2015/09/continuous-integration.html?utm_source=tuicool
整合開源系統實現自動化構建、代碼品質評估、項目資訊統計 - 孤劍 - 部落格園 http://www.cnblogs.com/AloneSword/archive/2011/11/05/2236950.html
Welcome to Jenkins CI! | Jenkins CI http://jenkins-ci.org/
持續整合(CI)初探