我們應(yīng)該如何基于容器來(lái)進(jìn)行軟件的持續(xù)交付
在過(guò)去的一段時(shí)間里容器已經(jīng)大量的使用到了IT軟件生產(chǎn)的各個(gè)環(huán)節(jié)當(dāng)中:從軟件開(kāi)發(fā),持續(xù)集成,持續(xù)部署,測(cè)試環(huán)境到生產(chǎn)環(huán)境。 除了Docker官方的DockerSwarm,DockerMachine以及DockerCompose以外,開(kāi)源軟件社區(qū)還涌現(xiàn)了一系列的與容器相關(guān)的工具,涵蓋了從容器編排,調(diào)度,監(jiān)控,日志等等各個(gè)方面的需求。 本文將從軟件研發(fā)流程出發(fā)討論如何基于容器解決軟件的持續(xù)交付問(wèn)題,以及團(tuán)隊(duì)協(xié)作問(wèn)題。并為大家展示睿云智合(Wise2C)的持續(xù)交付平臺(tái)是如何基于目前最先進(jìn)的軟件開(kāi)發(fā)流程思想設(shè)計(jì)出來(lái)的。 在持續(xù)集成中使用容器 構(gòu)建環(huán)境統(tǒng)一管理 在傳統(tǒng)模式下使用持續(xù)集成工具諸如Jenkins,在部署企業(yè)持續(xù)持續(xù)集成平臺(tái)的第一個(gè)問(wèn)題就是多樣化的構(gòu)建構(gòu)建環(huán)境需求,而通常的做法是將構(gòu)建Agent(服務(wù)器或者虛擬機(jī))分配給團(tuán)隊(duì)由團(tuán)隊(duì)自己管理構(gòu)建服務(wù)器的環(huán)境配置信息,安裝相應(yīng)的構(gòu)建依賴(lài)等。 在持續(xù)集成中使用docker dockerrun--rm-v`pwd`:/workspace-v/tmp/.m2/repository:/root/.m2/repository--workdir/workspace?maven:3-jdk-8/bin/sh-c'mvncleanpackage' 如上所示,我們可以非常方便的通過(guò)容器來(lái)完成軟件包的構(gòu)建,其中有幾個(gè)點(diǎn)需要注意的是: ?--rm命令可以確保當(dāng)命令執(zhí)行完成后能夠自動(dòng)清理構(gòu)建時(shí)產(chǎn)生的容器,我想你應(yīng)該不太希望需要不定期清理構(gòu)建服務(wù)器磁盤(pán)的問(wèn)題吧。 ??-v除了將當(dāng)前源碼掛載到容器當(dāng)中以外,我們還可以通過(guò)掛載磁盤(pán)來(lái)緩存一些構(gòu)建所需的依賴(lài),比如maven下載的jar包,從而提高編譯效率。 ??--workerdir用以指定構(gòu)建命令執(zhí)行的工作路徑,當(dāng)然需要和workspace保持一致。 如上,基于容器我們可以快速搭建適應(yīng)多種構(gòu)建需求的CI構(gòu)建環(huán)境,所有需要的一起就是你的構(gòu)建服務(wù)器上需要的只有Docker。 在持續(xù)集成中使用docker-compose 在某些情況下,在構(gòu)建或者集成測(cè)試階段我們可能需要使用到一些真正的第三方依賴(lài),比如數(shù)據(jù)庫(kù)或者緩存服務(wù)器。在傳統(tǒng)的持續(xù)集成實(shí)踐中,通常要么你直接使用已經(jīng)部署的數(shù)據(jù)庫(kù)(記得清理測(cè)試數(shù)據(jù),并發(fā)如何保證),直接使用內(nèi)存數(shù)據(jù)庫(kù)來(lái)代替真實(shí)數(shù)據(jù)庫(kù),要不使用mock或者stub來(lái)進(jìn)行測(cè)試。 當(dāng)然在理想情況下我們還是希望能夠使用與真實(shí)環(huán)境一直的真正的數(shù)據(jù)庫(kù)或者其他中間件服務(wù)?;赿ocker-compose我們可以非常方便的實(shí)現(xiàn)對(duì)于復(fù)雜構(gòu)建環(huán)境的需求。 build:?command:sh-c'mvn--help'?image:maven:3-jdk8?links:[mysql]?volumes: -'.:/code' -'/tmp/.m2/repository:/root/.m2/repository'?working_dir:/codemysql:?environment:{MYSQL_DATABASE:test,MYSQL_PASSWORD:test,MYSQL_ROOT_PASSWORD:test,MYSQL_USER:test}?image:mysql:5.5 同樣我們以maven為例,假設(shè)我們需要在構(gòu)建中使用到mysql以支持集成測(cè)試的需求 docker-composerun--rmbuildsh-c'mvncleanpackage'&&docker-composestop&&docker-composerm-f ?--rm確保在構(gòu)建命令執(zhí)行完成后自動(dòng)清理build所產(chǎn)生的容器。 ?-docker-composestop&&docker-composerm-f確保依賴(lài)的其它服務(wù)如mysql能夠正常的退出并且清理所產(chǎn)生的容器。 建立持續(xù)交付解決方案 建立基于共同目標(biāo)的具有跨職能協(xié)同的研發(fā)團(tuán)隊(duì),是DevOps運(yùn)動(dòng)的根本。而自動(dòng)化則是提高效率的基石?;谝陨衔覀兪侨绾位谌萜鹘⑽覀兊某掷m(xù)交付解決方案? 基礎(chǔ)設(shè)施自動(dòng)化 使用Rancher理由很簡(jiǎn)單,Rancher是目前市面上唯一一個(gè)能滿(mǎn)足開(kāi)箱即用的容器管理平臺(tái),同時(shí)能夠支持多種編排引擎,如Rancher自己的Cattle,Google的K8S,以及Docker官方的Swarm作為容器編排引擎。同時(shí)Rancher提供的Catalog應(yīng)用商店能夠幫助研發(fā)團(tuán)隊(duì)自主創(chuàng)建所需要的服務(wù)實(shí)例。 創(chuàng)建持續(xù)交付流水線(xiàn) 建立持續(xù)交付流水線(xiàn)的核心問(wèn)題是如何定義企業(yè)的軟件交付價(jià)值流動(dòng)。 如下圖所示,我們總結(jié)了從開(kāi)發(fā),持續(xù)集成,持續(xù)交付各個(gè)階段所使用的一些典型工具的使用,以及在各個(gè)階段中的相關(guān)團(tuán)隊(duì)的相關(guān)活動(dòng),典型的DevOps相關(guān)的活動(dòng)。 在持續(xù)交付流水線(xiàn)下的團(tuán)隊(duì)協(xié)作 正如上文所說(shuō),創(chuàng)建持續(xù)交付流水線(xiàn)的本質(zhì)就是定義軟件的交付的價(jià)值流動(dòng),反應(yīng)正式的軟件交付流程。價(jià)值的流動(dòng)則涉及到團(tuán)隊(duì)中各個(gè)職能的成員的高度協(xié)同。 開(kāi)發(fā)流水線(xiàn) 開(kāi)發(fā)人員:頻繁提交持續(xù)集成,通過(guò)持續(xù)的編譯,打包,測(cè)試,鏡像構(gòu)建,自動(dòng)化驗(yàn)收測(cè)試等環(huán)節(jié)產(chǎn)生可測(cè)試的候選鏡像列表(如:0.1-dev)。 ?以源碼倉(cāng)庫(kù)為起點(diǎn),開(kāi)發(fā)人員頻繁提交,每一次代碼變更都要立即在流水線(xiàn)中傳遞;睿云智合WiseBuild持續(xù)交付平臺(tái)支持定時(shí)周期觸發(fā),代碼變更檢查以及Webhook等多種觸發(fā)方式。 ?提交測(cè)試階段從技術(shù)角度斷言整個(gè)系統(tǒng)是可運(yùn)行的,該階段會(huì)進(jìn)行編譯,運(yùn)行一套單元測(cè)試,并進(jìn)行代碼質(zhì)量分析,WiseBuild持續(xù)交付平臺(tái)設(shè)計(jì)遵循“BuildInDocker,BuildWithDocker,RunWithDocker"基于容器技術(shù)全面減少對(duì)于異構(gòu)構(gòu)建環(huán)境的支持,并且默認(rèn)提供了當(dāng)前主流的編程語(yǔ)言的編譯,以及測(cè)試支持。同時(shí)用戶(hù)可以根據(jù)需要在持續(xù)交付流水線(xiàn)中集成Sonarqube進(jìn)行代碼的質(zhì)量跟蹤和管理。 ?自動(dòng)化測(cè)試階段,從功能交付斷言整個(gè)系統(tǒng)是能夠滿(mǎn)足客戶(hù)規(guī)范和要求的,WiseBuild持續(xù)交付平臺(tái)支持基于Rancher或者RancherCompose在流水線(xiàn)中自動(dòng)部署鏡像到Rancher平臺(tái),同時(shí)內(nèi)置了Selenium,Robotframework,Cucumber等主流自動(dòng)化測(cè)試工具和框架。 ?手動(dòng)測(cè)試階段,當(dāng)新的代碼提交部署到rancher環(huán)境后,開(kāi)發(fā)人員同時(shí)可以快速的進(jìn)行手動(dòng)測(cè)試,確保新提交的代碼在測(cè)試環(huán)境中是可用的,并且滿(mǎn)足相關(guān)的功能需求。 ?鏡像構(gòu)建,當(dāng)代碼提交通過(guò)了整個(gè)流水線(xiàn)的持續(xù)驗(yàn)證后將會(huì)產(chǎn)生響應(yīng)版本的鏡像文件。 基于流水線(xiàn)中的過(guò)程質(zhì)量和代碼質(zhì)量數(shù)據(jù),團(tuán)隊(duì)可以快速處理典型的代碼質(zhì)量問(wèn)題,避免技術(shù)債務(wù)的產(chǎn)生。 總而言之,開(kāi)發(fā)流水線(xiàn)可以幫助團(tuán)隊(duì)頻繁的進(jìn)行代碼集成并且通過(guò)單元測(cè)試,代碼靜態(tài)分析,自動(dòng)化驗(yàn)收測(cè)試等技術(shù)實(shí)際幫助開(kāi)發(fā)人員快速的發(fā)現(xiàn)和解決問(wèn)題,并且產(chǎn)生可待測(cè)試的鏡像列表。 測(cè)試流水線(xiàn) 測(cè)試人員:從候選測(cè)試鏡像列表中,選擇需要測(cè)試的目標(biāo)鏡像,標(biāo)記為測(cè)試版本(將0.1-dev標(biāo)記為0.1-test),并且將待測(cè)試鏡像自動(dòng)部署到驗(yàn)收測(cè)試環(huán)境,完成手動(dòng)探索性測(cè)試,對(duì)于已測(cè)試完成的鏡像標(biāo)記為預(yù)發(fā)布版本(0.1-test標(biāo)記為0.1-beta)。 在待測(cè)試鏡像列表中選擇鏡像,發(fā)布到開(kāi)發(fā)用DockerRegistry倉(cāng)庫(kù)。 對(duì)于測(cè)試人員而言,流水線(xiàn)的起點(diǎn)則變?yōu)榇郎y(cè)試的鏡像列表,基于WiseBuild創(chuàng)建Docker類(lèi)型流水線(xiàn),可以支持測(cè)試人員快速創(chuàng)建測(cè)試環(huán)境并且運(yùn)行相關(guān)的自動(dòng)化測(cè)試腳本,同時(shí)滿(mǎn)足手動(dòng)探索性測(cè)試的需求。 支持使用自動(dòng)化觸發(fā)方式,如‘1.0.*-beta’的形式,當(dāng)監(jiān)聽(tīng)dockerregistry有符合規(guī)則的鏡像產(chǎn)生后自動(dòng)觸發(fā)流水線(xiàn)。 支持手動(dòng)觸發(fā),測(cè)試猿人可以手動(dòng)選擇服務(wù)該規(guī)則的鏡像進(jìn)行手動(dòng)觸發(fā),一鍵準(zhǔn)備測(cè)試環(huán)境,運(yùn)行自動(dòng)化驗(yàn)收測(cè)試等。 自動(dòng)化部署流水線(xiàn) 運(yùn)維人員:從預(yù)發(fā)布鏡像列表中選擇鏡像部署到預(yù)發(fā)布環(huán)境,并且在驗(yàn)證通過(guò)后標(biāo)記為release版本(如將0.1-beta標(biāo)記為0.1-release),并且發(fā)布到生產(chǎn)環(huán)境。 與自動(dòng)化測(cè)試流水線(xiàn)相同,運(yùn)維人員可以建立獨(dú)立的部署流水線(xiàn),從待發(fā)布的鏡像列表中選擇鏡像發(fā)布到生產(chǎn)環(huán)境Registry中,并且設(shè)置流水線(xiàn)的自動(dòng)或者手動(dòng)觸發(fā),實(shí)現(xiàn)對(duì)于預(yù)生產(chǎn)環(huán)境的一鍵部署。 小結(jié) 睿云智合的WiseBuild持續(xù)交付平臺(tái)支持對(duì)接基于DokcerRegistry標(biāo)準(zhǔn)的鏡像倉(cāng)庫(kù)服務(wù),包括DockerHub,DockerRegistry,Habor,阿里云等等。 在基于容器的持續(xù)交付實(shí)現(xiàn)方案當(dāng)中,我們以鏡像為價(jià)值傳遞的單元,通過(guò)鏡像的持續(xù)測(cè)試以及驗(yàn)證,完成鏡像從開(kāi)發(fā),測(cè)試到可發(fā)布的狀態(tài)轉(zhuǎn)變,完成軟件的交付流程。 ?開(kāi)發(fā)人員頻繁提交,持續(xù)集成,持續(xù)反饋。 ?測(cè)試人員自服務(wù)部署一鍵準(zhǔn)備測(cè)試環(huán)境。 ?運(yùn)維人員執(zhí)行一鍵式部署預(yù)生產(chǎn)環(huán)境。...
Read More