wordpress java 微软 php Firefox shell Windows apache 开源 linux mysql Python centos Ubuntu google 编程 云计算 程序员 Android nginx

搭建彈性高可用的持續集成環境

持續集成的開發實踐是目前的一個熱門話題,在本文中,數人科技雲平臺負責人周偉濤解析其利用開源的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的彈性高可用的持續集成環境。

延伸阅读

评论