使用開(kāi)源工具構(gòu)建DevOps流水線的初學(xué)者指南
如果你是 DevOps 新人,請(qǐng)查看這 5 個(gè)步驟來(lái)構(gòu)建你的第一個(gè) DevOps 流水線。
DevOps 已經(jīng)成為解決軟件開(kāi)發(fā)過(guò)程中出現(xiàn)的緩慢、孤立或者其他故障的默認(rèn)方式。但是當(dāng)你剛接觸 DevOps 并且不確定從哪開(kāi)始時(shí),就意義不大了。本文探索了什么是 DevOps 流水線并且提供了創(chuàng)建它的 5 個(gè)步驟。盡管這個(gè)教程并不全面,但可以給你以后上手和擴(kuò)展打下基礎(chǔ)。首先,插入一個(gè)小故事。
我的 DevOps 之旅
我曾經(jīng)在花旗集團(tuán)的云小組工作,開(kāi)發(fā)基礎(chǔ)設(shè)施即服務(wù)網(wǎng)頁(yè)應(yīng)用來(lái)管理花旗的云基礎(chǔ)設(shè)施,但我經(jīng)常對(duì)研究如何讓開(kāi)發(fā)流水線更加高效以及如何帶給團(tuán)隊(duì)積極的文化感興趣。我在 Greg Lavender 推薦的書(shū)中找到了答案。Greg Lavender 是花旗的云架構(gòu)和基礎(chǔ)設(shè)施工程(即 Phoenix 項(xiàng)目)的 CTO。這本書(shū)盡管解釋的是 DevOps 原理,但它讀起來(lái)像一本小說(shuō)。
書(shū)后面的一張表展示了不同公司部署在發(fā)布環(huán)境上的頻率:
公司 | 部署頻率 |
---|---|
Amazon | 23,000 次/天 |
5,500 次/天 | |
Netflix | 500 次/天 |
1 次/天 | |
3 次/周 | |
典型企業(yè) | 1 次/9 個(gè)月 |
Amazon、Google、Netflix 怎么能做到如此之頻繁?那是因?yàn)檫@些公司弄清楚了如何去實(shí)現(xiàn)一個(gè)近乎完美的 DevOps 流水線。
但在花旗實(shí)施 DevOps 之前,情況并非如此。那時(shí)候,我的團(tuán)隊(duì)擁有不同構(gòu)建階段的環(huán)境,但是在開(kāi)發(fā)服務(wù)器上的部署非常手工。所有的開(kāi)發(fā)人員都只能訪問(wèn)一個(gè)基于 IBM WebSphere Application 社區(qū)版的開(kāi)發(fā)環(huán)境服務(wù)器。問(wèn)題是當(dāng)多個(gè)用戶同時(shí)嘗試部署時(shí),服務(wù)器就會(huì)宕機(jī),因此開(kāi)發(fā)人員在部署時(shí)就得互相通知,這一點(diǎn)相當(dāng)痛苦。此外,還存在代碼測(cè)試覆蓋率低、手動(dòng)部署過(guò)程繁瑣以及無(wú)法根據(jù)定義的任務(wù)或用戶需求跟蹤代碼部署的問(wèn)題。
我意識(shí)到必須做些事情,同時(shí)也找到了一個(gè)有同樣感受的同事。我們決定合作去構(gòu)建一個(gè)初始的 DevOps 流水線 —— 他設(shè)置了一個(gè)虛擬機(jī)和一個(gè) Tomcat 服務(wù)器,而我則架設(shè)了 Jenkins,集成了 Atlassian Jira、BitBucket 和代碼覆蓋率測(cè)試。這個(gè)業(yè)余項(xiàng)目非常成功:我們近乎全自動(dòng)化了開(kāi)發(fā)流水線,并在開(kāi)發(fā)服務(wù)器上實(shí)現(xiàn)了幾乎 100% 的正常運(yùn)行,我們可以追蹤并改進(jìn)代碼覆蓋率測(cè)試,并且 Git 分支能夠與部署任務(wù)和 jira 任務(wù)關(guān)聯(lián)在一起。此外,大多數(shù)用來(lái)構(gòu)建 DevOps 所使用的工具都是開(kāi)源的。
現(xiàn)在我意識(shí)到了我們的 DevOps 流水線是多么的原始,因?yàn)槲覀儧](méi)有利用像 Jenkins 文件或 Ansible 這樣的高級(jí)設(shè)置。然而,這個(gè)簡(jiǎn)單的過(guò)程運(yùn)作良好,這也許是因?yàn)?Pareto 原則(也被稱作 80/20 法則)。
DevOps 和 CI/CD 流水線的簡(jiǎn)要介紹
如果你問(wèn)一些人,“什么是 DevOps?”,你或許會(huì)得到一些不同的回答。DevOps,就像敏捷,已經(jīng)發(fā)展到涵蓋著諸多不同的學(xué)科,但大多數(shù)人至少會(huì)同意這些:DevOps 是一個(gè)軟件開(kāi)發(fā)實(shí)踐或一個(gè)軟件開(kāi)發(fā)生命周期(SDLC),并且它的核心原則是一種文化上的變革 —— 開(kāi)發(fā)人員與非開(kāi)發(fā)人員呼吸著同一片天空的氣息,之前手工的事情變得自動(dòng)化;每個(gè)人做著自己擅長(zhǎng)的事;同一時(shí)間的部署變得更加頻繁;吞吐量提升;靈活度增加。
雖然擁有正確的軟件工具并非實(shí)現(xiàn) DevOps 環(huán)境所需的唯一東西,但一些工具卻是必要的。最關(guān)鍵的一個(gè)便是持續(xù)集成和持續(xù)部署(CI/CD)。在流水線環(huán)境中,擁有不同的構(gòu)建階段(例如:DEV、INT、TST、QA、UAT、STG、PROD),手動(dòng)的工作能實(shí)現(xiàn)自動(dòng)化,開(kāi)發(fā)人員可以實(shí)現(xiàn)高質(zhì)量的代碼,靈活而且大量部署。
這篇文章描述了一個(gè)構(gòu)建 DevOps 流水線的五步方法,就像下圖所展示的那樣,使用開(kāi)源的工具實(shí)現(xiàn)。
Complete DevOps pipeline
閑話少說(shuō),讓我們開(kāi)始吧。
第一步:CI/CD 框架
首先你需要的是一個(gè) CI/CD 工具,Jenkins,是一個(gè)基于 Java 的 MIT 許可下的開(kāi)源 CI/CD 工具,它是推廣 DevOps 運(yùn)動(dòng)的工具,并已成為了事實(shí)標(biāo)準(zhǔn)。
所以,什么是 Jenkins?想象它是一種神奇的萬(wàn)能遙控,能夠和許多不同的服務(wù)器和工具打交道,并且能夠?qū)⑺鼈兘y(tǒng)一安排起來(lái)。就本身而言,像 Jenkins 這樣的 CI/CD 工具本身是沒(méi)有用的,但隨著接入不同的工具與服務(wù)器時(shí)會(huì)變得非常強(qiáng)大。
Jenkins 僅是眾多構(gòu)建 DevOps 流水線的開(kāi)源 CI/CD 工具之一。
名稱 | 許可證 |
---|---|
Jenkins | Creative Commons 和 MIT |
Travis CI | MIT |
CruiseControl | BSD |
Buildbot | GPL |
Apache Gump | Apache 2.0 |
Cabie | GNU |
下面就是使用 CI/CD 工具時(shí) DevOps 看起來(lái)的樣子。
CI/CD tool
你的 CI/CD 工具在本地主機(jī)上運(yùn)行,但目前你還不能夠做些別的。讓我們緊隨 DevOps 之旅的腳步。
第二步:源代碼控制管理
驗(yàn)證 CI/CD 工具可以執(zhí)行某些魔術(shù)的最佳(也可能是最簡(jiǎn)單)方法是與源代碼控制管理(SCM)工具集成。為什么需要源代碼控制?假設(shè)你在開(kāi)發(fā)一個(gè)應(yīng)用。無(wú)論你什么時(shí)候構(gòu)建應(yīng)用,無(wú)論你使用的是 Java、Python、C++、Go、Ruby、JavaScript 或任意一種語(yǔ)言,你都在編程。你所編寫(xiě)的程序代碼稱為源代碼。在一開(kāi)始,特別是只有你一個(gè)人工作時(shí),將所有的東西放進(jìn)本地文件夾里或許都是可以的。但是當(dāng)項(xiàng)目變得龐大并且邀請(qǐng)其他人協(xié)作后,你就需要一種方式來(lái)避免共享代碼修改時(shí)的合并沖突。你也需要一種方式來(lái)恢復(fù)一個(gè)之前的版本——備份、復(fù)制并粘貼的方式已經(jīng)過(guò)時(shí)了。你(和你的團(tuán)隊(duì))想要更好的解決方式。
這就是 SCM 變得不可或缺的原因。SCM 工具通過(guò)在倉(cāng)庫(kù)中保存代碼來(lái)幫助進(jìn)行版本控制與多人協(xié)作。
盡管這里有許多 SCM 工具,但 Git 是最標(biāo)準(zhǔn)恰當(dāng)?shù)摹N覙O力推薦使用 Git,但如果你喜歡這里仍有其他的開(kāi)源工具。
名稱 | 許可證 |
---|---|
Git | GPLv2 & LGPL v2.1 |
Subversion | Apache 2.0 |
Concurrent Versions System (CVS) | GNU |
Vesta | LGPL |
Mercurial | GNU GPL v2+ |
擁有 SCM 之后,DevOps 流水線看起來(lái)就像這樣。
Source control management
CI/CD 工具能夠自動(dòng)化進(jìn)行源代碼檢入檢出以及完成成員之間的協(xié)作。還不錯(cuò)吧?但是,如何才能把它變成可工作的應(yīng)用程序,使得數(shù)十億人來(lái)使用并欣賞它呢?
第三步:自動(dòng)化構(gòu)建工具
真棒!現(xiàn)在你可以檢出代碼并將修改提交到源代碼控制,并且可以邀請(qǐng)你的朋友就源代碼控制進(jìn)行協(xié)作。但是到目前為止你還沒(méi)有構(gòu)建出應(yīng)用。要想讓它成為一個(gè)網(wǎng)頁(yè)應(yīng)用,必須將其編譯并打包成可部署的包或可執(zhí)行程序(注意,像 JavaScript 或 PHP 這樣的解釋型編程語(yǔ)言不需要進(jìn)行編譯)。
于是就引出了自動(dòng)化構(gòu)建工具。無(wú)論你決定使用哪一款構(gòu)建工具,它們都有一個(gè)共同的目標(biāo):將源代碼構(gòu)建成某種想要的格式,并且將清理、編譯、測(cè)試、部署到某個(gè)位置這些任務(wù)自動(dòng)化。構(gòu)建工具會(huì)根據(jù)你的編程語(yǔ)言而有不同,但這里有一些通常使用的開(kāi)源工具值得考慮。
名稱 | 許可證 | 編程語(yǔ)言 |
---|---|---|
Maven | Apache 2.0 | Java |
Ant | Apache 2.0 | Java |
Gradle | Apache 2.0 | Java |
Bazel | Apache 2.0 | Java |
Make | GNU | N/A |
Grunt | MIT | JavaScript |
Gulp | MIT | JavaScript |
Buildr | Apache | Ruby |
Rake | MIT | Ruby |
A-A-P | GNU | Python |
SCons | MIT | Python |
BitBake | GPLv2 | Python |
Cake | MIT | C# |
ASDF | Expat (MIT) | LISP |
Cabal | BSD | Haskell |
太棒了!現(xiàn)在你可以將自動(dòng)化構(gòu)建工具的配置文件放進(jìn)源代碼控制管理系統(tǒng)中,并讓你的 CI/CD 工具構(gòu)建它。
Build automation tool
一切都如此美好,對(duì)吧?但是在哪里部署它呢?
第四步:網(wǎng)頁(yè)應(yīng)用服務(wù)器
到目前為止,你有了一個(gè)可執(zhí)行或可部署的打包文件。對(duì)任何真正有用的應(yīng)用程序來(lái)說(shuō),它必須提供某種服務(wù)或者接口,所以你需要一個(gè)容器來(lái)發(fā)布你的應(yīng)用。
對(duì)于網(wǎng)頁(yè)應(yīng)用,網(wǎng)頁(yè)應(yīng)用服務(wù)器就是容器。應(yīng)用程序服務(wù)器提供了環(huán)境,讓可部署包中的編程邏輯能夠被檢測(cè)到、呈現(xiàn)界面,并通過(guò)打開(kāi)套接字為外部世界提供網(wǎng)頁(yè)服務(wù)。在其他環(huán)境下你也需要一個(gè) HTTP 服務(wù)器(比如虛擬機(jī))來(lái)安裝服務(wù)應(yīng)用。現(xiàn)在,我假設(shè)你將會(huì)自己學(xué)習(xí)這些東西(盡管我會(huì)在下面討論容器)。
這里有許多開(kāi)源的網(wǎng)頁(yè)應(yīng)用服務(wù)器。
名稱 | 協(xié)議 | 編程語(yǔ)言 |
---|---|---|
Tomcat | Apache 2.0 | Java |
Jetty | Apache 2.0 | Java |
WildFly | GNU Lesser Public | Java |
GlassFish | CDDL & GNU Less Public | Java |
Django | 3-Clause BSD | Python |
Tornado | Apache 2.0 | Python |
Gunicorn | MIT | Python |
Python Paste | MIT | Python |
Rails | MIT | Ruby |
Node.js | MIT | Javascript |
現(xiàn)在 DevOps 流水線差不多能用了,干得好!
Web application server
盡管你可以在這里停下來(lái)并進(jìn)行進(jìn)一步的集成,但是代碼質(zhì)量對(duì)于應(yīng)用開(kāi)發(fā)者來(lái)說(shuō)是一件非常重要的事情。
第五步:代碼覆蓋測(cè)試
實(shí)現(xiàn)代碼測(cè)試件可能是另一個(gè)麻煩的需求,但是開(kāi)發(fā)者需要盡早地捕捉程序中的所有錯(cuò)誤并提升代碼質(zhì)量來(lái)保證最終用戶滿意度。幸運(yùn)的是,這里有許多開(kāi)源工具來(lái)測(cè)試你的代碼并提出改善質(zhì)量的建議。甚至更好的,大部分 CI/CD 工具能夠集成這些工具并將測(cè)試過(guò)程自動(dòng)化進(jìn)行。
代碼測(cè)試分為兩個(gè)部分:“代碼測(cè)試框架”幫助進(jìn)行編寫(xiě)與運(yùn)行測(cè)試,“代碼質(zhì)量改進(jìn)工具”幫助提升代碼的質(zhì)量。
代碼測(cè)試框架
名稱 | 許可證 | 編程語(yǔ)言 |
---|---|---|
JUnit | Eclipse Public License | Java |
EasyMock | Apache | Java |
Mockito | MIT | Java |
PowerMock | Apache 2.0 | Java |
Pytest | MIT | Python |
Hypothesis | Mozilla | Python |
Tox | MIT | Python |
代碼質(zhì)量改進(jìn)工具
名稱 | 許可證 | 編程語(yǔ)言 |
---|---|---|
Cobertura | GNU | Java |
CodeCover | Eclipse Public (EPL) | Java |
Coverage.py | Apache 2.0 | Python |
Emma | Common Public License | Java |
JaCoCo | Eclipse Public License | Java |
Hypothesis | Mozilla | Python |
Tox | MIT | Python |
Jasmine | MIT | JavaScript |
Karma | MIT | JavaScript |
Mocha | MIT | JavaScript |
Jest | MIT | JavaScript |
注意,之前提到的大多數(shù)工具和框架都是為 Java、Python、JavaScript 寫(xiě)的,因?yàn)?C++ 和 C# 是專有編程語(yǔ)言(盡管 GCC 是開(kāi)源的)。
現(xiàn)在你已經(jīng)運(yùn)用了代碼覆蓋測(cè)試工具,你的 DevOps 流水線應(yīng)該就像教程開(kāi)始那幅圖中展示的那樣了。
可選步驟
容器
正如我之前所說(shuō),你可以在虛擬機(jī)(VM)或服務(wù)器上發(fā)布你的應(yīng)用,但是容器是一個(gè)更好的解決方法。
什么是容器?簡(jiǎn)要的介紹就是 VM 需要占用操作系統(tǒng)大量的資源,它提升了應(yīng)用程序的大小,而容器僅僅需要一些庫(kù)和配置來(lái)運(yùn)行應(yīng)用程序。顯然,VM 仍有重要的用途,但容器對(duì)于發(fā)布應(yīng)用(包括應(yīng)用程序服務(wù)器)來(lái)說(shuō)是一個(gè)更為輕量的解決方式。
盡管對(duì)于容器來(lái)說(shuō)也有其他的選擇,但是 Docker 和 Kubernetes 更為廣泛。
名稱 | 許可證 |
---|---|
Docker | Apache 2.0 |
Kubernetes | Apache 2.0 |
了解更多信息,請(qǐng)查看 Opensource.com 上關(guān)于 Docker 和 Kubernetes 的其它文章:
中間件自動(dòng)化工具
我們的 DevOps 流水線大部分集中在協(xié)作構(gòu)建與部署應(yīng)用上,但你也可以用 DevOps 工具完成許多其他的事情。其中之一便是利用它實(shí)現(xiàn)基礎(chǔ)設(shè)施管理(IaC)工具,這也是熟知的中間件自動(dòng)化工具。這些工具幫助完成中間件的自動(dòng)化安裝、管理和其他任務(wù)。例如,自動(dòng)化工具可以用正確的配置下拉應(yīng)用程序,例如網(wǎng)頁(yè)服務(wù)器、數(shù)據(jù)庫(kù)和監(jiān)控工具,并且部署它們到應(yīng)用服務(wù)器上。
這里有幾個(gè)開(kāi)源的中間件自動(dòng)化工具值得考慮:
名稱 | 許可證 |
---|---|
Ansible | GNU Public |
SaltStack | Apache 2.0 |
Chef | Apache 2.0 |
Puppet | Apache or GPL |
獲取更多中間件自動(dòng)化工具,查看 Opensource.com 上的其它文章:
之后的發(fā)展
這只是一個(gè)完整 DevOps 流水線的冰山一角。從 CI/CD 工具開(kāi)始并且探索其他可以自動(dòng)化的東西來(lái)使你的團(tuán)隊(duì)更加輕松的工作。并且,尋找開(kāi)源通訊工具可以幫助你的團(tuán)隊(duì)一起工作的更好。