前言
現(xiàn)在的企業(yè)很多都在用Jenkins做持續(xù)集成,各個(gè)業(yè)務(wù)端都依靠Jenkins,部署Jenkins服務(wù)時(shí)如何保障服務(wù)的高可用變得尤為重要。以下是最近收集的一些方案。
Gearman + Jenkins
這是openstack團(tuán)隊(duì)使用的方案,Jenkins本身是單體的,即只能有一個(gè)Jenkins Master。雖然你也可以在多臺機(jī)器上部署多個(gè)Jenkins Master,但這些Master之間沒有聯(lián)系,都是各自把任務(wù)交給手下的slaver去執(zhí)行,沒有任何交集。也許某個(gè)master下的slaver很忙,而另一個(gè)master下的slaver卻很閑,資源得不到充分利用。這個(gè)方案使用了gearman, gearman是個(gè)任務(wù)分發(fā)框架。
需要在每個(gè)Master上安裝好gearman的插件,并配置好能連接到gearman server,同時(shí)在每個(gè)Master必須建立相同的job。之后運(yùn)行任務(wù)的流程如下:
1、gearman worker運(yùn)行在各個(gè)Jenkins Master中等待gearman server分發(fā)任務(wù);
2、gearman client向gearman server發(fā)出運(yùn)行job的請求;
3、gearman server通知各個(gè)gearman worker有任務(wù)拉,第一個(gè)閑著的worker會接受任務(wù),如果所有的worker都忙,則放入gearman的任務(wù)隊(duì)列,得worker空閑時(shí)再分配;
4、gearman worker閑下來后會從任務(wù)隊(duì)列里取job來執(zhí)行,執(zhí)行完之后,將結(jié)果發(fā)回給gearman server;
5、gearman server將結(jié)果返回給 gearman client。
這樣各個(gè)salver資源可以得到充分利用,某個(gè)master掛掉另外的master可以繼續(xù)服務(wù)。
詳細(xì)信息可參考gearman插件說明
Jenkins + Apache Mesos + Marathon
Apache Mesos是一個(gè)開源的資源管理和調(diào)度平臺。大概的架構(gòu)就是一個(gè)Mesos Master下面掛著多個(gè)mesos slaver資源。 Marathon是一個(gè)mesos框架。
Marathon將Jenkins master部署在mesos資源池中。將Jenkins注冊為mesos的framework,則在jenkins構(gòu)建時(shí),會向mesos申請資源,申請資源成功,則執(zhí)行構(gòu)建,執(zhí)行任務(wù)結(jié)束則將資源釋放。
如果Marathon監(jiān)測到Jenkins應(yīng)用掛了,會馬上使用Mesos資源重新啟動Jenkins。所以Jenkins可能被部署在mesos資源的各個(gè)slaver機(jī)器。
那怎么保證數(shù)據(jù)一致呢?這個(gè)可以使用Jenkins插件SCM Sync configuration plugin。安裝此插件后,Jenkins的各種配置有更改時(shí),都會將修改提交到相應(yīng)的Git庫。保證所有的配置信息不會丟失,當(dāng)Jenkins重新在別的機(jī)器上啟動后, 從git上將配置下載下來,這樣就保證數(shù)據(jù)一致了。
詳細(xì)信息可參看如何搭建彈性高可用的持續(xù)集成環(huán)境
改造Jenkins的文件存儲方式
目前Jenkins的配置文件都是直接在硬盤上以文件形式存儲的,你在JENKINS_HOME的個(gè)文件夾下能看到各種.xml文件。有些公司在Jenkins上進(jìn)行二次開發(fā),將Jenkins的數(shù)據(jù)存儲方式改為數(shù)據(jù)庫存儲,這樣前端可以起多個(gè)Jenkins服務(wù),后端連相同的數(shù)據(jù)庫即可。數(shù)據(jù)庫也有比較成熟的高可用方案。
最簡單的Jenkins一主一備模式
平時(shí)讓Jenkins A機(jī)器提供服務(wù),并使用SCM Sync configuration plugin保存數(shù)據(jù),JenkinsA機(jī)器修改配置后觸發(fā)Jenins B更新配置,一旦Jenkins A出現(xiàn)問題掛掉后,切換到備機(jī)Jenkins B上。