面向系統(tǒng)管理員的7個(gè)CI/CD工具
譯文【51CTO.com快譯】持續(xù)集成、持續(xù)交付和持續(xù)部署(CI/CD)在開(kāi)發(fā)者社區(qū)已存在了多年。一些企業(yè)設(shè)有運(yùn)維部門(mén),但許多企業(yè)沒(méi)有。對(duì)于大多數(shù)企業(yè)而言,它們的運(yùn)維團(tuán)隊(duì)要像開(kāi)發(fā)團(tuán)隊(duì)那樣熟悉CI/CD工具和實(shí)踐。
CI/CD實(shí)踐同樣適用于基礎(chǔ)架構(gòu)和第三方應(yīng)用程序以及內(nèi)部開(kāi)發(fā)的應(yīng)用程序。此外,有許多不同的工具,但都使用類(lèi)似的模式??赡茏钪匾氖?,引導(dǎo)貴公司采用這種新的實(shí)踐將使你在公司內(nèi)有很高的威信,你會(huì)成為別人跟隨的領(lǐng)路人。
多年來(lái),一些組織一直對(duì)基礎(chǔ)架構(gòu)采用CI/CD實(shí)踐,使用Ansible、Chef或Puppet等工具。Test Kitchen等其他工具可以在最終托管應(yīng)用程序的基礎(chǔ)架構(gòu)上執(zhí)行測(cè)試。事實(shí)上,那些測(cè)試甚至可以將應(yīng)用程序部署到類(lèi)似生產(chǎn)環(huán)境的環(huán)境中,針對(duì)更高級(jí)配置的生產(chǎn)負(fù)載執(zhí)行應(yīng)用程序級(jí)測(cè)試。然而,僅僅能夠測(cè)試基礎(chǔ)架構(gòu)就很了不起。
與一些原始的配置管理工具相比,Terraform還可以使用Test Kitchen測(cè)試更短暫更冪等的基礎(chǔ)架構(gòu)配置。加上Linux容器和Kubernetes,你現(xiàn)在可以使用類(lèi)似生產(chǎn)環(huán)境的規(guī)范和資源來(lái)測(cè)試完整的基礎(chǔ)架構(gòu)和應(yīng)用程序部署,這些規(guī)范和資源在數(shù)小時(shí)內(nèi)而不是數(shù)月或數(shù)年內(nèi)創(chuàng)建和停用。一切資源在再次部署和測(cè)試之前清除干凈。
然而,你還可以專(zhuān)注于對(duì)網(wǎng)絡(luò)配置或數(shù)據(jù)庫(kù)數(shù)據(jù)定義語(yǔ)言(DDL)文件進(jìn)行版本控制,開(kāi)始在其上面運(yùn)行小型CI/CD管道。也許它只是檢查語(yǔ)法、語(yǔ)義或一些***實(shí)踐。實(shí)際上,大多數(shù)開(kāi)發(fā)管道開(kāi)始就是這樣。一旦你搭好了腳手架,就更容易在上面構(gòu)建。一旦做好準(zhǔn)備,你將開(kāi)始為管道尋找各種用例(use case)。
比如說(shuō),我經(jīng)常在公司內(nèi)部編寫(xiě)業(yè)務(wù)通訊,使用MJML在版本控制中維護(hù)。我需要能托管一個(gè)Web版本,有些人喜歡能夠獲得PDF,于是我構(gòu)建了一條管道?,F(xiàn)在當(dāng)我創(chuàng)建新的業(yè)務(wù)通訊時(shí),將它提交、進(jìn)行GitLab中的合并請(qǐng)求。這自動(dòng)創(chuàng)建一個(gè)index.html,附有指向業(yè)務(wù)通訊HTML版和PDF版的鏈接。HTML和PDF文件也在管道中創(chuàng)建。除非有人來(lái)查看這些內(nèi)容,否則這些都不發(fā)布。然后,GitLab Pages發(fā)布該網(wǎng)站,我可以下載HTML作為業(yè)務(wù)通訊來(lái)發(fā)送。將來(lái),我會(huì)在合并請(qǐng)求合并時(shí)或特殊的審批步驟后自動(dòng)發(fā)送業(yè)務(wù)通訊。這看起來(lái)很簡(jiǎn)單,但為我節(jié)省了很多時(shí)間。這正是這些工具的精髓:它們可以為你節(jié)省時(shí)間。
關(guān)鍵是創(chuàng)建抽象工作的工具,以便它們幾乎沒(méi)有變化即可應(yīng)用于多個(gè)問(wèn)題。我還應(yīng)該指出,我創(chuàng)建的東西幾乎不需要編寫(xiě)代碼,只需要幾個(gè)簡(jiǎn)單的HTML模板、循環(huán)處理HTML文件的某個(gè)節(jié)點(diǎn),以及往索引頁(yè)面填充所有HTML頁(yè)面和PDF的另一個(gè)節(jié)點(diǎn)。
其中一些可能看起來(lái)有點(diǎn)復(fù)雜,但大部分來(lái)自我所使用的不同工具的教程。而許多開(kāi)發(fā)人員樂(lè)意在這些類(lèi)型的工作上與你合作,因?yàn)樗麄兛赡茉谕瓿珊笠灿X(jué)得很有用。本文所附的鏈接指向我們計(jì)劃為DevOps KC開(kāi)辦的業(yè)務(wù)通訊,創(chuàng)建網(wǎng)站的所有代碼都來(lái)自我在搞內(nèi)部業(yè)務(wù)通訊時(shí)所做的工作。
下面介紹的許多工具都能提供這種類(lèi)型的交互,但一些提供的模式略有不同。這個(gè)領(lǐng)域的新興模式是用YAML之類(lèi)的標(biāo)記性語(yǔ)言對(duì)管道進(jìn)行聲明性描述,每個(gè)階段是短暫冪等的。許多這些系統(tǒng)還通過(guò)在管道的不同階段創(chuàng)建有向無(wú)環(huán)圖(DAG)來(lái)確保正確的順序。
這些階段通常在Linux容器中運(yùn)行,可以在容器中執(zhí)行任何操作。某些工具(如Spinnaker)僅關(guān)注部署組件,提供了其他工具通常不包含的運(yùn)維功能。Jenkins通常以XML格式來(lái)保存管道,大多數(shù)交互在GUI中進(jìn)行,但最近的實(shí)現(xiàn)使用了采用Groovy的特定領(lǐng)域語(yǔ)言(DSL)。此外,Jenkins作業(yè)通常在已安裝特殊Java代理的節(jié)點(diǎn)上執(zhí)行,由多個(gè)插件和預(yù)安裝組件組成。
Jenkins在其工具中引入了管道,但用起來(lái)有點(diǎn)困難,有幾個(gè)地方要注意。最近,Jenkins的開(kāi)發(fā)者決定將社區(qū)引向幾個(gè)不同的計(jì)劃,這些計(jì)劃有望為這個(gè)項(xiàng)目注入新活力,從而真正將CI/CD帶給大眾。我認(rèn)為最值得關(guān)注的計(jì)劃是創(chuàng)建可以將Kubernetes集群變成Jenkins CI/CD平臺(tái)的云原生Jenkins。
你進(jìn)一步了解了這些工具并開(kāi)始將這些實(shí)踐帶入貴公司或運(yùn)維部門(mén)后,很快會(huì)有人亦步亦趨。你將提高自己和其他人的生產(chǎn)力。不妨更深入一點(diǎn)介紹這些工具。我們將簡(jiǎn)要介紹每款工具,并附有提供更多信息的鏈接。
1.GitLab CI
項(xiàng)目頁(yè)面:https://about.gitlab.com/product/continuous-integration/
源代碼:https://gitlab.com/gitlab-org/gitlab-ce/
許可證:MIT
GitLab是CI/CD領(lǐng)域的新成員,但它已經(jīng)成為弗雷斯特研究公司持續(xù)集成工具Wave報(bào)告的佼佼者,這在競(jìng)爭(zhēng)如此激烈的領(lǐng)域?qū)崒俨灰?。什么讓GitLab CI如此出色?它使用YAML文件來(lái)描述整條管道。它還有一項(xiàng)名為Auto DevOps的功能,讓較簡(jiǎn)單的項(xiàng)目可以自動(dòng)構(gòu)建管道,并有內(nèi)置的多個(gè)測(cè)試。
該系統(tǒng)使用Herokuish構(gòu)建包(https://github.com/gliderlabs/herokuish)來(lái)確定語(yǔ)言及如何構(gòu)建應(yīng)用程序。一些語(yǔ)言也可以管理數(shù)據(jù)庫(kù),這是一項(xiàng)真正關(guān)鍵的功能,用于構(gòu)建新應(yīng)用程序,并從開(kāi)發(fā)過(guò)程一開(kāi)始將它們部署到生產(chǎn)環(huán)境中。該系統(tǒng)與Kubernetes直接集成,并使用多種不同的部署方法之一自動(dòng)將應(yīng)用程序部署到Kubernetes集群中,比如基于百分比的部署和藍(lán)綠部署。
除了CI功能外,GitLab還提供許多補(bǔ)充功能,比如運(yùn)維和監(jiān)控,Prometheus會(huì)與你的應(yīng)用程序一起自動(dòng)部署;使用GitLab Issues、Epics和Milestones,實(shí)現(xiàn)項(xiàng)目組合和項(xiàng)目管理;安全檢查內(nèi)置于管道中,結(jié)果作為多個(gè)項(xiàng)目的合并值來(lái)提供;以及能夠使用WebIDE直接在GitLab中編輯代碼,甚至可以提供管道的預(yù)覽或執(zhí)行部分以獲得更快的反饋。
2.GoCD
項(xiàng)目頁(yè)面:https://www.gocd.org/
源代碼:https://github.com/gocd/gocd
許可證:Apache 2.0
GoCD來(lái)自Thoughtworks的奇思妙想,這足以證明其功能和效率。對(duì)我而言,GoCD與其他工具的區(qū)別主要在于其價(jià)值流圖(VSM,https://www.gocd.org/getting-started/part-3/#value_stream_map)功能。實(shí)際上,管道可以串聯(lián)起來(lái),一條管道為下一條管道提供“素材”。這使得部署過(guò)程中擁有不同職責(zé)的不同團(tuán)隊(duì)加強(qiáng)了獨(dú)立性。將這種系統(tǒng)引入到打算讓這些團(tuán)隊(duì)保持獨(dú)立的舊企業(yè)時(shí),這項(xiàng)功能可能很有用――但讓每個(gè)人使用同樣的工具便于以后找到VSM中的瓶頸,并重新組織團(tuán)隊(duì)或努力提高效率。
讓公司的每個(gè)產(chǎn)品都有VSM大有助益;GoCD允許在版本控制中以JSON或YAML來(lái)描述,并直觀地顯示所有數(shù)據(jù),這使得該工具對(duì)于試圖更好地了解自身的企業(yè)來(lái)說(shuō)更有價(jià)值。先安裝GoCD,僅使用手動(dòng)批準(zhǔn)關(guān)卡來(lái)描繪你的流程。然后讓每個(gè)團(tuán)隊(duì)使用手動(dòng)批準(zhǔn),以便你可以開(kāi)始收集哪里存在瓶頸方面的數(shù)據(jù)。
3.Travis CI
項(xiàng)目頁(yè)面:https://docs.travis-ci.com/
源代碼:https://github.com/travis-ci/travis-ci
許可證:MIT
Travis CI是我***次使用的軟件即服務(wù)(SaaS)CI系統(tǒng),它很棒。管道與源代碼一起存儲(chǔ)成YAML,并與GitHub等工具無(wú)縫集成。我不記得上次管道因Travis CI或集成而失效是什么時(shí)候了,Travis CI的正常運(yùn)行時(shí)間很長(zhǎng)。它不僅可以用作SaaS,還有可以托管的版本。我沒(méi)有運(yùn)行那個(gè)版本――有很多組件,安裝全部組件看起來(lái)有點(diǎn)困難。我猜想使用Travis CI提供的Helm圖表統(tǒng)統(tǒng)部署到Kubernetes會(huì)容易得多。那些圖表尚未部署所有內(nèi)容,但我確信將來(lái)會(huì)變得更完善。如果你不想應(yīng)對(duì)麻煩,還可以使用企業(yè)版。
然而,如果你在開(kāi)發(fā)開(kāi)源代碼,可以免費(fèi)使用Travis CI的SaaS版。這是出色團(tuán)隊(duì)提供的出色服務(wù)!這減輕了大量開(kāi)銷(xiāo),讓你可以使用很常見(jiàn)的平臺(tái)來(lái)開(kāi)發(fā)開(kāi)源代碼,沒(méi)必要運(yùn)行任何東西。
4.Jenkins
項(xiàng)目頁(yè)面:https://jenkins.io/
源代碼:https://github.com/jenkinsci/jenkins
許可證:MIT
Jenkins是CI/CD界最正宗、最值得尊敬的事實(shí)上的標(biāo)準(zhǔn)。建議你讀一下Jenkin的開(kāi)發(fā)者兼CloudBees***技術(shù)官Kohsuke撰寫(xiě)的《Jenkins:Shifting Gears》(https://jenkins.io/blog/2018/08/31/shifting-gears/)。它總結(jié)了過(guò)去十年我對(duì)Jenkins及社區(qū)的種種感受。他描述了多年來(lái)需要的創(chuàng)新,我很高興CloudBees在這場(chǎng)轉(zhuǎn)型中身先士卒。Jenkins對(duì)大多數(shù)非開(kāi)發(fā)人員來(lái)說(shuō)難度有點(diǎn)大,向來(lái)是管理員的一種負(fù)擔(dān)。然而,這些方面是他們旨在解決的。
Jenkins配置即代碼(JCasC)應(yīng)該有助于解決困擾管理員多年的復(fù)雜配置問(wèn)題。這便于通過(guò)YAML文件對(duì)Jenkins主機(jī)進(jìn)行零接觸配置,類(lèi)似其他CI/CD系統(tǒng)。Jenkins Evergreen旨在基于不同的用例提供預(yù)定義的Jenkins配置,從而使這個(gè)過(guò)程來(lái)得更容易。與普通的Jenkins發(fā)行版相比,這些發(fā)行版應(yīng)該更易于維護(hù)和升級(jí)。
Jenkins 2引入了原生管道功能,有兩種類(lèi)型的管道。你做一些簡(jiǎn)單的事情時(shí),兩種管道用起來(lái)都不如YAML那么容易,但它們對(duì)于完成更復(fù)雜的任務(wù)相當(dāng)好。
Jenkins X堪稱(chēng)Jenkins的全面轉(zhuǎn)型,很可能是云原生Jenkins的實(shí)現(xiàn)(或至少是大多數(shù)用戶(hù)使用云原生Jenkins時(shí)看到的東西)。它將拿來(lái)JCasC和Evergreen,直接在Kubernetes上使用、用其所長(zhǎng)。對(duì)Jenkins來(lái)說(shuō),眼下是激動(dòng)人心的時(shí)刻,我期待著它繼續(xù)創(chuàng)新、不斷領(lǐng)導(dǎo)這個(gè)領(lǐng)域。
5.Concourse CI
項(xiàng)目頁(yè)面:https://concourse-ci.org/
源代碼:https://github.com/concourse/concourse
許可證:Apache 2.0
我通過(guò)Pivotal Labs的人員***接觸了Concourse,那時(shí)它還是早期測(cè)試版,當(dāng)時(shí)沒(méi)有很多同類(lèi)的工具。該系統(tǒng)由微服務(wù)組成,每個(gè)作業(yè)都在容器內(nèi)運(yùn)行。它最有用的其他工具所沒(méi)有的功能之一是,能夠從本地系統(tǒng)運(yùn)行作業(yè)。這意味著你可以在本地開(kāi)發(fā)(假設(shè)你連接到Concourse服務(wù)器)并運(yùn)行你構(gòu)建的代碼,就像在真實(shí)的構(gòu)建管道中運(yùn)行一樣。此外,你可以從本地系統(tǒng)重新運(yùn)行失效的構(gòu)建版本,并注入特定的更改來(lái)測(cè)試修復(fù)程序。
Concourse還有一個(gè)簡(jiǎn)單的擴(kuò)展系統(tǒng),依賴(lài)資源的基本概念。大致上來(lái)說(shuō),你希望提供給管道的每項(xiàng)新功能都可以在Docker鏡像中實(shí)現(xiàn),并作為新的資源類(lèi)型包含在配置中。這使得所有功能都封裝在一個(gè)可以獨(dú)立升級(jí)和修改的單個(gè)不可變工件中,破壞性變更未必同時(shí) 破壞所有構(gòu)建版本。
6.Spinnaker
項(xiàng)目頁(yè)面:https://www.spinnaker.io/
源代碼:https://github.com/spinnaker/spinnaker
許可證:Apache 2.0
Spinnaker來(lái)自Netflix,關(guān)注持續(xù)部署多過(guò)關(guān)注持續(xù)集成。它可以與其他工具集成,包括Travis和Jenkins,以啟動(dòng)測(cè)試和部署管道。它還與Prometheus和Datadog等監(jiān)控工具集成,基于這些系統(tǒng)提供的度量指標(biāo)做出部署方面的決策。比如說(shuō),金絲雀部署使用judge概念和收集的度量指標(biāo)來(lái)確定***的金絲雀部署是否導(dǎo)致相關(guān)度量指標(biāo)出現(xiàn)任何降級(jí)、應(yīng)該回滾,或確定部署是否可以繼續(xù)。
與部署有關(guān)的幾項(xiàng)額外的獨(dú)特功能涵蓋了討論持續(xù)部署時(shí)常常被忽視的一個(gè)方面,這個(gè)方面看似對(duì)立,但對(duì)成功而言至關(guān)重要:Spinnaker有助于使持續(xù)部署不那么持續(xù)。它將阻止一個(gè)階段在某些時(shí)間運(yùn)行,防止部署在應(yīng)用程序生命周期的關(guān)鍵時(shí)間內(nèi)出現(xiàn)。它還可以執(zhí)行手動(dòng)審批,確保公司業(yè)務(wù)從變更獲得***的好處后才發(fā)布。實(shí)際上,持續(xù)集成和持續(xù)部署的全部意義在于,業(yè)務(wù)需求一有變化,準(zhǔn)備好盡快部署變更。
7.Screwdriver
項(xiàng)目頁(yè)面:http://screwdriver.cd/
源代碼:https://github.com/screwdriver-cd/screwdriver
許可證:BSD
Screwdriver是一款異常簡(jiǎn)單的工具。它使用微服務(wù)方法,依賴(lài)Nomad、Kubernetes和Docker等工具充當(dāng)其執(zhí)行引擎。有一篇很好的部署教程(https://docs.screwdriver.cd/cluster-management/kubernetes)介紹如何部署到AWS和Kubernetes,但是一旦開(kāi)發(fā)中的Helm圖表(https://github.com/screwdriver-cd/screwdriver-chart)完成,Screwdriver有望得到改進(jìn)。
Screwdriver還使用YAML來(lái)描述管理,包含許多合理的默認(rèn)值,因此每個(gè)管道的樣板配置較少。配置描述了作業(yè)之間可能有復(fù)雜依賴(lài)項(xiàng)的高級(jí)工作流。比如說(shuō),可以保證作業(yè)在另一個(gè)作業(yè)之后或之前運(yùn)行。作業(yè)可以并行運(yùn)行,然后結(jié)合。比如說(shuō),如果任何依賴(lài)項(xiàng)成功或只有所有依賴(lài)項(xiàng)成功,你還可以使用邏輯運(yùn)算符來(lái)運(yùn)行作業(yè)。更棒的是,你可以指定從合并請(qǐng)求觸發(fā)的某些作業(yè)。此外,發(fā)生這種情況時(shí),依賴(lài)作業(yè)不會(huì)運(yùn)行,這樣工件進(jìn)入到生產(chǎn)環(huán)境、仍需要進(jìn)行審查時(shí)可以輕松隔離管道。
本文簡(jiǎn)要描述了這些CI/CD工具,每個(gè)工具有更酷的功能和差異化優(yōu)勢(shì),應(yīng)研究一下。它們都是開(kāi)源的,可以免費(fèi)使用,所以部署一下,看看哪個(gè)***你的要求。
原文標(biāo)題:7 CI/CD tools for sysadmins,作者:Dan Barker
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】