持續(xù)集成和DevOps基礎(chǔ)
iTesting,愛(ài)測(cè)試,愛(ài)分享
我的新書(shū)前端自動(dòng)化測(cè)試框架Cypress從入門(mén)到精通出版啦!
正文
一、基本概念
1、持續(xù)集成
持續(xù)集成(Continuous integration,簡(jiǎn)稱CI),簡(jiǎn)單來(lái)說(shuō)持續(xù)集成就是頻繁地(一天多次)將代碼集成到主干。
每次集成都通過(guò)自動(dòng)化的構(gòu)建(包括編譯、發(fā)布、自動(dòng)化測(cè)試)來(lái)驗(yàn)證,從而盡快地發(fā)現(xiàn)集成錯(cuò)誤。

持續(xù)集成強(qiáng)調(diào)開(kāi)發(fā)人員提交了新代碼之后,立刻進(jìn)行構(gòu)建、(單元)測(cè)試。根據(jù)測(cè)試結(jié)果,可以確定新代碼和原有代碼能否正確地集成在一起。
持續(xù)集成的好處:
快速發(fā)現(xiàn)錯(cuò)誤,每完成一點(diǎn)更新,就集成到主干,可以快速發(fā)現(xiàn)錯(cuò)誤,定位錯(cuò)誤也比較容易;
防止分支大幅偏離主干,如果不經(jīng)常集成,主干又在不斷更新,會(huì)導(dǎo)致以后集成的難度變大,甚至難以集成。
持續(xù)集成的目的:
讓產(chǎn)品可以快速迭代,同時(shí)還能保持高質(zhì)量。它的核心措施是,代碼集成到主干之前,必須通過(guò)自動(dòng)化測(cè)試。只要有一個(gè)測(cè)試用例失敗,就不能集成。
持續(xù)集成并不能消除 Bug,而是讓它們非常容易的發(fā)現(xiàn)和改正。
2、持續(xù)交付
持續(xù)交付(Continuous delivery)指的是:頻繁地將軟件的新版本,交付給質(zhì)量團(tuán)隊(duì)或者用戶,以供評(píng)審。如果評(píng)審?fù)ㄟ^(guò),代碼就進(jìn)入生產(chǎn)階段。

持續(xù)交付可以看作持續(xù)集成的下一步。它強(qiáng)調(diào)的是,不管怎么更新,軟件是隨時(shí)隨地可以交付的。
3、持續(xù)部署
持續(xù)部署(Continuous deployment)是持續(xù)交付的下一步,指的是代碼通過(guò)評(píng)審以后,自動(dòng)部署到生產(chǎn)環(huán)境。

持續(xù)部署的目標(biāo)是:代碼在任何時(shí)候都是可以部署的,可以進(jìn)入生產(chǎn)階段,持續(xù)部署的前提是能自動(dòng)化完成測(cè)試、構(gòu)建、部署等步驟。
4、持續(xù)交付和持續(xù)部署的區(qū)別
CD是持續(xù)交付和持續(xù)部署,但是持續(xù)交付不等于持續(xù)部署。持續(xù)部署則是在持續(xù)交付的基礎(chǔ)上,把部署到生產(chǎn)環(huán)境的過(guò)程自動(dòng)化。具體區(qū)別參考下圖:

