2019独角兽企业重金招聘Python工程师标准>>>

【编者按】持续集成的开发实践是目前的一个热门话题,在本文中,数人科技云平台负责人周伟涛解析其利用开源的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上部署Jenkinsmaster实例

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的弹性高可用的持续集成环境。

转载于:https://my.oschina.net/u/1425843/blog/628613

搭建基于Jenkins, Apache Mesos和Marathon的弹性高可用的持续集成环境相关推荐

  1. 基于 Jenkins 快速搭建持续集成环境--转

    源地址:http://www.ibm.com/developerworks/cn/java/j-lo-jenkins/ 持续集成是一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础 ...

  2. 基于 Jenkins 快速搭建持续集成环境

    持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域 ...

  3. 基于Jenkins快速搭建持续集成环境

    看了园友张善友的博文,尝试成功.便有此作.原网址: 基于 Jenkins 快速搭建持续集成环境 天下事有难易乎?为之,则难者亦易矣:不为,则易者亦难矣. 首先要学会使用MSBuild构建脚本 附网址: ...

  4. 基于Jenkins 快速搭建持续集成环境

    2019独角兽企业重金招聘Python工程师标准>>> 持续集成概述 什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开 ...

  5. 构建基于Jenkins + Github的持续集成环境

    登录 | 注册 John_cdy的专栏 学无止境 目录视图 摘要视图 订阅 有奖征资源,博文分享有内涵 6月推荐文章汇总 CSDN博文大赛初赛晋级名单公布 关注CSDN社区微信,福利多多 构建基于Je ...

  6. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境

    前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...

  7. 在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境

    本文以部署 Spring boot + Maven 项目为例,使用码云作为代码托管仓库,在 CentOS 7 上搭建 Jenkins 持续集成环境. 1. 准备工作 1.1 安装 Java 环境 Je ...

  8. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)

    前言 但凡一个略有规模的项目都需要一个持续集成环境的支撑,为什么需要持续集成环境,我们来看一个例子.假如一个项目,由A.B两位程序员来协作开发,A负责前端模块,B负责后端模块,前端依赖后端.A和B都习 ...

  9. Jenkins——Jenkins介绍+基于云平台的Jenkins安装和持续集成环境配置(插件+用户权限+凭据+Maven打包)

    Jenkins--Jenkins介绍+基于云平台的Jenkins安装和持续集成环境配置(插件+用户权限+凭据+Maven打包) 持续集成及Jenkins介绍 软件开发生命周期 什么是持续集成? 持续集 ...

最新文章

  1. Object.create(..)和new(..)的内部实现
  2. python在坐标轴上画矩形_Python使用matplotlib实现在坐标系中画一个矩形的方法
  3. php ldap 创建用户,PHP LDAP获取作为组成员的成员的用户详细信息
  4. Spring4中的@Value的使用(学习笔记)
  5. android实现计时器
  6. nginx连接uwsgi使用web.py框架构造pythonweb项目
  7. 刘润、叶军、付晓岩等大咖同台“论道”:如何成为数字化经济中的刚需人才?|福利赠票...
  8. C++环境的配置( windows)
  9. 让MySQL速度提升3倍的19种优化方式
  10. 极简主义2020UI设计正流行,欣赏下可临摹的案例模板!
  11. 如何解决”ArcGIS Server Site is currently being configured by another administrative operation“的问题
  12. 【POJ1679】The Unique MST(非严格次小生成树)
  13. 怎样把Linux的私钥文件id_rsa转换成putty的ppk格式
  14. c++优化后的快速排序
  15. rplidar的安装与使用
  16. 张国立不敢要片酬,吴京带病上阵拍戏,这个大佬不好惹?!
  17. 如何利用ipad随时随地开发代码
  18. Spartan6系列之时钟资源详解
  19. 如何录制电脑内部声音 视频中的音频怎么录制
  20. 牛客网js获取单行,多行输入

热门文章

  1. 非spring托管对象如何获取到spring托管对象
  2. 连接查询(交叉连接,内连接,外连接,自然连接)
  3. Linux之du命令
  4. 如何从低端面畜到高端面霸
  5. C#判断联网状态检查电脑联网状态
  6. linux scp命令参数及用法详解--linux远程复制拷贝命令使用实例【转】
  7. VDI序曲三十 APP-V4.6SP1之OFFICE07补丁升级
  8. leetCode 41.First Missing Positive (第一个丢失的正数) 解题思路和方法
  9. Jenkins 2.x版本的节点配置选项更新
  10. Round trip