中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

基于Docker的Jenkins pipeline工作流

2020-03-27    來(lái)源:多智時(shí)代

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬(wàn)Linux鏡像隨意使用

1、傳統(tǒng)我們的項(xiàng)目開(kāi)發(fā)模式是產(chǎn)品調(diào)研提出需求,開(kāi)發(fā)團(tuán)隊(duì)研究決定開(kāi)發(fā)方案選型。然后開(kāi)始一個(gè)周期的開(kāi)發(fā),模塊開(kāi)發(fā)完成之后開(kāi)始模塊間的聯(lián)調(diào)。聯(lián)調(diào)結(jié)束之后打包交付給測(cè)試團(tuán)隊(duì)。測(cè)試團(tuán)隊(duì),系統(tǒng)測(cè)試或自動(dòng)化測(cè)試,然后提交bug,開(kāi)發(fā)團(tuán)隊(duì)修復(fù)bug,周而復(fù)始。

2、傳統(tǒng)的模式中,存在著較多的不確定因素。例如,開(kāi)發(fā)環(huán)境、編譯環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境,等不確定因素。人為介入打包中的不確定因素,缺乏單元測(cè)試和自動(dòng)化測(cè)試的整合。從而導(dǎo)致的結(jié)果是,開(kāi)發(fā)-測(cè)試-修復(fù)的周期較長(zhǎng),而且很多小的問(wèn)題完全可以由單元測(cè)試進(jìn)行覆蓋。

持續(xù)交付并不是某個(gè)特定的軟件,而是一個(gè)結(jié)果。這個(gè)結(jié)果要求團(tuán)隊(duì)可以隨時(shí)的發(fā)布一個(gè)新的準(zhǔn)確版本,而且要求在編譯發(fā)布的過(guò)程中進(jìn)行自動(dòng)化測(cè)試,通過(guò)自動(dòng)化測(cè)試可以及時(shí)的發(fā)現(xiàn)并定位存在的bug,修復(fù)bug之后再進(jìn)行快速的發(fā)布到測(cè)試環(huán)境,測(cè)試團(tuán)隊(duì)直接進(jìn)行測(cè)試。

與傳統(tǒng)模式的區(qū)別在于持續(xù)交付可以提前發(fā)現(xiàn)bug的存在和快速修復(fù)而不必等到測(cè)試人員的介入之后才發(fā)現(xiàn)。持續(xù)交付分解出來(lái)就是“持續(xù)”和“交付”。 持續(xù) :持續(xù)要求任何時(shí),候任何情況都能進(jìn)行準(zhǔn)確的發(fā)布,做到準(zhǔn)確的發(fā)布需要注意以下幾個(gè)關(guān)鍵點(diǎn)。

持續(xù)應(yīng)該是一個(gè)周期性的,可以是每天的某個(gè)時(shí)間點(diǎn),也可以是某次代碼的提交,或者某次人為觸發(fā)。所以人工進(jìn)行構(gòu)建是不可能的,需要自動(dòng)化的構(gòu)建,自動(dòng)化要求構(gòu)建的任何一個(gè)流程都必須以腳本的形式運(yùn)行,代碼檢出、代碼構(gòu)建、各模塊代碼單元測(cè)試、集成測(cè)試、UI自動(dòng)化測(cè)試等。

發(fā)布的程序版本不允許是各個(gè)模塊在開(kāi)發(fā)環(huán)境編譯出一個(gè)版本作為交付,而要求在一個(gè)純凈的編譯環(huán)境中進(jìn)行構(gòu)建。

構(gòu)建的過(guò)程應(yīng)該要求最大可能的固化,例如操作系統(tǒng)的版本,構(gòu)建環(huán)境的版本,相關(guān)的依賴等。

避免從網(wǎng)絡(luò)獲取相關(guān)的文件,這點(diǎn)以nodejs為開(kāi)發(fā)或編譯的項(xiàng)目尤其重要,安裝node的依賴包總是一個(gè)漫長(zhǎng)的過(guò)程,就算有國(guó)內(nèi)的源,一般的項(xiàng)目也需要一兩分鐘的node依賴包,這不符合快速構(gòu)建。

交付 : 在持續(xù)編譯的過(guò)程,使用自動(dòng)化已經(jīng)可以避免大多數(shù)的錯(cuò)誤了。但是還是需要人為介入的系統(tǒng)測(cè)試,畢竟自動(dòng)化的測(cè)試一般只能覆蓋到70%左右。

根據(jù)我們團(tuán)隊(duì)內(nèi)部推廣這種工作方式的效果來(lái)看,持續(xù)集成確實(shí)讓我們工作便利了許多, 每次代碼的構(gòu)建和自動(dòng)化測(cè)試讓我們及時(shí)發(fā)現(xiàn)存在的bug。好的工作模式也需要團(tuán)隊(duì)成員的遵守,團(tuán)隊(duì)成員應(yīng)該積極的擁抱這種工作方式,團(tuán)隊(duì)成員需要做好以下幾點(diǎn)。

