本文做者:CODING 用戶 - 何健
大概數週前,忽然有學長問我有沒有接觸過「持續集成」。php
在我腦海中,這是一個陌生的詞彙,因而百度瞭解了一番。實際上有開發和部署經驗的小夥伴對持續集成不會很是陌生的,特別是那些喜歡本身寫 webhook 的小夥伴。這篇文章來聊聊持續集成。html
互聯網軟件從開發到上線,後續迭代更新,已經有一套近乎標準的流程。其中 持續集成(Continuous integration,簡稱 CI)則是核心流程。像「CODING 持續集成」也直接支持自定義配置流程。java
大師 Martin Fowler 對持續集成是這樣定義的:持續集成是一種軟件開發實踐,即團隊開發成員常常集成他們的工做,一般每一個成員天天至少集成一次,也就意味着天天可能會發生屢次集成。每次集成都經過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘快地發現集成錯誤。許多團隊發現這個過程能夠大大減小集成的問題,讓團隊可以更快的開發內聚的軟件。
簡單說,持續集成就是指頻繁自動將代碼集成到主幹和生產環境,好比「CODING 持續集成」所實現的功能。python
持續集成的目的,快速迭代,保持高質量,避免沒必要要的成本投入。nginx
持續集成的核心措施, 集成到主幹前, 自動化測試, 只有經過,才能夠集成到主幹。git
成功集成到主幹後,也意味着能夠部署上線。
這便牽扯出另外兩個相關概念,持續交付、持續部署。
github
這裏一塊兒看一下集成的通常步驟:golang
每次集成都是這樣的步驟,所以持續集成會時這些基本步驟合體的循環,只要項目還在迭代,咱們就會不停重複這個步驟。web
這裏借用阮一峯老師的說法:數據庫
持續交付(Continuous delivery)指的是,頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。若是評審經過,代碼就進入生產階段。
持續交付能夠看做持續集成的下一步。它強調的是,無論怎麼更新,軟件是隨時隨地能夠交付的。注意,持續交付在自動化測試和集成結束後,不必定會自動部署。若是有自動部署,則是持續部署的概念了。
持續部署(continuous deployment)則是持續交付的下一步,代碼經過評審,自動化部署到生產環境。
其目的時能夠隨時部署,迅速投入生產階段。
持續部署這一步,意味着產品和觀衆見面,可是要經過重重考驗,測試、構建、部署等步驟,並且每一步都是自動的。
一般以下幾步:
就是常見的代碼提交到 CODING 倉庫
這個過程 一般是一個針對 commit 操做的鉤子,只要由提交,就會跑自動化測試,測試經過才能夠推代碼到主幹。(這輪測試至少要有單元測試)
常見測試:
第一輪測試經過,代碼能夠成功合併到主幹,交付。
那麼接下來,就要構建(build),進入第二輪測試。
可是,構建並非絕對必須的過程,構建就是爲了讓源碼變成能夠運行的程序或代碼。若是是 java、golang 項目,一般要 build 後才能夠運行。但若是是 php、python,可能並無構建過程,只要更新代碼到對應的 cgi 容器的工程目錄就能夠了。
構建過程,咱們能夠本身寫一些腳本和接口,掛到對應的鉤子裏。固然,也能夠用一些成熟的構建工具:
這輪測試 ,應該是一次全面測試,除了前面提到的自動化測試,還應該包含一些沒法自動化測試的部分。若是第一輪測試已經很全面(意味着前一步和第一輪測試合併了,不構建,天然沒法全面測試),那麼這輪測試能夠做爲第一輪測試的補集存在。
這裏須要注意的是,測試的覆蓋率。每次版本更新,更新點都應測試到位。
從開發到上線,總體流程:
持續集成——>持續交付——>持續部署
能夠用「CODING 持續集成」進行實踐。
Jenkins 是一個開源軟件項目,是基於 Java 開發的一種持續集成工具,用於監控持續重複的工做,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。
沒錯,它就是一個具體的持續集成解決方案。基於 Java 實現。
能夠實現:
說到這裏,一些有 php 開發經驗的小夥伴很容易聯想到寫 webhook。
沒錯,php 程序一般由 Http Server(好比 apache二、nginx 等)經過反響代理 fpm-cgi 或者直接內置 cgi 來執行 php 程序。這個過程更像是直接請求了 html 文檔。說這裏是由於,一些 php 寫手爲了方便更新線上代碼,並不想每次都手動 scp 命令上傳新的代碼,特別時有時候有些代碼多是有問題的。這時候,你們都想到用版本管理,git 就是很好的選擇,其中 github 和 CODING 都是不錯的選擇。
咱們的話題是持續集成,爲何會忽然扯到 php 和 git 呢?
那是由於,github 和 CODING 很早就都支持了 webhook 功能。換句話說,咱們能夠經過開放一個特別的接口,這個接口就一個功能,執行一系列操做,每當接口被調用時,接口能夠執行咱們預設好的一系列任務指令。這樣,咱們每次寫好代碼,只要 push 到倉庫,觸發 webhook,github 等平臺就會去請求咱們開放的接口,用來執行更新代碼和重啓服務等操做。
簡單說,咱們給服務器上留了一個「小工」,指派給他一個接頭人,接到信號就作預先安排好的事兒。
這個過程,是否是很像持續部署最後自動部署的階段?
沒錯,就是這樣,這個過程極可能時沒有自動測試環節,直接自動交付,自動部署。
固然,若是 webhook 寫複雜點,徹底能夠配合一些腳本命令作本身的一套 CICD。
CODING 是一個面向開發者的雲端開發平臺,提供 Git/SVN 代碼託管、任務管理、在線 WebIDE、Cloud Studio、開發協做、文件管理、Wiki 管理、提供我的服務及企業服務,其中實現了 DevOps 流程全自動化,爲企業提供軟件研發全流程管理工具,打通了從團隊構建、產品策劃、開發測試到部署上線的全過程。「CODING 持續集成」集成了 Jenkins 等主流企業開發流程工具。