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