搭建基於Jenkins, Apache Mesos和Marathon的彈性高可用的持續集成環境

【編者按】持續集成的開發實踐是目前的一個熱門話題,在本文中,數人科技雲平臺負責人周偉濤解析其利用開源的Jenkins,Apache Mesos和Marathon搭建彈性的,高可用的持續集成環境的實踐,詳細介紹了環境設置,在Marathon上部署Jenkins的master實例,配置Jenkins Master實現彈性伸縮,在內部的代碼庫或者 github 上建立一個 git repo,以及使用 marathon 部署可持久化的 Jenkins Master等步驟。 git


持續集成(CI)是一種軟件開發實踐,使用得當,它會極大的提升軟件開發效率並保障軟件開發質量;Jenkins是一個開源項目,它提供了一種易於使用的持續集成系統;Mesos是Apache下的一個開源的統一資源管理與調度平臺,它被稱爲是分佈式系統的內核;Marathon是註冊到Apache Mesos上的管理長時應用(long-running applications)的Framework,若是把Mesos比做數據中心Kernel的話,那麼Marathon就是init或者upstart的daemon。 github

本文旨在探討如何利用Jenkins,Apache Mesos和Marathon搭建一套彈性的,高可用的持續集成環境。 web

爲何要把Jenkins運行到Apache Mesos上

把Jenkins運行到Apache Mesos上,或者說利用Apache Mesos向Jenkins提供slave資源,最主要的目的是利用Mesos的彈性資源分配來提升資源利用率。經過配置Jenkins-on-Mesos插件,Jenkins Master能夠在做業構建時根據實際須要動態的向Mesos申請slave節點,並在構建完成的一段時間後將節點歸還給mesos。 shell

同時,Marathon會對發佈到它之上的應用程序進行健康檢查,從而在應用程序因爲某些緣由意外崩潰後自動重啓該應用。這樣,選擇利用Marathon管理Jenkins Master保證了該構建系統的全局高可用。並且,Jenkins Master自己也經過Marathon部署運行在Mesos資源池內,進一步實現了資源共享,提升了資源利用率。 數據庫

下面兩張圖形象的說明了Marathon將Jenkins Master部署到Mesos資源池,以及Jenkins Master使用Mesos資源池進行做業構建的整個過程。 api

環境設置

爲了便於理解,這裏我簡化了Mesos/Marathon集羣的架構,再也不考慮集羣自己的高可用性。至於如何利用zookeeper配置高可用的mesos/marathon集羣,能夠參考Mesosphere的官方文檔,這裏再也不展開。 瀏覽器

我搭建了一個包含40個節點 192.168.3.4-192.168.3.43 的Mesos集羣,其中一個節點用做運行Marthon及Mesos-master,其它39個節點做爲mesos的slave,以下所示。 bash

配置啓動Marathon,Mesos-Master和Mesos-Slave後,下面的整個操做都將在這個集羣上完成。 架構

Marathon上部署Jenkinsmaster實例

Marathon支持web頁面或者RESTapi兩種方式發佈應用,在192.168.3.*內網執行下面的bash命令,就會經過Marathon的RESTapi在mesos slave上啓動一個Jenkins master實例。 app

若是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份test二、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的彈性高可用的持續集成環境。

相關文章
相關標籤/搜索