基礎概念:
1、什么是持續集成?
持續集成(Continuous Integration)指的是,頻繁地將代碼集成到主干,以便快速發現錯誤、防止分支大幅度偏離主干。
持續集成的目的,就是在產品快速迭代的同時保持代碼質量,它的核心措施主要有兩點:
1)代碼集成到主干之前,必須通過自動化測試,只要有一個測試用例失敗,就不能集成。
2)通過Code Review、代碼質量分析工具對代碼質量進行把關,以便確定是否能夠集成。
Martin Flower說過, “持續集成並不能消除Bug,而是讓他們非常容易發現和改正。”
從圖例上來看持續集成的流程就十分清晰了:
- 開發人員提交代碼到 Source Repository (源代碼倉庫),並通過 git hook 等
- 觸發 CI Server(持續集成服務器)的相關功能。執行 編譯 -> 測試 -> 輸出結果 的流程,
- 向開發人員反饋結果的 report
可以看出,持續集成的 核心 在於 確保新增的代碼能夠與原先代碼正確的集成。與后續要介紹的持續交付以及持續部署,其最主要的差別也就在於其目標不同。
不過持續集成的流程還存在一定的異議:上圖所示的流程為 Build -> Test,在阮老師的教程里頭是 Test -> Build。不過,持續集成本身只不過是一種軟件工程的方法或者策略,其並不規定具體的實現。在實際的應用中,還是需要結合具體的開發語言或者工具來定。
持續集成的優勢
和我們一直在使用的 階段集成(完成一個階段的開發后執行代碼的集成) 相比, 持續集成 的策略能夠為我們帶來哪些好處呢?
- 易於定位錯誤:每一次的代碼集成都需要執行相關的測試工作,持續集成頻繁的集成次數天然的將復雜的代碼邏輯切割為了小塊,也就使得每一次測試中遇到的錯誤能夠更加容易的被定位;
- 易於控制開發流程:更為細致的工作提交也就意味着更容易判斷當前的工作進度,這對於管理者規划開發流程而言提供了一個有效的參考,同時也為開發人員省下了匯報工作的時間;
- 易於CodeReview:對於大塊工作的切分自然也有助於做 CodeReview;
- 易於減少不必要的工作:build 以及 test 過程的自動化可以為你節約一大票的時間,從而投入到有價值的工作中去。
2、什么是持續交付?
持續交付(Continuous Delivery)指的是,新版本為了能夠快速安全的交付到生產環境中,需要將新版本先交付到類生產(Production-like)環境中(如UAT/Staging/Lab環境),以便進行相應的業務驗證、安全驗證、性能驗證等過程。
一旦類生產環境驗證通過,新版本就進入到生產階段。
持續交付可以看作是持續集成的進一步。它強調的是,不管怎么更新,軟件是隨時隨地可以交付的。
可以看到,與 持續集成 相比較,持續交付 添加了 Test -> Staging -> Production 的流程,也就是為新增的代碼添加了一個保證: 確保新增的代碼在生產環境中是可用的 。
在這一增加的流程中,Test 環節不僅僅包含基本的單元測試,還需要延伸到更為復雜的功能測試以及集成測試等。在這里,Staging 指的是 類生產環境 ,其盡可能的對真實的網絡拓撲、數據庫數據以及硬件設備等資源進行模擬,從而為測試人員反饋代碼在生成環境中的可能表現。流程中每一個環節的執行結果都會對開發人員進行反饋,每一個出現的錯誤都會導致版本的回滾。當測試完畢確認無誤之后,將由相關人員對其進行 手動部署到生產環境。
3、什么是持續部署?
持續部署(Continuous Deployment)指的是,新版本通過類生產環境的驗證后,自動部署到生產環境中。
持續部署可以看成持續交付的進一步。持續部署的前提是自動化完成測試、構建、驗證等步驟。
持續部署的目標是,代碼在任何時刻都可以進入自動地進入生產階段,為最終用戶提供服務。
可以看到,同 持續交付 相比 持續集成 的區別體現在對 Production 的自動化。從開發人員提交代碼到編譯、測試、部署的全流程不需要人工的干預,完全通過自動化的方式執行。這一策略加快了代碼提交到功能上線的速度,保證新的功能能夠第一時間部署到生產環境並被使用。
總結
我對於 持續集成、 持續交付 和 持續部署 三者的理解是:
- 持續集成 是三者中最簡單的,同時也是開銷最低的。由於不需要類生產環境的配合,測試環境也可以僅支持單元測試的執行,使得持續集成的實現是最為便宜的。考慮到現實開發過程的種種限制,向資源與成本做妥協,舍棄持續交付或者持續部署這樣看起來很美的方法,退而轉向持續集成也是很合理的選擇;
- 持續交付 面向開發初期或者軟件穩定性或者安全性要求較高的領域,新增代碼提交、編譯、測試等一系列環節均可以通過自動化工具完成,很好的節約了人力資源的同時,還對新增代碼的功能進行了有效的保障。在手動執行的部署環節,還可以添加在執行完畢標准測試之外的可能需求,以保證發布功能的可靠;
- 持續部署 面向穩定的發布上線后的功能更新。自動的,無需人工干預的部署可以保證新增功能第一時間被發布到生產環境中,確保其盡快的被用戶所使用。其與持續交付相比,就在於其功能可靠性與功能及時性的側重不同。
那么,在哪里能買得到呢? 該怎么對這些方法進行使用呢?
這就需要相關工具的配合協作了,以前端開發為例:
- 持續集成的工具有:Travis CI、Circle CI、jenkins 等
- 測試框架有:jasmine、mocha 等
- 測試運行器有:karma 等
- 構建工具有:grunt、gulp 等
- balabala…
DevOps 的技術棧與工具鏈
Everything is Code,DevOps 也同樣要通過技術工具鏈完成持續集成、持續交付、用戶反饋和系統優化的整合。Elasticbox 整理了 60+ 開源工具與分類,其中包括版本控制&協作開發工具、自動化構建和測試工具、持續集成&交付工具、部署工具、維護工具、監控,警告&分析工具等等,
補充了一些國內的服務,可以讓你更好的執行實施 DevOps 工作流。
- 版本控制&協作開發:GitHub、GitLab、BitBucket、SubVersion、Coding、Bazaar
- 自動化構建和測試:Apache Ant、Maven 、Selenium、PyUnit、QUnit、JMeter、Gradle、PHPUnit
- 持續集成&交付:Jenkins、Capistrano、BuildBot、Fabric、Tinderbox、Travis CI、flow.ci Continuum、LuntBuild、CruiseControl、Integrity、Gump、Go
- 容器平台: Docker、Rocket、Ubuntu(LXC)、第三方廠商如(AWS/阿里雲)
- 配置管理:Chef、Puppet、CFengine、Bash、Rudder、Powershell、RunDeck、Saltstack、Ansible
- 微服務平台:OpenShift、Cloud Foundry、Kubernetes、Mesosphere
- 服務開通:Puppet、docker Swarm、Vagrant、Powershell、OpenStack Heat
- 日志管理:Logstash、CollectD、StatsD
- 監控,警告&分析:Nagios、Ganglia、Sensu、zabbix、ICINGA、Graphite、Kibana