使用版本工具例如git。git有強(qiáng)大的版本回溯,成員每次完成一個(gè)小的功能點(diǎn)進(jìn)行代碼提交。合并到master分支,持續(xù)交付工具應(yīng)該配置為代碼更新觸發(fā)。團(tuán)隊(duì)內(nèi)部應(yīng)該等到持續(xù)交付流程結(jié)束之后,確認(rèn)編譯、自動(dòng)化測(cè)試通過(guò)之后方可進(jìn)行下一個(gè)版本的提交,這樣容易定位bug。而不會(huì)導(dǎo)致這次bug影響團(tuán)隊(duì)內(nèi)其他成員的工作。

主分支的代碼bug不應(yīng)該存留時(shí)間過(guò)長(zhǎng),避免團(tuán)隊(duì)內(nèi)其他成員合并代碼的時(shí)候引入其他問(wèn)題。

測(cè)試驅(qū)動(dòng)開(kāi)發(fā),任何一個(gè)新的功能開(kāi)發(fā)都應(yīng)該先寫好單元測(cè)試腳本,并積極更新自動(dòng)化測(cè)試腳本。并且積極地?fù)肀y(cè)試,雖然你明白這個(gè)測(cè)試不通過(guò)的問(wèn)題并不會(huì)引起很大的系統(tǒng)性問(wèn)題 ,但是還是應(yīng)該進(jìn)行修復(fù)而不是想方設(shè)法的跳過(guò)這個(gè)自動(dòng)化測(cè)試。

臨近下班的時(shí)候不要提交代碼,這主要是因?yàn)樽袷氐?點(diǎn)。

Docker已經(jīng)越來(lái)越火,CICD和Devops也是Docker一個(gè)重要的場(chǎng)景。在持續(xù)交付中使用Docker有一下優(yōu)點(diǎn)。

Docker強(qiáng)大的環(huán)境隔離性可以將環(huán)境和程序打包在一起,測(cè)試、運(yùn)維,人員無(wú)需知道我們的程序是如何配置的,只需要一條docker 的命令就可以將我們的程序運(yùn)行起來(lái),這也更加容易實(shí)現(xiàn)持續(xù)部署。

減少編譯環(huán)境的污染,因?yàn)镈ocker天然的隔離性,也避免了傳統(tǒng)編譯環(huán)境難以配置多套編譯環(huán)境的問(wèn)題。在基于Docker的持續(xù)發(fā)布中,我們可以在同一臺(tái)宿主機(jī)上同時(shí)編譯不同版本的Java項(xiàng)目,不同版本的Python項(xiàng)目,而無(wú)需任何配置,鏡像也只是從docker hub中獲取。

持續(xù)集成

在持續(xù)集成方面,我們選擇Jenkins。Jenkins是一款開(kāi)源軟件,擁有眾多優(yōu)秀的插件,依靠這些插件,我們可以完成一些周期、繁瑣、復(fù)雜的任務(wù)。例如我們今天分享的持續(xù)發(fā)布,雖然Jenkins解決了我們繁瑣復(fù)雜周期性的操作,但是沒(méi)有解決我們?cè)诙喾N環(huán)境下編譯構(gòu)建的需求。而這個(gè)場(chǎng)景正是Docker的強(qiáng)項(xiàng)。

通過(guò)Jenkins的pipeline我們可以實(shí)現(xiàn)代碼檢出、單元測(cè)試、編譯、構(gòu)建、發(fā)布、測(cè)試等流程的自動(dòng)化,而最終通過(guò)Jenkins的Docker插件將產(chǎn)出物構(gòu)建成鏡像,方便部署到Docker環(huán)境。

持續(xù)部署

持續(xù)集成讓我們新的代碼源源不斷的構(gòu)建成了鏡像,這些鏡像經(jīng)歷了單元測(cè)試,自動(dòng)化測(cè)試,但還沒(méi)有接受過(guò)測(cè)試團(tuán)隊(duì)的嚴(yán)格測(cè)試。Jenkins是一個(gè)強(qiáng)大的持續(xù)集成工具,然而持續(xù)部署并不是Jenkins的強(qiáng)項(xiàng),但是Jenkins擁有很多強(qiáng)大的插件。22.而且我們持續(xù)集成產(chǎn)出的是鏡像,所以持續(xù)的部署,我們只需要將鏡像運(yùn)行起來(lái),或者利用第三方的容器管理平臺(tái)提供的API進(jìn)行部署。

本地部署應(yīng)用到Docker:本地部署到Docker容器可以使用Jenkins的docker插件,下面會(huì)介紹。

部署到遠(yuǎn)程主機(jī)的Docker、Appsoar。Docker和Appsoar都支持開(kāi)啟API調(diào)用。通過(guò)現(xiàn)有的API我們可以運(yùn)行我們生成鏡像版本。從而達(dá)到持續(xù)的部署最新版本。

部署到kubernetes。kubernetes除了可以通過(guò)API調(diào)用還可以在jenkins中配置kubectl的方式創(chuàng)建或更新deployments。

Docker中運(yùn)行Jenkins: Docker部署Jenkins的方式簡(jiǎn)單方便,下面我們介紹用Docker的方式運(yùn)行Jenkins。