回到頂部
二、持續(xù)集成的一般流程
根據(jù)持續(xù)集成的設(shè)計(jì),代碼從提交到生產(chǎn),整個(gè)過(guò)程有以下幾步:
(1)提交
流程的第一步,是開(kāi)發(fā)者向代碼倉(cāng)庫(kù)提交代碼。所有后面的步驟都始于本地代碼的一次提交(commit)。
(2)測(cè)試(第一輪)
代碼倉(cāng)庫(kù)對(duì)commit操作配置了鉤子(hook),只要提交代碼或者合并進(jìn)主干,就會(huì)跑自動(dòng)化測(cè)試。
(3)構(gòu)建
通過(guò)第一輪測(cè)試,代碼就可以合并進(jìn)主干,就算可以交付了。
交付后,就先今夕構(gòu)建(build),再進(jìn)入第二輪測(cè)試。所謂構(gòu)建,指的是將源碼轉(zhuǎn)換為可以運(yùn)行的實(shí)際代碼,比如安裝依賴,配置各種資源(樣式表、JS腳本、圖片)等等。
常用的構(gòu)建工具主要是:jeknins、Travis、codeship等。
(4)測(cè)試(第二輪)
構(gòu)建完成,就要進(jìn)行第二輪測(cè)試。如果第一輪已經(jīng)涵蓋了所有測(cè)試內(nèi)容,第二輪可以省略,當(dāng)然,這時(shí)構(gòu)建步驟也要移到第一輪測(cè)試前面。
第二輪是全面測(cè)試,單元測(cè)試和繼承測(cè)試都會(huì)跑,有條件的話,也要做端對(duì)端測(cè)試。所有測(cè)試以自動(dòng)化為主,少數(shù)無(wú)法自動(dòng)化的測(cè)試用例,就要人工跑。
(5)部署
通過(guò)第二輪測(cè)試,當(dāng)前代碼就是一個(gè)可以直接部署的版本(artifact)。將這個(gè)版本的所有文件打包(tar filename.tar *)存檔,發(fā)到生產(chǎn)服務(wù)器。
生產(chǎn)服務(wù)器將打包文件,解包成本地的一個(gè)目錄,再講運(yùn)行路徑的符號(hào)鏈接(symlink)指向這個(gè)目錄,然后重新啟動(dòng)應(yīng)用。
這方面的部署工具有Ansible、Chef、Puppet等。
(6)回滾
一旦當(dāng)前版本發(fā)生問(wèn)題,就要回滾到上一個(gè)版本的構(gòu)建結(jié)果。最簡(jiǎn)單的做法就是修改一下符號(hào)鏈接,指向上一個(gè)版本的目錄。
回到頂部
三、認(rèn)識(shí)DevOps?
1、DevOps是什么?
DevOps 一詞的來(lái)自于?Development(開(kāi)發(fā))?和?Operations(運(yùn)維)?的組合,突出重視軟件開(kāi)發(fā)人員和運(yùn)維人員的溝通合作,通過(guò)自動(dòng)化流程來(lái)使得軟件構(gòu)建、測(cè)試、發(fā)布更加快捷、頻繁和可靠。
目前對(duì) DevOps 有太多的說(shuō)法和定義,不過(guò)它們都有一個(gè)共同的思想:“解決開(kāi)發(fā)者與運(yùn)維者之間曾經(jīng)不可逾越的鴻溝,增強(qiáng)開(kāi)發(fā)者與運(yùn)維者之間的溝通和交流”。
DevOps可以用一個(gè)公式表示:文化觀念的改變+自動(dòng)化工具 = 不斷適應(yīng)快速變化的市場(chǎng)。
強(qiáng)調(diào):DevOps是一個(gè)框架,是一種方法論,并不是一套工具,它包括一系列的基本原則和實(shí)踐。
DevOps的核心價(jià)值:
更快速地交付,響應(yīng)市場(chǎng)的變化;
更多地關(guān)注業(yè)務(wù)的改進(jìn)和提升。
2、為什么需要DevOps?
(1)產(chǎn)品迭代?
在現(xiàn)實(shí)工作中,往往都是用戶不知道自己想要什么,但是當(dāng)我們?cè)O(shè)計(jì)完一個(gè)產(chǎn)品后,他會(huì)告訴我們他們不需要什么,這樣我們的產(chǎn)品需要反復(fù)的迭代,而且過(guò)程可能是曲折的,那我們有什么好辦法快速的交付價(jià)值,靈活的響應(yīng)變化呢?
答案就是DevOps,因?yàn)镈evOps是面向業(yè)務(wù)目標(biāo),助力業(yè)務(wù)成功的最佳實(shí)踐。
(2)技術(shù)革新
現(xiàn)在的IT技術(shù)架構(gòu)隨著系統(tǒng)的復(fù)雜化不斷的革新,從最初所有服務(wù)在一個(gè)系統(tǒng)中,發(fā)展到現(xiàn)在的微服務(wù)架構(gòu)、從純手動(dòng)操作到全自動(dòng)流程、從單臺(tái)物理機(jī)到云平臺(tái)。

