天天看點

持續內建

代碼不是技術團隊的傳遞物,可運作的軟體才是

雖然我們在同一個時代寫代碼做開發,但技術實踐層面,不同的團隊卻仿佛生活在不同的年代。

持續內建

把開發工作流程分為以下幾個階段:

編碼 -> 建構 -> 內建 -> 測試 -> 傳遞 -> 部署

「持續內建(Continuous Integration)」、「持續傳遞(Continuous Delivery)」和「持續部署(Continuous Deployment)」有着不同的軟體自動化傳遞周期。

持續 (Continuous):不斷的擷取回報,響應回報。

內建 (Integration):當我們在一個團隊中工作的時候。把不同人的代碼放在一起,使之成為一個可工作軟體的過程叫內建。編譯、測試、打包;

部署 (Deployment):應用元件或基本設施的代碼或配置變更在産品環境生效稱為“部署”;

釋出 (Release):具有業務影響的功能變化對最終使用者可見稱為“釋出”。

傳遞 (Delivery):可以了解為從 Deployment 到 Release之間的階段,更多的強調的是一種能力。開發有能力頻繁的部署,業務有能力随時釋出。

名詞說的那麼多,扯的天花亂墜也沒什麼卵用,達到實際的效果才行。沒有标準都是紙上談兵

原則:開發人員送出代碼到git,剩下的事情軟體自動完成,打開浏覽器可以直接看到程式界面

讓産品快速可以快速疊代,同時還能保持高品質。它的核心措施是,代碼內建到主幹之前,必須通過自動化測試。

隻要有一個測試用例失敗,就不能內建。

"持續內建并不能消除bug,而是讓它們非常容易發現和改正。"

全面的自動化測試:這是實踐持續內建&持續部署基礎,同時,選擇合适的自動化測試工具也極其重要;

靈活的基礎設施:容器,虛拟機存在讓開發人員和QA人員不必再大費周折;

版本控制工具:如Git、SVN

自動化建構和軟體釋出流程工具:如Jenkins

回報機制:如建構/測試失敗,可以快速回報到相關負責人,以盡快解決達到一個穩定的版本。

"快速失敗",對産品沒有風險情況下進行測試,并快速響應

最大限度減少風險,降低錯誤代碼修複的成本;

将重複性的手工流程自動化,讓工程師更加專注代碼;

保持頻繁部署,快速生成可部署軟體;

提高項目的能見度,友善團隊成員了解項目的進度和成熟度

增強開發人員對軟體産品的信心,幫助建立更好工程師文化

快速發現錯誤。沒完成一點更新,就內建到主幹,可以快速發現錯誤,定位錯誤也比較容易

防止分支大幅偏離主幹。如果不是經常內建,主幹又在不斷更新,會導緻以後內建的難度很大,甚至難以內建

選擇合适的內建系統,私有部署還是托管型持續內建系統。

條件:

團隊運作的基礎設施

內建系統資源投入力度

Maven、Gradle或Jenkins,他們的特點是自由開源,且文檔支援廣泛。優點在于建構環境有完全的控制權,

能夠實作完全的定制。但需要搭建環境和配置、維護成本高,需要買專門的機器,話費較多的人力物力且更新遷移

更新高;

CircleCI:https://circleci.com/

Codeship: https://www.cloudbees.com/products/codeship

TravisCI :https://travis-ci.org/

FlowCI:https://github.com/FlowCI/docs,https://flowci.github.io/#download

整體而言,目前大部分公司選擇的是Jenkins,随着雲服務,Docker,Saas的普及,越來越多的企業選擇托管型內建系統。

選擇持續內建系統隻是持續內建應用的其中一步,還需要建立合适的內建文化比如代碼品質管控、測試文化。做好持續內建,可為持續傳遞與持續部署打好堅實基礎。

** 邁向持續內建**

Daily Build 每日建構

持續內建

開發與內建合二為一

盡早送出代碼去內建

盡早把代碼和已有代碼內建到一起,而不應該等着所有代碼都開發完了,再去做送出

通過盡早內建。減少改動量,降低內建難度

執行同樣的操作,本地環境會快于CI伺服器環境

持續內建

隻有CI伺服器處于綠色的狀态才能送出代碼,用好本地建構腳本(build script),保證各種各樣的檢查都可以在本地環境執行

持續內建

流程的第一步,是開發者向代碼倉庫送出代碼。所有後面的步驟都始于本地代碼的一次送出.

代碼倉庫對commit操作配置了鈎子(hook),隻要送出代碼或者合并進主幹,就會跑自動化測試。

單元測試:針對函數或子產品的測試

內建測試:針對整個産品某個功能

通過第一輪測試,代碼可以合并進主幹,就算可以傳遞了

傳遞後,就先進行建構(build),再進入第二輪測試。所謂建構,指的是将源代碼轉換成可運作的實際代碼,比如安裝依賴,配合各種資源(樣式、JS腳本、圖檔)等等。

常用的建構工具:

Jenkins

Travis

Codeship

Strider

Jenkins宇Strider是開源軟體,Travis和Codeship對于開源項目可以免費使用。它們都會将建構和測試,在一次運作中執行完成。

建構完成,就要進行第二輪測試。如果第一輪已經覆寫了所有測試内容,第二輪可以省略,當然,這時建構步驟也要移到第一輪測試前面。

第二輪是全面測試,單元測試和內建測試都會跑,有條件的話,也要做端到端的測試。所有測試以自動化為主,少數無法自動化的測試用例,就要人工跑

需要強調的是,新版本的每一個更新點都必須要測試到。如果測試的覆寫率不高,進入後面的部署階段,很可能出現嚴重的問題。

通過了第二輪測試,目前代碼就是一個可以直接部署的版本。将這個版本的所有檔案打包存檔,發到生産伺服器。

生産伺服器将打封包件,解包成本地的一個目錄,在将運作路徑的符号連結指向目錄,然後重新啟動應用。這方面的部署工具有Ansible,Chef,Puppet等。

一旦目前版本發生問題,就要復原到上一個版本的建構結果。最簡單的做法就是修改一下符号連結,指向上一個版本目錄。