基于Docker的Jenkins pipeline工作流

這里將docker.sock和docker的可執(zhí)行文件掛載到j(luò)enkins容器中,這樣我們就可以在容器中使用docker了。

jenkins容器,默認(rèn)的用戶是jenkins因?yàn)槲覀冃枰褂胐ocker所以我們需要使用root用戶。

/var/jenkins_home的掛在卷是可選的,jenkins_home存放了所有任務(wù)、日志、認(rèn)證、插件等jenkins運(yùn)行后的文件?勺鰯(shù)據(jù)恢復(fù)使用。

配置Jenkins

解鎖jenkins:解鎖的密碼在容器的log中可以查看,或者直接查看jenkins_home指定文件

基于Docker的Jenkins pipeline工作流

選擇插件

基于Docker的Jenkins pipeline工作流

創(chuàng)建Pipeline

下面我們創(chuàng)建一個(gè)的Jenkins的Pipeline完成簡(jiǎn)單的cicd流程。

新建pipeline,在左側(cè)新建選擇pipeline。

在左側(cè)的Credentials中新建git和鏡像倉(cāng)庫(kù)的credentials

配置pipeline,例如定時(shí)觸發(fā),代碼更新觸發(fā),webhook觸發(fā)等。

在pipeline script中填入下面的demo.

以下是偽代碼,僅提供思路

基于Docker的Jenkins pipeline工作流

Jenkins pipeline的腳本語(yǔ)法是groovy的語(yǔ)法,其中docker 、Git是插件提供的能力。代碼的執(zhí)行流程如下:

基于Docker的Jenkins pipeline工作流

通過(guò)Git插件獲取最新代碼到j(luò)enkins的工作區(qū),例如`/var/jenkins_home/workspace/pipelineDemo。

docker.image().inside是如何編譯我們的代碼呢,通過(guò)查看Jenkins的console 可以看到如下log.

通過(guò)docker插件提供的能力構(gòu)建鏡像,Dockerfile存放在代碼目錄中。構(gòu)建鏡像后push到鏡像倉(cāng)庫(kù),私有倉(cāng)庫(kù)需要自行配置鏡像倉(cāng)庫(kù)。

鏡像構(gòu)建完成之后就可以刪掉舊版本,并重新運(yùn)行一個(gè)新的版本。

熟悉Docker命令的朋友應(yīng)該很容易理解了,原來(lái)是docker.image().inside啟動(dòng)的時(shí)候會(huì)將當(dāng)前的目錄掛在到容器中,然后在容器中執(zhí)行./script/build.sh,這樣我們就完成了利用容器中存在的環(huán)境做單元測(cè)試或構(gòu)建編譯了。

通過(guò)簡(jiǎn)單的例子,可見(jiàn)Jenkins和Docker的結(jié)合給CICD帶來(lái)了足夠的便利和強(qiáng)大。我們需要準(zhǔn)備的只是一個(gè)編譯的腳本,在編譯腳本中可以使用任何的環(huán)境和任何的版本。

Pipeline 介紹

Jenkins 的任務(wù)兩個(gè)主要版本。

free style 只是一個(gè)自動(dòng)化的腳本,腳本類型為shell。所有的腳本在一臺(tái)機(jī)器上運(yùn)行,需要的環(huán)境需要提前準(zhǔn)備。配置不集中,混亂。但是一般情況下還是夠用的。

pipeline 是jenkins2的版本使用了一個(gè)基于groovy腳本的任務(wù)類型,通過(guò)一系列的stage 將構(gòu)建的不同部分組合成一個(gè)pipline。而且配合step可以完成異步操作。因?yàn)榛趃roovy可編程性更加

強(qiáng)大,而且腳本可以存放在源碼中,腳本的更改不需要直接到j(luò)enkins中修改。

pipeline的一些使用經(jīng)驗(yàn)和技巧

jenkins的資料較少,官網(wǎng)可以查看的內(nèi)容也不多,一般的需求Jenkins內(nèi)置的pipeline-syntax里面就有常用的命令生成器。可以滿足大多數(shù)需求。

在pipeline腳本調(diào)試完成之后應(yīng)該將腳本以文件的形式放在源碼目錄中,這樣子方便修改。和多分支需要編譯的情況下進(jìn)行互相隔離。

應(yīng)該多查找下相應(yīng)的插件,而不是使用sh用執(zhí)行腳本的方式來(lái)解決問(wèn)題。

應(yīng)該將jenkins_home目錄掛在出來(lái),如果遇上了Jenkins崩潰了可以及時(shí)的恢復(fù)數(shù)據(jù)。

應(yīng)該新建一個(gè)定時(shí)的pipeline用來(lái)清理生成的鏡像,減少硬盤資源的占用。

頁(yè)面新建的pipeline,在頁(yè)面刪除之后,jenkins_home/workspace中對(duì)應(yīng)的項(xiàng)目文件并不會(huì)被刪除。

標(biāo)簽: 操作系統(tǒng)  慈砑

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:你該不該把所有數(shù)據(jù)都放在一個(gè)云里?

下一篇:在非容器環(huán)境中實(shí)現(xiàn)DevOps