3、DevOps如何落地?
落實(shí)DevOps的指導(dǎo)思想
高效的協(xié)作和溝通、自動(dòng)化流程和工具、迅速敏捷的開(kāi)發(fā)、持續(xù)交付和部署、不斷學(xué)習(xí)和創(chuàng)新。
下面是一張來(lái)自 devops 經(jīng)典著作《success with enterprise dev-ops whitepaper》的介紹圖。

敏捷管理:一支訓(xùn)練有素的敏捷開(kāi)發(fā)團(tuán)隊(duì)是成功實(shí)施DevOps的關(guān)鍵。
根據(jù)康威定律:軟件團(tuán)隊(duì)開(kāi)發(fā)的產(chǎn)品是對(duì)公司組織架構(gòu)的反映。
持續(xù)交付部署:實(shí)現(xiàn)應(yīng)用程序的自動(dòng)化構(gòu)建、部署、測(cè)試和發(fā)布。
通過(guò)技術(shù)工具,把傳統(tǒng)的手工操作轉(zhuǎn)變?yōu)樽詣?dòng)化流程,這不僅有利于提高產(chǎn)品開(kāi)發(fā)、運(yùn)維部署的效率,還將減少人為因素引起的失誤和事故,提早發(fā)現(xiàn)問(wèn)題并及時(shí)地解決問(wèn)題,這樣也保證了產(chǎn)品的質(zhì)量。下圖展示了DevOps自動(dòng)化的流程:

IT服務(wù)管理(ITSM),它是傳統(tǒng)的“IT管理”轉(zhuǎn)向?yàn)椤癐T服務(wù)”為主的一種模式,前者可能更關(guān)注具體服務(wù)器管理、網(wǎng)絡(luò)管理和系統(tǒng)軟件安裝部署等工作;而后者更關(guān)注流程的規(guī)范化、標(biāo)準(zhǔn)化,明確定義各個(gè)流程的目標(biāo)和范圍、成本和效益、運(yùn)營(yíng)步驟、關(guān)鍵成功因素和績(jī)效指標(biāo)、有關(guān)人員的責(zé)權(quán)利,以及各個(gè)流程之間的關(guān)系等,比如建立線上事故解決流程、服務(wù)配置管理流程等;?
精益管理:建立一個(gè)流水線式的 IT 服務(wù)鏈,打通開(kāi)發(fā)與運(yùn)維的鴻溝,實(shí)現(xiàn)開(kāi)發(fā)運(yùn)維一體化的敏捷模式。
精益生產(chǎn)主要來(lái)源于豐田生產(chǎn)方式(TPS)的生產(chǎn)哲學(xué),它以降低浪費(fèi)、提升整體客戶價(jià)值而聞名,它主要利用優(yōu)化自動(dòng)化流程來(lái)提高生產(chǎn)率、降低浪費(fèi)。所以精益生產(chǎn)的精髓是即時(shí)制(JIT)和自動(dòng)化(Jidoka)。
精益管理貫穿于整個(gè)DevOps階段,它鼓勵(lì)主動(dòng)發(fā)現(xiàn)問(wèn)題,不斷的優(yōu)化流程,從而達(dá)到持續(xù)交付、快速反饋、降低風(fēng)險(xiǎn)和保障質(zhì)量的目的。
4、實(shí)施DevOps的具體方法
(1)建立快速敏捷的團(tuán)隊(duì)
按照業(yè)務(wù)功能劃分團(tuán)隊(duì),建立溝通群組,設(shè)置產(chǎn)品負(fù)責(zé)人(一個(gè)策劃人員)、Scrum Master(我們一般選擇測(cè)試人員擔(dān)任,測(cè)試驅(qū)動(dòng)開(kāi)發(fā)模式)和開(kāi)發(fā)者團(tuán)隊(duì)(前端工程師、后端工程師、測(cè)試各一名),形成如下的組織結(jié)構(gòu)和系統(tǒng)構(gòu)架:
?
(2)實(shí)現(xiàn)自動(dòng)化的流程
直接看圖說(shuō)話吧,以下為一個(gè)完整DevOps的Pipeline:

