如何搭建基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境
【編者按】 持續集成的開發實踐是目前的一個熱門話題,在本文中,數人科技云平臺負責人周偉濤解析其利用開源的Jenkins,Apache Mesos和Marathon搭建彈性的,高可用的持續集成環境的實踐,詳細介紹了 環境設置,在Marathon上部署Jenkins的master實例,配置Jenkins Master實現彈性伸縮,在內部的代碼庫或者 github 上創建一個 git repo,以及使用 marathon 部署可持久化的 Jenkins Master等步驟。
持續集成(CI)是一種軟件開發實踐,使用得當,它會極大的提高軟件開發效率并保障軟件開發質量;Jenkins是一個開源項目,它提供了一種易于使用的持續集成系統;Mesos是Apache下的一個開源的統一資源管理與調度平臺,它被稱為是分布式系統的內核;Marathon是注冊到 Apache Mesos上的管理長時應用(long-running applications)的Framework,如果把Mesos比作數據中心Kernel的話,那么Marathon就是init或者upstart 的daemon。
本文旨在探討如何利用Jenkins,Apache Mesos和Marathon搭建一套彈性的,高可用的持續集成環境。
為什么要把Jenkins運行到Apache Mesos上
把Jenkins運行到Apache Mesos上,或者說利用Apache Mesos向Jenkins提供slave資源,最主要的目的是利用Mesos的彈性資源分配來提高資源利用率。通過配置Jenkins-on- Mesos插件,Jenkins Master可以在作業構建時根據實際需要動態的向Mesos申請slave節點,并在構建完成的一段時間后將節點歸還給mesos。
同時,Marathon會對發布到它之上的應用程序進行健康檢查,從而在應用程序由于某些原因意外崩潰后自動重啟該應用。這樣,選擇利用 Marathon管理Jenkins Master保證了該構建系統的全局高可用。而且,Jenkins Master本身也通過Marathon部署運行在Mesos資源池內,進一步實現了資源共享,提高了資源利用率。
下面兩張圖形象的說明了Marathon將Jenkins Master部署到Mesos資源池,以及Jenkins Master使用Mesos資源池進行作業構建的整個過程。
環境設置
為了便于理解,這里我簡化了Mesos/Marathon集群的架構,不再考慮集群本身的高可用性。至于如何利用zookeeper配置高可用的mesos/marathon集群,可以參考Mesosphere的官方文檔,這里不再展開。
我搭建了一個包含40個節點 192.168.3.4-192.168.3.43 的Mesos集群,其中一個節點用作運行Marthon及Mesos-master,其它39個節點作為mesos的slave,如下所示。
配置啟動Marathon,Mesos-Master和Mesos-Slave后,下面的整個操作都將在這個集群上完成。
在 Marathon 上部署 Jenkins 的 master 實例
Marathon支持web頁面或者RESTapi兩種方式發布應用,在192.168.3.*內網執行下面的bash命令,就會通過Marathon的RESTapi在mesos slave上啟動一個Jenkins master實例。
如果Jenkins master實例被成功部署,通過瀏覽器訪問http://192.168.3.4:8080(請確定你的瀏覽器能夠訪問內網,譬如可以利用設置瀏覽器代理等方式來搞定)可以在running tasks列表中找到jenkins,點擊進入詳細信息頁面,我們會看到下圖:
訪問http://192.168.3.4:5050/#/frameworks并在Active Frameworks中找到Marathon,點擊進入詳細信息頁面,可以在該頁面找到Jenkins Master具體運行到Mesos哪一臺Slave上,如下圖所示:
點擊sandbox
配置 Jenkins Master 實現彈性伸縮
接下來是配置Jenkins注冊成為Mesos的Framework,需要通過瀏覽器訪問http://192.168.3.25:31052/來到Jenkins Master的UI頁面。下面的截圖是我逐步配置的全過程。
1.點擊”系統管理”中的”系統設置”
2.設置Mesos Master為192.168.3.4:5050;點擊”Test Connection”測試鏈接,顯示鏈接成功后,點擊”應用”保存設置。
Jenkins在Mesos上注冊成功,訪問http://192.168.3.4:5050/#/frameworks,我們可以找到jenkins Framework,如下圖所示:
現在我們可以同時啟動多個構建作業來看一下Jenkins在Mesos上的彈性伸縮,在http://192.168.3.25:31052/上新建一個名為test的工程,配置其構建過程為運行一個shell命令top,如下圖所示:
把該工程復制3份test2、test3和test4,并同時啟動這4個工程的構建作業,Jenkins Master會向Mesos申請資源,如果資源分配成功,Jenkins Master就在獲得的slave節點上進行作業構建,如下圖所示:
因為在前面的系統配置里我們設置了執行者數量為2(即最多有兩個作業同時進行構建),所以在上圖中我們看到兩個正在進行構建的作業,而另外兩個作業在排隊等待。
下圖展示了當前的Jenkins作業構建共使用了0.6CPU和1.4G內存:
正在使用的slave節點的詳細信息:
配置 Jenkins Slave參數(可選)
在使用Jenkins進行項目構建時,我們經常會面臨這樣一種情形,不同的作業會有不同的資源需求,有些作業需要在配置很高的slave機器上運行,但是有些則不需要。為了提高資源利用率,顯然,我們需要一種手段來向不同的作業分配不同的資源。通過設置Jenkins Mesos Cloud插件的slave info,我們可以很容易的滿足上述要求。 具體的配置如下圖所示:
至此我們利用mesos為jenkins彈性的提供資源,同時配置Jenkins Slave的參數來滿足不同作業的資源需求,提高了集群的整體資源利用率。并通過Marathon 會自動檢查運行在它之上的app的健康狀態, 并重新發布崩潰掉的應用程序功能,實現了集群系統的部分高可用功能。接下來我們看看如何解決數據持久化的問題。
如何解決Jenkins Master的數據持久化問題
marathon會在Jenkins Master因意外崩潰后重新部署其到某個mesos slave節點上,但marathon無法維護應用程序的數據,即我們需要一個 Jenkins Master 的數據持久化方法,由于Jenkins Master是將數據存儲在XML文件而不是數據庫中,這里可以利用jenkins插件SCM Sync configuration plugin來將Jenkins Master的數據同步到相應的repo。
在內部的代碼庫或者 github 上創建一個 git repo
我們需要在內部的代碼庫或者公共代碼庫創建一個名為 jenkins-on-mesos 的 gitrepo , 譬如:git@gitlab.dataman.io:wtzhou/jenkins-on-mesos.git 。 這個 repo 是 jenkins 插件 SCM Sync configuration plugin 用來同步jenkins數據的。
另外,對于SCM-Sync-Configuration來說,非常關鍵的一步是保證其有權限 pull/push 上面我們所創建的gitrepo。 以我們公司的內部環境為例, 在mesos集群搭建時,我們首先使用ansible為所有的mesos slave節點添加了用戶core并生成了相同的ssh keypair,同時在內部的gitlab上注冊了用戶core并上傳其在slave節點上的公鑰,然后添加該用戶core為repo git@gitlab.dataman.io:wtzhou/jenkins-on-mesos.git的developer或者owner,這樣每個 mesos slave節點都可以以用戶core來 pull/push 這個gitrepo了。
使用 marathon 部署可持久化的 Jenkins Master
我們首先需要wget兩個文件:
其中start-jenkins.app.sh是需要配置的,
編輯如下3個變量:
1. SCM_SYNC_GIT: 上面所配置的 gitrepo 地址, 格式例子: git@gitlab.dataman.io:wtzhou/jenkins-on-mesos.git
2. APP_USER: marathon 會以用戶 APP_USER 來部署 jenkins ,從而插件SCM-Sync-Configuration會以用戶APP_USER來跟gitrepo進行同步。 所以在我們的這個例子里,我們讓APP_USER=core。
3. MARATHON_PORTAL: marathon 的 RESTapi 入口,例如: http://marathon.dataman.io:8080/v2/apps
接下來就可以執行命令:
來讓 marathon 部署我們的 Jenkins Master 了。這樣, 我們在 Jenkins Master 上所保存的任何配置,創建的任何job都會被SCM-Sync-Configuration同步到repo里,并在 Jenkins Master 被重新發布后 download 到本地。
關于 SCM-Sync-Configuration的更多信息
SCM-Sync-Configuration初始化完成后(在我們環境里初始化過程會被自動觸發),每次配置更新或者添加,編輯構建作業時,我們會得到一個提示頁面來為新的 commit message 添加 comment,如下圖所示:
當前,所支持的配置文件如下:
1. 構建作業的配置文件 (/jobs/*/config.xml)
2. 全局的 Jenkins/Hudson 系統配置文件 (/config.xml)
3. 基本的插件的配置文件 (/hudson*.xml, /scm-sync-configuration.xml)
4. 用戶手動指定的配置文件
另外,我們可以在每一頁的下面看到 scm sync config 的狀態, 下圖是同步出錯時的截圖,你可以去System Log查看具體的出錯信息。
至此,我們又解決了Jenkins Master的數據持久化問題。到這里,我們就真正搭建完成了基于Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境。(責編/周建丁)
作者簡介: 周偉濤,數人科技云平臺負責人。曾在Red Hat工作。Pythoner,對NLP,CI,Mesos和Docker有一定的實踐經驗。