|
本文只簡單標(biāo)記下大概的步驟,具體搭建各個(gè)部分的細(xì)節(jié),還請(qǐng)自行搜索。第一、二部分只是對(duì)Jenkins和Docker的簡單介紹,熟悉的同學(xué)請(qǐng)直接跳到第三部分。 一、關(guān)于Jenkins Jenkins簡介 Jenkins可以幫你構(gòu)建一個(gè)自動(dòng)化的持續(xù)集成環(huán)境,你可以使用它來“自動(dòng)化”編譯、打包、分發(fā)部署你的應(yīng)用,它兼容ant、maven、gradle等多種第三方構(gòu)建工具,同時(shí)跟svn、git能無縫集成,也支持直接與知名源代碼托管網(wǎng)站,比如github、bitbucket直接集成。 Jenkins安裝 Jenkins的安裝十分簡單,你可以從官網(wǎng)http://mirrors./war/latest/ 直接下載war包,使用java -jar jenkins.war,或者放到Tomcat類似的容器里運(yùn)行都可以(JDK版本建議使用1.6以上來運(yùn)行)。Jenkins默認(rèn)啟動(dòng)端口是8080,請(qǐng)注意端口占用。另外,Jenkins文件其實(shí)都在~/.jenkins目錄下,運(yùn)行過程中你可以在這里找到你運(yùn)行過的job和相應(yīng)的日志文件。 首次安裝,可以把插件都安裝上,自己都試試看。如果因?yàn)榫W(wǎng)絡(luò)原因,插件下載失敗的,可以從失敗詳情中把地址拷出來,下載后,以上傳hpi文件的方式安裝。 系統(tǒng)設(shè)置 安裝完成的第一步,先到Blobal Tool Configuration中配置相關(guān)的環(huán)境,如JDK、MAVEN、GIT等,相應(yīng)的路徑設(shè)置都是設(shè)置Jenkins這臺(tái)機(jī)子本地的目錄。建議把所有的配置都完善下,否則日后的運(yùn)行中可能會(huì)出現(xiàn)一些小問題,可以試下點(diǎn)擊?查看幫助,還是很有用的。 Jenkins集群配置 集群配置也十分簡單,就是添加slave節(jié)點(diǎn)的過程。點(diǎn)擊系統(tǒng)管理->管理節(jié)點(diǎn)->新建節(jié)點(diǎn),各個(gè)配置后面都有詳細(xì)的幫助說明的。在啟動(dòng)方法這里推薦使用 Launch slave agents on UNIX machines via SSH,這樣master節(jié)點(diǎn)會(huì)主動(dòng)使用SSH登陸到slave節(jié)點(diǎn)上,并運(yùn)行java -jar slave.jar,這樣一個(gè)slave節(jié)點(diǎn)就添加完成了。 構(gòu)建Job 其實(shí)到這一步,就是jenkins的常規(guī)流程了,你可以參照創(chuàng)建Job選項(xiàng)的界面的各個(gè)配置,制定你構(gòu)建計(jì)劃,或者我們直接使用腳本來完成我們的構(gòu)建操作(建議)選擇構(gòu)建Execute shell,文章末尾會(huì)附上一個(gè)完整項(xiàng)目的shell構(gòu)建流程。 Pipeline Pipeline字面意思就是流水線,很好用的Jenkins的一個(gè)插件,將很多步驟按順序排列好,做完一個(gè)執(zhí)行下一個(gè)。真實(shí)的工作環(huán)境有很多job,比如先編譯,然后執(zhí)行靜態(tài)代碼檢查、單元測試、然后部署服務(wù)器、服務(wù)器重啟、進(jìn)行ui測試等。我們需要對(duì)這些job進(jìn)行一些設(shè)置將它們的上下游關(guān)系配置好。 這時(shí)候Pipeline就派上用場了。在Jenkins主頁點(diǎn)擊新建視圖,然后選擇Build Pipeline View,然后填寫Select Initial Job,構(gòu)建后的操作可以選擇其他的Job,以此類推,這樣一個(gè)流水線就完成了。Pipeline提供視圖界面,你可以在視圖上形象地看到整個(gè)構(gòu)建計(jì)劃的執(zhí)行流程和完成度。 二、關(guān)于Docker Docker 簡介 Docker現(xiàn)在是Github社區(qū)最火的項(xiàng)目之一,Docker是個(gè)容器,或許你聽過lxc,你可能知道Tomcat這個(gè)Web容器,容器是什么概念,意會(huì)就好。問個(gè)問題,你想在一臺(tái)機(jī)子上運(yùn)行一個(gè)java6的應(yīng)用,又想運(yùn)行一個(gè)java8應(yīng)用怎么辦;或者說你開發(fā)出一個(gè)軟件,mac版、windows版本,我都想運(yùn)行,怎么辦?裝虛擬機(jī)?不不不,虛擬機(jī)太浪費(fèi)資源了,Docker這時(shí)候就派上用場了,在電腦上,你可以同時(shí)裝一個(gè)mac的容器和windows的容器哦。一個(gè)虛擬機(jī)可能會(huì)消耗2到3G的內(nèi)存,一個(gè)容器僅僅只消耗幾百M(fèi)的資源哦。 Docker 安裝 具體安裝細(xì)節(jié),可以參照https://docs.,文檔說得很清楚了。 Docker原本是開發(fā)在Linux上的,Windows下是采用Docker machine的方式,起一個(gè)虛擬機(jī)在虛擬機(jī)里面跑Docker。本來呢Mac也是采用虛擬機(jī)的方式,后來有了Docker for mac,采用HyperKit,一種更輕量級(jí)的虛擬化方式。當(dāng)然,你還是可以用Docker machine的方式運(yùn)行。 Docker 基礎(chǔ) 搞清楚兩個(gè)概念,容器與鏡像。打個(gè)比方吧。裝機(jī),容器就是裝完成后的系統(tǒng),鏡像就是ISO安裝盤,系統(tǒng)鏡像。 作為一個(gè)合格的程序員,你一定用過Git的吧,pull,commit,push……寫代碼過程就是這樣,先拉取代碼pull,然后是在一個(gè)基礎(chǔ)的文本上不斷地增加commit,加積木一樣,一層層疊加,累積上去,最后再push上去。沒錯(cuò)Docker就是采用這種形式。 簡單介紹下Docker命令:
Dockerfile基礎(chǔ) Dokcerfile,是的,你還是要稍微掌握下Dockerfile的寫法。
三、Jenkins+Docker自動(dòng)化集成環(huán)境搭建 這一步,我們把Jenkins和Docker結(jié)合起來。Jenkins本身版本比較老,雖然插件多,但許多插件沒有人在維護(hù)更新,環(huán)境本身還是比較舊的,且各式各樣的工程如果都用插件來安裝,這樣的插件不一定滿足要求,所以建議配合Docker來搭建測試環(huán)境。 如果說好處的話,還有比較激進(jìn)的一段話(建議略過哈): 我們把一個(gè)工程代碼開發(fā)后的測試流程簡單分為編譯、部署(事實(shí)上可能更多,如項(xiàng)目代碼有多個(gè)工程,工程間有相互依賴)。如果我們想在一個(gè)slave節(jié)點(diǎn)上既運(yùn)行Java7應(yīng)用,又運(yùn)行Java8應(yīng)用,哦,Jenkins有相應(yīng)的插件解決?那如果是NodeJs4應(yīng)用和NodeJs5應(yīng)用呢?JAVA升級(jí)到9了,插件沒更新?像一些復(fù)雜的工程,如JDK自身的編譯、如Docker項(xiàng)目的編譯,我需要安裝各種依賴,就可能會(huì)污染全局空間,這時(shí)候就建議把編譯過程放到容器里,或者說我要在Linux上編譯部署一個(gè)Windows應(yīng)用,在一個(gè)Windows容器里部署就可以了。 再比如,如果我們用omad部署web應(yīng)用可能要考慮端口沖突,部在Docker容器里,工程代碼的端口,都不用變。還有,容器作測試環(huán)境的話,如果要保證線上,線下環(huán)境一致,甚至可以復(fù)制一個(gè)線下容器,直接在線上跑容器的。還有...... 大致的想法是,我們用Jenkins來做節(jié)點(diǎn)控制、版本管理、流程設(shè)置、觸發(fā)Job,用Docker來搭建編譯部署環(huán)境。把這一切連接起來的就是流程腳本和Dockerfile的編寫。 實(shí)現(xiàn)細(xì)節(jié)可以參照下面的示例。 觸發(fā)條件:由Jenkins控制,如設(shè)置定時(shí)執(zhí)行,或者github中的每一個(gè)commit,或者每一個(gè)PR執(zhí)行一次。 構(gòu)建流程:各個(gè)環(huán)節(jié),Job,之間用Pipeline來實(shí)現(xiàn)整個(gè)構(gòu)建流程的控制。 構(gòu)建Job:這里,我覺得可以分為兩種情況,一種是把拉取代碼的過程和構(gòu)建編譯環(huán)境的過程都放到Dockfile里面,這適用于比較復(fù)雜的編譯環(huán)境,如Docker本身的編譯需要安裝許多的依賴,對(duì)依賴的版本都有不同的要求,還是建議把編譯環(huán)境放在容器的里面。另一種情況,為求省事方便,如java工程,編譯一般用maven等構(gòu)建工具來完成的話,大可以放在外面,只是把運(yùn)行環(huán)境搬到Docker容器里。 Execute shell: Dockerfile: 配置基礎(chǔ)運(yùn)行環(huán)境。 如果需要編譯,配置編譯環(huán)境,可以在容器內(nèi)拉取代碼,執(zhí)行編譯。 web應(yīng)用暴露端口。 配置應(yīng)用啟動(dòng)命令。 另外,容器里你都可以配置成8080端口,暴露8080端口,只要再Docker run -p *:8080,運(yùn)行時(shí)改下相應(yīng)的端口映射就可以了。 |
|
|