提交:工程師將代碼在本地測(cè)試后,提交到版本控制系統(tǒng),如Git代碼倉(cāng)庫(kù)中。
構(gòu)建:持續(xù)整合系統(tǒng)(如Jenkins CI),在檢測(cè)到版本控制系統(tǒng)更新時(shí),便自動(dòng)從Git代碼倉(cāng)庫(kù)里拉取最新的代碼,進(jìn)行編譯、構(gòu)建。
單元測(cè)試:Jenkins完成編譯構(gòu)建后,會(huì)自動(dòng)執(zhí)行指定的單元測(cè)試代碼。
部署到測(cè)試環(huán)境:在完成單元測(cè)試后,Jenkins可以將應(yīng)用程序部署到與生產(chǎn)環(huán)境相近的測(cè)試環(huán)境中進(jìn)行測(cè)試。
預(yù)生產(chǎn)環(huán)境測(cè)試:在預(yù)生產(chǎn)測(cè)試環(huán)境里,可以進(jìn)行一些最后的自動(dòng)化測(cè)試,例如使用Appium自動(dòng)化測(cè)試工具進(jìn)行測(cè)試,以及與實(shí)際情況類(lèi)似的一些測(cè)試可由開(kāi)發(fā)人員或客戶人員手動(dòng)進(jìn)行測(cè)試。
部署到生產(chǎn)環(huán)境:通過(guò)所有測(cè)試后,便可以使用灰度更新將最新的版本部署到實(shí)際生產(chǎn)環(huán)境里。
(3)DevOps在落地實(shí)施過(guò)程中經(jīng)常會(huì)遇到的問(wèn)題
人手緊缺;跨部門(mén)協(xié)作,前期溝通培訓(xùn)成本高;前期投入工作量大見(jiàn)效少。
5、DevOps技術(shù)棧?
(1)敏捷管理工具?
Trello、Teambition、Worktile、Tower
(2)產(chǎn)品&質(zhì)量管理?
confluence、禪道、Jira、Bugzila。
其中 confluence 和禪道主要是產(chǎn)品的需求、定義、依賴和推廣等的全面管理工具;而 Jira 和 Bugzilla 是產(chǎn)品的質(zhì)量管理和監(jiān)控能力,包括測(cè)試用例、缺陷跟蹤和質(zhì)量監(jiān)控等。
目前使用Jira 和 禪道較多。
(3)代碼倉(cāng)庫(kù)管理
Git、Gitlab、Github.
Git是一個(gè)開(kāi)源的分布式版本控制系統(tǒng);
Gitlab 和 Github 是用于倉(cāng)庫(kù)管理系統(tǒng)的開(kāi)源項(xiàng)目,它們使用Git作為代碼管理工具,并在此基礎(chǔ)上搭建起來(lái)的web服務(wù)。
(4)自動(dòng)化構(gòu)建腳本
Gradle、Maven、SBT、ANT
(5)虛擬機(jī)和容器化
VMware、VirtualBox、Vagrant、Docker
(6)持續(xù)集成(CI)&持續(xù)部署(CD)
Jenkins、Hudson、Travis CI、CircleCI。
Jenkins 是一個(gè)開(kāi)源軟件項(xiàng)目,是基于 Java 開(kāi)發(fā)的一種持續(xù)集成工具,用于監(jiān)控持續(xù)重復(fù)的工作,旨在提供一個(gè)開(kāi)放易用的軟件平臺(tái),使軟件的持續(xù)集成變成可能,它的前身為Hudson。
Travis CI 是目前新興的開(kāi)源持續(xù)集成構(gòu)建項(xiàng)目,它與 jenkins 很明顯的區(qū)別在于采用 yaml 格式,簡(jiǎn)潔清新獨(dú)樹(shù)一幟。
CircleCI 是一個(gè) web 應(yīng)用開(kāi)發(fā)者提供服務(wù)的持續(xù)集成平臺(tái),主要為開(kāi)發(fā)團(tuán)隊(duì)提供測(cè)試,持續(xù)集成,以及代碼部署等服務(wù)。
(7)自動(dòng)化測(cè)試
Appium
Appium是一個(gè)移動(dòng)端的自動(dòng)化框架,可用于測(cè)試原生應(yīng)用,移動(dòng)網(wǎng)頁(yè)應(yīng)用和混合型應(yīng)用,且是跨平臺(tái)的。可用于IOS和Android以及firefox的操作系統(tǒng)。
Selenium
Selenium 測(cè)試直接在瀏覽器中運(yùn)行,就像真實(shí)用戶所做的一樣。Selenium 測(cè)試可以在 Windows、Linux 和 Macintosh上的 Internet Explorer、Mozilla 和 Firefox 中運(yùn)行。
Mock測(cè)試
Mock測(cè)試就是在測(cè)試過(guò)程中,對(duì)于某些不容易構(gòu)造或者不容易獲取的對(duì)象,用一個(gè)虛擬的對(duì)象來(lái)創(chuàng)建以便測(cè)試的測(cè)試方法。這個(gè)虛擬的對(duì)象就是Mock對(duì)象,Mock對(duì)象就是真實(shí)對(duì)象在調(diào)試期間的代替品。Java中的Mock框架常用的有EasyMock和Mockito等。
消費(fèi)者驅(qū)動(dòng)契約測(cè)試
契約測(cè)試是一種針對(duì)外部服務(wù)的接口進(jìn)行的測(cè)試,它能夠驗(yàn)證服務(wù)是否滿足消費(fèi)方期待的契約。當(dāng)一些消費(fèi)方通過(guò)接口使用某個(gè)組件的提供的行為時(shí),它們之間就產(chǎn)生了契約。這個(gè)契約包含了對(duì)輸入和輸出的數(shù)據(jù)結(jié)構(gòu)的期望,性能以及并發(fā)性。而PACT是目前比較流的消費(fèi)者驅(qū)動(dòng)契約測(cè)試框架。
(8)自動(dòng)化運(yùn)維工具
Ansible
Puppet
Chef
IT運(yùn)維自動(dòng)化是指將IT運(yùn)維中日常的、大量的重復(fù)性工作自動(dòng)化,把過(guò)去的手工執(zhí)行轉(zhuǎn)為自動(dòng)化操作。自動(dòng)化是IT運(yùn)維工作的升華,IT運(yùn)維自動(dòng)化不單純是一個(gè)維護(hù)過(guò)程,更是一個(gè)管理的提升過(guò)程,是IT運(yùn)維的最高層次,也是未來(lái)的發(fā)展趨勢(shì)。下圖為常用自動(dòng)化運(yùn)維工具對(duì)比:

