【小(xiǎo)編推薦】如(rú)何搭建基于Je♠™nkins, Apache Mesos和(hé)Marathon的(de)彈γ✔↓性高(gāo)可(kě)用(yòng)的(de)持續集成環境

2015-06-23  &nbs♠↕≈ p;|   發布者:梁國(guó)芳§™>   |  ←$<; 查看(kàn):3320次

IT新聞
 【編者按】持續集成的(de)開(kāi)發實踐是(shì)目前的(d®&e)一(yī)個(gè)熱(rè)門(mén)話(huà)題÷¥,在本文(wén)中,數(shù)人(r™ε©‌én)科(kē)技(jì)雲平台負責人(rén)周偉濤解析其σ±利用(yòng)開(kāi)源的(de)Jenkins,Apache Me♣≤φ•sos和(hé)Marathon搭建彈性的(de),高÷¥σ✘(gāo)可(kě)用(yòng)的(de)持續集成環境的(de <)實踐,詳細介紹了(le)環境設置,在Marathon上(shàng)部♠§€β署Jenkins的(de)master實例,配置Je€&‍nkins Master實現(xiàn)彈性伸縮,在內('< nèi)部的(de)代碼庫或者 github 上(shànβ↔♥‌g)創建一(yī)個(gè) git repo,以及使用(yòng) marσβ™athon 部署可(kě)持久化(huà)的(de) Jen >kins Master等步驟。

持續集成(CI)是(shì)一(yī)種軟¥∑件(jiàn)開(kāi)發實踐,使用(yòng)得(de)當,它會(hu≥ ì)極大(dà)的(de)提高(gāo)軟件(jiàn)開(kāi≤¶)發效率并保障軟件(jiàn)開(kāi)®​發質量;Jenkins是(shì)一(yī)個(gè)開(kāi)源項目™‍≈¥,它提供了(le)一(yī)種易于使用(yòng)的λ‌$→(de)持續集成系統;Mesos是(shì)Apache下(x ™♥αià)的(de)一(yī)個(gè)開(kāi)源的β×‌(de)統一(yī)資源管理(lǐ)與調度平台≈<,它被稱為(wèi)是(shì)分(fēn)布式系統的(de)內(nèiδ∞≤→)核;Marathon是(shì)注冊到(dào)Apache Mesos÷"δ'上(shàng)的(de)管理(lǐ)長(cháng)時(shí)應≠ε←♥用(yòng)(long-running applications)的(de✔♠₩)Framework,如(rú)果把Mesos比♦δ∞作(zuò)數(shù)據中心Kernel的(de)話♠>♦(huà),那(nà)麽Marathon就(jiù)'<γ是(shì)init或者upstart的(de)daemon。

本文(wén)旨在探討(tǎo)如(rú)何利用(yòng)Jenkins,A"γ" pache Mesos和(hé)Marathon搭建一(yī)套↓ ↔彈性的(de),高(gāo)可(kě)用(yòng)的(de)持續集$✔成環境。

 

為(wèi)什(shén)麽要(yào)把Jenkin¶≤Ωs運行(xíng)到(dào)Apache Meso"™βs上(shàng)

 

把Jenkins運行(xíng)到(dào)ApδΩ•ache Mesos上(shàng),或者說(shuō)利用(yòng)Apσ €♦ache Mesos向Jenkins提供slave資源,最主要(yà©$↕o)的(de)目的(de)是(shì)利用(yòng)Mesos的β™¶∑(de)彈性資源分(fēn)配來(lái)提高(gāo)資源利用(∏‍§yòng)率。通(tōng)過配置Jenkins-on-↔♠≠∑Mesos插件(jiàn),Jenkins Mσ☆Ωaster可(kě)以在作(zuò)業(♥€αyè)構建時(shí)根據實際需要(yào±™ε)動态的(de)向Mesos申請(qǐng)slave節點,并在構建完成的(d£₩&♠e)一(yī)段時(shí)間(jiān)後将節點γ‍‍歸還(hái)給mesos。

同時(shí),Marathon會(huì)對(duì)發布到(dào™≤₩)它之上(shàng)的(de)應用(yòng)程序進行(x ↓íng)健康檢查,從(cóng)而在應用(yòng)程序由φα€§于某些(xiē)原因意外(wài)崩潰後自(zì)動重啓該應用(yòng←★§§)。這(zhè)樣,選擇利用(yòng)Maratho♦‌≥n管理(lǐ)Jenkins Master保證了(le)該✘λ©構建系統的(de)全局高(gāo)可(kě)用(yòng)。而且®←≥,Jenkins Master本身(shēn)也↔"(yě)通(tōng)過Marathon部署運行(®≈☆≥xíng)在Mesos資源池內(nèi),進一(yī)步實現(xiλ±ε™àn)了(le)資源共享,提高(gāo)了(le)資源δ₽利用(yòng)率。

下(xià)面兩張圖形象的(de)說(shuΩ>ō)明(míng)了(le)Marathon将JenkinsΩ₩™ Master部署到(dào)Mesos資源池,以γ→→及Jenkins Master使用(yòng)Mesos資源池進行Ω✘​​(xíng)作(zuò)業(yè)構建的(de)整個(gè)過程。

 

 

環境設置

為(wèi)了(le)便于理(lǐ)解,這(zhè)裡(lǐ)我簡化(×&♥​huà)了(le)Mesos/Marathon集群的(de•≤")架構,不(bù)再考慮集群本身(shēn)的(de)高(gāo)可(kě)用&β≥ (yòng)性。至于如(rú)何利用(yòn​©♠¶g)zookeeper配置高(gāo)可(kě)用(yòng)的(de)•≤mesos/marathon集群,可(kě)以參¶''考Mesosphere的(de)官方文(wén)檔,這(z ↕hè)裡(lǐ)不(bù)再展開(kāi)。

我搭建了(le)一(yī)個(gè)包含40個(gè)節點 192.168Ωσ .3.4-192.168.3.43 的(de)Mesos集群,∞γ其中一(yī)個(gè)節點用(yòng)作¶γ&φ(zuò)運行(xíng)Marthon及Mesoδφ↔s-master,其它39個(gè)節點作(zuò)為(wèi)λγ Ωmesos的(de)slave,如(rú♦≈π)下(xià)所示。

 

配置啓動Marathon,Mesos-Master和(hé)Me↕♣±sos-Slave後,下(xià)面的(de)整個(gè)操作(zuò)都"​¥(dōu)将在這(zhè)個(gè)集群上'δ§ (shàng)完成。

Marathon上(shàng)部署Jenkins的(de)master實例

 

Marathon支持web頁面或者RESTapi兩種方式發布應用≥↔∑(yòng),在192.168.3.*內(nèi©§)網執行(xíng)下(xià)面的(de§‌')bash命令,就(jiù)會(huì)通(tōng)過Marathon的→₹∏(de)RESTapi在mesos slave上(shàng)啓動一§®(yī)個(gè)Jenkins master實例。

 

如(rú)果Jenkins master實例被≥¥&成功部署,通(tōng)過浏覽器(qì)訪問(wèn)>Ωφhttp://192.168.3.4:8080(請(qǐn₩↕®γg)确定你(nǐ)的(de)浏覽器(qì)能(néng)夠訪問↔≥©≤(wèn)內(nèi)網,譬如(rú)可(kě)以利用(yòng)設置浏覽♣₽✔器(qì)代理(lǐ)等方式來(lái)搞定)可(k>×‍↔ě)以在running tasks列表中找到(dào)je↔λγnkins,點擊進入詳細信息頁面,我們會(h§®× uì)看(kàn)到(dào)下(xià)圖:

 

訪問(wèn)http://192.168.3.≠♦÷ 4:5050/#/frameworks并在Active ©↓αFrameworks中找到(dào)Marat←≤§hon,點擊進入詳細信息頁面,可(kě)以在₹  ☆該頁面找到(dào)Jenkins Master具♠Ωπ體(tǐ)運行(xíng)到(dào)Mesos哪一(yī)台Slave上(s♦"→hàng),如(rú)下(xià)圖所示:

 

點擊sandbox

 

 

配置Jenkins Master實現(xiàn)彈性伸縮

 

接下(xià)來(lái)是(shì)配置Jenkiγ♣↑ns注冊成為(wèi)Mesos的(de)Framew•&♥ork,需要(yào)通(tōng)過浏覽器(qì)訪問(wèn•₩‌₩)http://192.168.3.25→₽:31052/來(lái)到(dào)Jenkins Ma®←©¶ster的(de)UI頁面。下(xià)€‍ 面的(de)截圖是(shì)我逐步配置的(de)₹✔全過程。

1.點擊”系統管理(lǐ)”中的(d$≈‍e)”系統設置”


 

2.設置Mesos Master為(wèδπ♥i)192.168.3.4:5050;點擊”Test Connπ✔♣σection”測試鏈接,顯示鏈接成功後,點​§✔擊”應用(yòng)”保存設置。


 

 

 

Jenkins在Mesos上(shàng)注冊成功,訪問(wèn)h₩βπ≥ttp://192.168.3.4:5050/#/framework∏γ™§s,我們可(kě)以找到(dào)jenkins Framewo©•€rk,如(rú)下(xià)圖所示:

 

現(xiàn)在我們可(kě)以同時(shí)啓動多(duō÷$‍)個(gè)構建作(zuò)業(yè)來(lái)看≈‌₩←(kàn)一(yī)下(xià)Jenkins在Mesos上(shàng¶♠)的(de)彈性伸縮,在http://192.168.3.25:3&>1052/上(shàng)新建一(yī)¶♠ 個(gè)名為(wèi)test的(de)工↕γσ¶(gōng)程,配置其構建過程為(wèi)運行(xíng)一(yī)個(gè)®‌←shell命令top,如(rú)下(xià)圖所示:÷™

 

把該工(gōng)程複制(zhì)3份test2、test3和(hé)t××est4,并同時(shí)啓動這(zhè)4個(gè)工(gōng)程的(de♥♦α✔)構建作(zuò)業(yè),Jenkins Master會(huì)向M‌¥esos申請(qǐng)資源,如(rú)果資源分(fēn)配成功∏ •,Jenkins Master就(jiù)在獲得(de) ↔™的(de)slave節點上(shàng)進行(xíng)γΩ作(zuò)業(yè)構建,如(rú)下(xià)圖所示:

 

因為(wèi)在前面的(de)系統配置裡(lǐ)我們設置✘↓ ₽了(le)執行(xíng)者數(shù)量為(wèi)2(即最多(d​ Ωuō)有(yǒu)兩個(gè)作(zuò)業(yè)同時(shí)♣‌進行(xíng)構建),所以在上(shàng)圖中我們看(kàn)到(dε↕ào)兩個(gè)正在進行(xíng)構建的(de<‍↕δ)作(zuò)業(yè),而另外(wài)兩個(gè)作(zu$<☆ò)業(yè)在排隊等待。

下(xià)圖展示了(le)當前的(de)J©÷©enkins作(zuò)業(yè)構建共使用(yò§ ↓ng)了(le)0.6CPU和(hé)1.☆∏♠ 4G內(nèi)存:

 

正在使用(yòng)的(de)slave節點的(de)詳細信息:♣¶‌✔

 

 

配置Jenkins Slave參數(shù)(↑>₹≠可(kě)選)

在使用(yòng)Jenkins進行(xí​♣≈ ng)項目構建時(shí),我們經常會(huì)面臨這(zh↑≈←è)樣一(yī)種情形,不(bù)同的(de)作(zuò)業(y襮)會(huì)有(yǒu)不(bù)同的(de)資源需求,有(yǒu)些↓≠₩(xiē)作(zuò)業(yè)需要(yào♣§)在配置很(hěn)高(gāo)的(de)sla→'ve機(jī)器(qì)上(shàng)運行(xíng),但(dàn)§​←是(shì)有(yǒu)些(xiē)則不(bù)需要(yào)。φ↕​ 為(wèi)了(le)提高(gāo)資源利用(yòng)率,顯然 €,我們需要(yào)一(yī)種手段來(lái)向不(bù)同的( €™©de)作(zuò)業(yè)分(fēn)配₩★不(bù)同的(de)資源。通(tōng)✘ε過設置Jenkins Mesos Cloud₽∑÷Ω插件(jiàn)的(de)slave inf€'₽o,我們可(kě)以很(hěn)容易的(de)滿足上(shà™®ng)述要(yào)求。 具體(tǐ)的(de)配置如($☆Ω‌rú)下(xià)圖所示:

 

至此我們利用(yòng)mesos為(wèi)jenkins彈性的(♦↕ de)提供資源,同時(shí)配置Jenkins Slave的(de)≤₽♣參數(shù)來(lái)滿足不(bù)同≥λ'作(zuò)業(yè)的(de)資源需求,提高(gāo)了(le $£)集群的(de)整體(tǐ)資源利用(yòn→σ♠¶g)率。并通(tōng)過Marathon 會(huì)自(zì)動檢查運行(ε‌xíng)在它之上(shàng)的(de↓α↕)app的(de)健康狀态, 并重新發布崩•✘∏潰掉的(de)應用(yòng)程序功能(néng),實現(xiàn)了(le)&∞ 集群系統的(de)部分(fēn)高(gāo)可(kě)用(yò↑δ↕ng)功能(néng)。接下(xià)來(lái)我們看(kà♦©☆n)看(kàn)如(rú)何解決數(shù)據持久化(huà)的(de)¶δ'λ問(wèn)題。

 

如(rú)何解決Jenkins Master∏☆φ®的(de)數(shù)據持久化(huà)問(wèn)題

 

marathon會(huì)在Jenkins β₹Master因意外(wài)崩潰後重新部署其到(dào)某個"→₹∏(gè)mesos slave節點上(shàng),'β但(dàn)marathon無法維護應用(yòng)程∑εΩ序的(de)數(shù)據,即我們需要(yào)₽π一(yī)個(gè) Jenkins Master 的(de)數(shφ★→←ù)據持久化(huà)方法,由于Jenkins Master是(≤ε≥₽shì)将數(shù)據存儲在XML文(wén)件(β₩jiàn)而不(bù)是(shì)數(shù)據庫中,這(zhè)裡(lǐ)≥£≈≠可(kě)以利用(yòng)jenkins插件(jiàn)SCM Sync ₹∞®configuration plugin來(lái)将​εJenkins Master的(de)數(shù)據同步到(dào)相(≤☆↔αxiàng)應的(de)repo。

在內(nèi)部的(de)代碼庫或者 github 上(shàng)創建一(yī)個(gè) git repo

我們需要(yào)在內(nèi)部的(de)代碼庫或者公共代碼庫創建一∞$"(yī)個(gè)名為(wèi) jenkins₹☆₽λ-on-mesos 的(de) gitre$δpo , 譬如(rú):git@gitlab.'≈​dataman.io:wtzhou/jenkins-on-meso♦αs.git 。 這(zhè)個(gè) repo 是(shì) j¥>↕☆enkins 插件(jiàn) SCM Sync co←↔↕nfiguration plugin 用(yòng)來'≠(lái)同步jenkins數(shù)據的(de)。

另外(wài),對(duì)于SCM-Sync-Config¥£>↕uration來(lái)說(shuō),非常關☆≥≠鍵的(de)一(yī)步是(shì)保證其有(yǒu)≈™≥權限 pull/push 上(shàng)面我們所創建的(de↓​✔π)gitrepo。 以我們公司的(de)內(nèi)部環境為(wè>‍i)例, 在mesos集群搭建時(shí),我們首先使用(↑₹'yòng)ansible為(wèi)所有(yǒu)的(d→δ&e)mesos slave節點添加了(le)用(yòng)戶core并生(s↓♦←hēng)成了(le)相(xiàng)同的(de)ssh keypa¶±ir,同時(shí)在內(nèi)部的(de)gitlab上(shàng)注冊©≥§π了(le)用(yòng)戶core并上(shàng &α)傳其在slave節點上(shàng)的(de)公鑰,然後添加該用(yòng)$ε 戶core為(wèi)repo git@gitlab.data∞×>λman.io:wtzhou/jenkins-on-mesos.git的(d™→♠ e)developer或者owner,這(zhè)樣每個(gè)m§↕≤esos slave節點都(dōu)可(kě)以以用(yòng‍£)戶core來(lái) pull/push∑σ< 這(zhè)個(gè)gitrepo了(le)。

使用(yòng) marathon 部署可(kě)持久&∏化(huà)的(de) Jenkins Masterε>ε∑

 

我們首先需要(yào)wget兩個(gè)文(wén)®£件(jiàn):

 

其中start-jenkins.app.sh是(shì)需要(yào)配置δ∑的(de),

 

編輯如(rú)下(xià)3個(gè)變量:

1. SCM_SYNC_GIT: 上(shàng)面所配置的(de) gitrepoφ×÷ 地(dì)址, 格式例子(zǐ): git@gitlab.dataman.i&×‍o:wtzhou/jenkins-on-mesos.git

2. APP_USER:  marathon€✘→ 會(huì)以用(yòng)戶 APP_USER 來σ (lái)部署 jenkins ,從(cóng)而插件(jiàn)SCM-&αSync-Configuration會(huì)以用(yòng)戶APP_USε‍εδER來(lái)跟gitrepo進行(xσ"£íng)同步。 所以在我們的(de)這(zhè)個(gè)例子(zǐ)裡(l$←'ǐ),我們讓APP_USER=core。

3. MARATHON_PORTAL:  marathon 的(de) RESTapi 入‌≠ α口,例如(rú):http://marathon.dataman.io:8080/v2/apps✘↓∑

接下(xià)來(lái)就(jiù)可(kě)以執行(σγxíng)命令:

 

來(lái)讓 marathon 部署我們的(de) Jenkins Ma↔≤↑∑ster 了(le)。這(zhè)樣, 我們在 ♣♣&Jenkins Master 上(shànγσ©g)所保存的(de)任何配置,創建的(de)任何jo₽≈×b都(dōu)會(huì)被SCM-Synσ​§c-Configuration同步到(dào)repo裡(lǐ),并在 J↑>enkins Master 被重新發布後 dσ‌ ↑ownload 到(dào)本地(dì)。>β

關于SCM-Sync-Configuration的δ★♠±(de)更多(duō)信息

 

SCM-Sync-Configuration初始化(huà)完成後(在♦≠我們環境裡(lǐ)初始化(huà)過程會(huì)被Ωπ€Ω自(zì)動觸發),每次配置更新或者添加,編輯構↕♥☆建作(zuò)業(yè)時(shí),我們會(huì)得(de)到(dào)¶  ≥一(yī)個(gè)提示頁面來(lái)為(w<$èi)新的(de) commit message 添加 commeε$nt,如(rú)下(xià)圖所示:

 

當前,所支持的(de)配置文(wén)件(jiàn)如(rú)下(xià♥≈$>):

1. 構建作(zuò)業(yè)的(de)配置文(wén)件×₽$ (jiàn) (/jobs/*/confi<‌δg.xml)

2. 全局的(de) Jenkins/Hu ¶₹∑dson 系統配置文(wén)件(jiàn) (/c•↑γ'onfig.xml)

3. 基本的(de)插件(jiàn)的(de)配置文(wén)件(jià₽αβ≠n) (/hudson*.xml, /scm-sync-conf ↑₹δiguration.xml)

4. 用(yòng)戶手動指定的(de)配置文(wén)件(jiàn)

另外(wài),我們可(kě)以在每一(yī)頁的(de)下(xià)δ↔♣<面看(kàn)到(dào) scm sync config©↓→ 的(de)狀态, 下(xià)圖是(shì)同步出錯(cuò♦"×✔)時(shí)的(de)截圖,你(nǐ)可(♠≈ kě)以去(qù)System Log查看(kàn)具體(tǐ)的$σ™♣(de)出錯(cuò)信息。

 

至此,我們又(yòu)解決了(le)Jenkins Master的(de​↕∞)數(shù)據持久化(huà)問(wè♥λ"n)題。到(dào)這(zhè)裡(lǐ),我們就(jiù)真正搭建完成了(l★ε©e)基于Jenkins, Apache Me→σδsos和(hé)Marathon的(de)彈性高(gāo)可(kě)用₹•(yòng)的(de)持續集成環境。