(9)監(jiān)控管理工具
Zabbix
Zabbix是一個(gè)基于WEB界面的提供分布式系統(tǒng)監(jiān)視以及網(wǎng)絡(luò)監(jiān)視功能的企業(yè)級(jí)開(kāi)源解決方案。
ELK Stack日志分析系統(tǒng)
ELK Stack是開(kāi)源日志處理平臺(tái)解決方案,背后的商業(yè)公司是Elastic。它由日志采集解析工具 Logstash、基于 Lucene 的全文搜索引擎 Elasticsearch、分析可視化平臺(tái) Kibana三部分組成。
云監(jiān)控(如Amazon CloudWatch)
Amazon CloudWatch 是一項(xiàng)針對(duì) AWS 云資源和在 AWS 上運(yùn)行的應(yīng)用程序進(jìn)行監(jiān)控的服務(wù)。您可以使用 Amazon CloudWatch 收集和跟蹤各項(xiàng)指標(biāo)、收集和監(jiān)控日志文件、設(shè)置警報(bào)以及自動(dòng)應(yīng)對(duì) AWS 資源的更改
注意:本內(nèi)容轉(zhuǎn)自休耕博客, 請(qǐng)點(diǎn)擊閱讀原文查看。
技術(shù)討論
公眾號(hào)里直接回復(fù) 666, 帶你入圈。
?-???-??時(shí)人莫小池中水, 淺處不妨有臥龍??-??-
· 猜你喜歡的文章?·
