当前位置: 首页 > 编程日记 > 正文

Learn Jenkins the hard way (0) - Jenkins的罪与罚

写在开头

Jenkins是非常流行的开源的持续交付平台,拥有丰富的插件、文档与良好的社区。是国内大多数公司私有持续集成方案CI/CD服务器的选型。开发者可以快速的通过Jenkins搭架符合自己业务场景的pipeline,结合大量的开源插件,可以轻松的满足不同语言、不同平台、不同框架的持续集成场景。无论是风头蒸蒸日上的Gitlab-CI或者是在开源领域广受好评的travis.ci,都无法替代Jenkins在持续集成领域的地位。但是再高大的建筑也无法遮住阳光下的影子,Jenkins虽然有各种各样的优势,它的问题也足以令人扼腕。本系列的初衷是通过源码的方式学习Jenkins,改造Jenkins。

Jenkins的罪与罚

高可用性

作为持续集成领域多年的Top one,Jenkins的所有的数据存储竟然都是以xml文件的方式进行持久化的。在Jenkins启动的时候需要指定存储源数据的目录,可以通过JENKIN_HOME这个目录进行配置。JENKINS_HOME的目录结构如下:

1.4M    ./updates
180M    ./plugins
147M    ./cache
4.0K    ./.docker
60K     ./secrets
124K    ./.java
508K    ./logs
4.0K    ./fingerprints
8.0K    ./init.groovy.d
21M     ./monitoring
260K    ./users
44K     ./nodes
12K     ./.ssh
45G     ./jobs
74M     ./war
8.0K    ./userContent
45G     .

其中users中存放了和Jenkins用户相关的配置信息;jobs中存放和Jenkins的任务相关的信息,包括构建历史、构建配置等等;在nodes中存放了Jenkins子节点的相关配置信息。这就意味着,Jenkins的Master的水平无状态扩展成为了不可能,虽然Jenkins支持的Master/Slave的架构,可以支持一台Master并发数百个Slave,但是单台的Server的可靠性与稳定性都面临巨大的挑战。面对这样的情形,社区的开发者们提出了2种解决的方案:

分片+冷备的Jenkins企业版HA方案

这个方案是Jenkins的最大维护公司Cloudbees提出的,Cloudbees开发并提供Jenkins的企业版的支持,提供Jenkins Cloud,面向公有云、私有云、大型企业用户提供付费的Jenkins服务。针对于大型企业Jenkins集群的场景,Cloudbees提出了如下的解决方案:
cloudbees-jenkins-platform.jpg
Cloudbees并非直接扩展Jenkins,而是在Jenkins的上层做了一个独立的系统,叫做Jenkins Operations Center(简称CJOC),CJOC是一个Jenkins集群的管理工具,是一个统一接入层,用户的身份认证(oauth或者ldap)在CJOC进行处理,然后分配到不同的Jenkins Master;集群的Slave节点资源池由CJOC进行分配;Master节点宕机,任务的重试由CJOC进行分发。可以说CJOC是Jenkins集群的资源、任务调度系统,不同的任务通过CJOC会调度到不同的Jenkins Master上。`
cluster-deployment.png
Jenkins Master在CJOC中是成对存在的,两个Master会通过共享存储的方式同步元数据信息,通过haproxy将两个节点挂载到一个虚拟IP下,当一个Jenkins Master宕机的时候,会再另外一台机器上启动起Jenkins Master实现宕机切换,原来在当前Master上运行的任务会通过CJOC再重新下发,分配到新的节点上。

采用Gearman插件实现伪Jenkins集群

Openstack项目使用Jenkins作为所有模块的持续集成方案,每天共计需要运行超过8000个JOB,而单个Master的方案无法满足自身的需求,因此Openstack的团队开发了一款Jenkins的Gearman插件,用来承载更多的任务,大致的架构图如下:
gearman_plugin_architecture2.png
Gearman插件是运行在Jenkins Master上的,此时Jenkins Master就可以看做一个Gearman的 worker。
gearman-flow1.png
Gearman插件会监听Gearman Server的事件,并将Gearman的Job转换为Jenkins的Job,并使用Jenkins Master的Slave进行Job的执行。也就是说Gearman并不是Jenkins的job的scheduler,而只是借助Jenkins的Slave的环境来执行任务。
51b5a79ad543428fdf33a1840928b266.png
Openstack团队通过Gerrit的自动触发,将任务触发给Gearman Server,Gearman Server将任务推送到消息队列中,在Jenkins Master中的Gearman worker监听到消息,通过Jenkins Job Builder,将项目转换为一个Jenkins Job,然后再下发到Jenkins的Slave中。

3d8e12d3e3ee7d0983d66b7e58b28ef2.png
如上图所示,Openstack的Jenkins集群方案之所以称为伪集群,是因为此时用户不是直接使用Jenkins来实现相关的功能,而是通过自动触发Gearman的方式将定制好的持续集成任务转换为Jenkins Job实现的。这种方式对于大多数开发者而言,搭建和改造的成本过大,而且缺乏页面的支持,对于很多业务繁多复杂的企业而言,是无法接受的。

对于大型的Jenkins集群而言,目前尚没有特别的好方案,特别是在高并发、多租户的场景下,Jenkins的集群SLA还是有很大的提升空间的。

性能

由于Jenkins采用xml文件的方式实现数据的存储,在long run的Jenkins项目中,需要持久化的数据是惊人的,而这也导致了单个Master可以创建的Job和长连接的Slave的数目受到了巨大的限制,下面是社区中开发者对Jenkins的性能测试的讨论。

  • Number of plugins.Plugins cause performance issues for builds (because of hooks) and UI (because they adds stuff to it). Do not add too many plugins and anyway - evaluate them thoroughly.
  • Number of jobs. Jenkins gets slow (at least in UI) with 1000+ jobs. Moving jobs to several masters (manual static sharding) helps. E.g. one master - for builds, another - for tests.
  • Number of slaves. There is “X1K initiative” - goal for Jenkins developers to assure smooth operation of master with 1000 executors on all slaves. It is still a challenge. Somewhere around 250 slaves and lots of builds slave connections start getting broken in the middle of a build.
  • Number of executors per slave. Increasing number of executors over the slave capabilities decreases overall throughput - due to clashes, IO congestion or RAM swapping. Leverage RAM, CPU cores and build type. RAM should be enough for maximum number of builds at maximum memory setting + file cache. CPU should be enough to work below 100% utilization, taking IO into account - IO releases some CPU time. Have less than 1 executor per CPU core for single-thread builds. Consider IOPS limit - to avoid disk IO being a bottleneck. Generally if 15 min Load Average more than the number of cores, the number of executors should be decreased. There is a suggestion - 1 executor per slave for isolation. It is reasonable in cloud but for dedicated hardware the same isolation can be achieved by lightweight containers.

    总结而言,Jenkins Master中需要尽可能少的加载插件,单个Master的Job数量最好不要超过1000,单个Master的Slave数目最好不要超过250个,每个slave上面的excutor需要更具项目来判断,设置合理的阈值。这些指标对于Jenkins而言有非常大的优化空间,这也是为什么本系列带大家一起学习Jenkins的原因。

扩展性

从某种意义来讲,Jenkins的扩展性是非常强的,支持非常多的扩展点,开发者可以通过扩展点开发插件来实现各种想要的功能,甚至Jenkins支持Jython或者Jruby的方式来扩展Jenkins。但是这样的灵活性是基于Jenkins的框架之上的。也就是说如果开发者想要去修改Jenkins core中的代码的时候,就要非常小心,因为有可能依赖的插件也同样扩展了core中的代码的扩展点,导致插件的不可用。而且插件和插件之间也是可以相互依赖的,这就导致了有可能开发者只是修改了一个扩展点中参数的类型,一连串的插件可能都无法使用。因此在扩展Jenkins的时候,尽可能的使用插件的方式会是更好的选择,可是插件越多Jenkins的性能损耗就越大,这就陷入了一个难以走出的循环泥淖,开发者需要抉择是选择性能,还是选择扩展的风险。

历史包袱

Jenkins本身的源码具有非常强大的扩展性,Jenkins拥有非常丰富的扩展点,基本上想要扩展的位置都可以通过扩展点的方式实现,这种强大的扩展性带来的好处是开发者可以快速的根据自身的需求来扩展相应的扩展点。但是权限开放的越大,就越难收回来,Jenkins从Hudson 2004年推出开始,在技术架构上面的演进一致被各种历史包袱掣肘着前进,Jenkins的设计放到今天来看也是先进的,但是在一些实现技术和代码的结构上可以发现非常明显的历史包袱和痕迹。自2011年Hudson改名为Jenkins,项目中时至今日,原来Hudson项目的源码还没有完全演进完毕,不得不说这对于想要深入学习、研究、修改Jenkins的开发者而言是一个巨大的挑战。

写在最后

虽然在本文中写了很多Jenkins的问题,但是这些问题大部分针对于希望扩展甚至改写Jenkins的开发者而言的,对于使用Jenkins的持续集成的开放者而言,Jenkins依然是目前最好的选择。在下一篇文章中,我们将正式开始从代码学习Jenkins。

相关文章:

python中的文档字符串(docString)

python中的文档字符串(docString) - 泥土 - 博客园python中的文档字符串(docString)Posted on 2009-02-19 15:27 泥土 阅读(2122) 评论(0) 编辑 收藏 Python有一个很奇妙的特性,称为 文档字符串 ,它通常被简称为 docstrings 。DocStrings是一个重要的工…

关于层的挡隔问题的探讨

原作者&#xff1a;我佛山人出处&#xff1a;5D多媒体1.被Flash挡住 设置Flash的参数&#xff1a;<param name"wmode" value"opaque"><object classid"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase"http://download.mac…

不是我放弃AI,是AI放弃了我!!

为什么程序员都觉得AI很难&#xff1f;Google 人工智能开发者专家彭靖田老师说——超90%的程序员在初学AI时&#xff0c;都会遇到下面3个问题&#xff1a;“应用方向太多了&#xff01;不知从何学起&#xff0c;也不知道学完做什么”“Python语法、机器学习/深度学习基础都能看…

Qt中两种定时器用法

在Qt中使用定时器有两种方法&#xff0c;一种是使用QObiect类的定时器&#xff1b;一种是使用QTimer类。定时器的精确性依赖于操作系统和硬件&#xff0c;大多数平台支持20ms的精确度。 1.QObject类的定时器 QObject是所有Qt对象的基类&#xff0c;它提供了一个基本的定时器。通…

有福了,J2EE面试题集锦(附答案)

一、基础问答 1.下面哪些类可以被继承? java.lang.Thread (T) java.lang.Number (T) java.lang.Double (F) java.lang.Math (F) java.lang.Void (F) java.lang.Class (F) java.lang.ClassLoader (T) 2.抽象类和接口的区别 (1)接口可以被多重…

从零开始学ASP.NET(基础篇)

原作者&#xff1a;蓝鲸出处&#xff1a;5D多媒体 学ASPNET与ASP有区别&#xff0c;这种区别不是语言上的&#xff0c;而是思路上的区别。ASP是纯面向过程的&#xff0c;而ASPNET是完全面向对向的。这种区别使我们在编程的结构设计上要与ASP有很大的不同。 废话少说了&#xff…

2 行代码,将 .NET 执行时间降低 87%!

作者 | STEVE GORDON译者 | 弯月&#xff0c;责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;长期以来&#xff0c;我一直在致力于提高性能&#xff0c;并且努力避免在关键代码路径中进行内存分配。例如…

Ansible基础一Playbook(二)

摘自&#xff1a;http://www.ansible.com.cn/docs/playbooks_intro.htmlHandlers: 在发生改变时执行的操作&#xff08;当发生改动时&#xff09;’notify’ actions 会在 playbook 的每一个 task 结束时被触发,而且即使有多个不同的 task 通知改动的发生, ‘notify’ actions …

sendmail服务器案例配置

Linux/UNIX下的老牌邮件服务器。Sendmail作为一种免费的邮件服务器软件&#xff0c;已被广泛的应用于各种服务器中&#xff0c;它在稳定性、可移植性、及确保没有bug等方面具有一定的特色&#xff0c;且可以在网络中搜索到大量的使用资料。 实验拓扑图&#xff1a; 注&#xff…

网页制作的中的一些工具代码

1. οncοntextmenu"window.event.returnvaluefalse" 将彻底屏蔽鼠标右键 <table border οncοntextmenureturn(false)><td>no</table> 可用于Table2. <body onselectstart"return false"> 取消选取、防止复制3. οnpaste"r…

神经网络其实和人一样懒惰,喜欢走捷径......

作者 | Jrn-Henrik Jacobsen, Robert Geirhos, Claudio Michaelis&#xff0c;深度学习研究专家译者 | Arvin&#xff0c;责编 | 夕颜出品 | CSDN&#xff08;ID:CSDNnews&#xff09;以下为译文&#xff1a;人工智能会很快取代放射科医生吗&#xff1f;最近&#xff0c;研究人…

nodejs获取ASP.Net WebAPI(IIS Windows验证)

处理了很多天&#xff0c;终于使用Nodejs可以发出请求至WebAPI&#xff0c;能够正常处理数据了 首先加入npm包 npm install httpntlm 在app.js中加入代码 var httpntlm require(httpntlm); var fs require(fs);var options {url: http://get001.mygroup.com/InstantNoodle_S…

ubb代码转化html代码

ubb代码转化html代码 public static string UbbDecode(string str){str HtmlEncode(str);str Regex.Replace(str, "/[url](?<url>.?)/[/url]", "<a href${url} target_blank>${url}</a>", RegexOptions.Compiled | RegexOptions.Ig…

如何定位EXC_BAD_ACCESS错误 (info malloc-history)

在 iphone 开发中使用内存时&#xff0c;我们经常会遇到 EXC_BAD_ACCESS 的错误。 出现这个错误的原因是我们访问了一个已经被释放掉的对象&#xff0c;如&#xff1a; implementation FeedbackViewController - (void)viewDidLoad {[super viewDidLoad];_scrollView [[UIScro…

一周内咸鱼疯转2.4W次,最终被所有大厂封杀!

&#xff08;含答案&#xff09;所有面试资料及技术好文精选文档都整理到网盘了。Java面试官手册需要加微信免费领取Java面试官手册需要加微信免费领取长按扫码或搜索微信号&#xff1a;gh16670101550&#xff0c;免费领取

java 基础知识三 java变量

1、作用域 {} 包围起来的代码称之为代码块&#xff0c;在块中声明的变量只能在块中使用 2、常量 就是固定不变的量&#xff0c;一旦被定义&#xff0c;它的值就不能再被改变。 3、变量 变量必须在程序中被定义&#xff08;或声明&#xff09;后才能使用&#xff0c;而且为每个变…

打通语言理论和统计NLP,Transformers/GNNs架构能做到吗?

作者 | Chaitanya K. Joshi译者 | 苏本如&#xff0c;责编 | 夕颜来源 | CSDN&#xff08;ID:CSDNnews&#xff09;我的工程师朋友经常问我&#xff1a;图深度学习听起来很棒&#xff0c;但是有没有实际应用呢&#xff1f;虽然图神经网络被用于Pinterest、阿里巴巴和推特的推荐…

艰辛的面向对象

为什么80%的码农都做不了架构师&#xff1f;>>> 所有的操作系统都不是面向对象的。 所有的操作系统都是基于函数的。ANDROID框架里面的好多类也是基于函数的。很多都是静态的方法。这个框架包括两个部分&#xff1a;一是JAVA部分&#xff0c;一是本地类。本地类不…

计算机网络第一课

1.IPv4与IPv6的区别是什么&#xff1f;在windows 7以上系统中&#xff0c;在设置本地IP地址的时候经常会看到同事含有IPV4协议项与IPV6协议项&#xff0c;并不同于以往windows xp系统中仅有TCP/IP协议项&#xff0c;不少朋友都觉得比较奇怪&#xff0c;询问编辑IPv4与IPv6的区别…

常用函数集农历函数

常用函数集农历函数原来是vb代码&#xff0c;重新整理为VB.NET版的&#xff0c;并在VS2003中编译通过Imports System.MathPublic Class UCnCalendarPrivate Structure SolarHolidayStructDim Month As IntegerDim Day As IntegerDim Recess As IntegerDim HolidayName As Strin…

微软发布代码智能新基准数据集CodeXGLUE,多角度衡量模型优劣

来源 | 微软研究院AI头条编者按&#xff1a;代码智能&#xff08;code intelligence&#xff09;目的是让计算机具备理解和生成代码的能力&#xff0c;并利用编程语言知识和上下文进行推理&#xff0c;支持代码检索、补全、翻译、纠错、问答等场景。以深度学习为代表的人工智能…

Spring从菜鸟到高手(四)(上)使用JdbcTemplate类实现用户登陆验证、批量更新

标签&#xff1a;Spring java JdbcTemplate Spring从菜鸟到高手 绝缘材料原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://tonyaction.blog.51cto.com/227462/42042看了我前面几篇文章的朋…

CSS盒模型及边距问题

盒模型是CSS的基石之一&#xff0c;页面的每一个元素都被看作一个矩形框&#xff0c;分别由外边距&#xff0c;边框&#xff0c;内边距&#xff0c;内容组成&#xff0c; 在CSS中&#xff0c;width和height的值指的是内容的宽高&#xff0c;增加外边距&#xff0c;边框&#xf…

区分C语言中getch、getche、fgetc、getc、getchar、fgets、gets

首先&#xff0c;这两个函数不是C标准库中的函数&#xff0c; int getch(void) //从标准输入读入一个字符&#xff0c;当你用键盘输入的时候&#xff0c;屏幕不显示你所输入的字符。也就是&#xff0c;不带回显。 int getche(void) //从标准输入读入一个字符&…

无限想象空间,用Python玩转3D人体姿态估计

前言姿态估计&#xff0c;一直是近几年的研究热点。它就是根据画面&#xff0c;捕捉人体的运动姿态&#xff0c;比如 2D 姿态估计&#xff1a;再比如 3D 姿态估计&#xff1a;看着好玩&#xff0c;那这玩应有啥用呢&#xff1f;自动驾驶&#xff0c;大家应该都不陌生&#xff0…

Mac中将delete键定义为删除键

在Mac中&#xff0c;delete键实际是退格键&#xff08;Backspace&#xff09;&#xff0c;fndelete才是删除键。这也是从Windows转到Mac时不习惯的地方之一。 通过安装DoubleCommand软件可以解决这个问题。安装后&#xff0c;在System Preferences中找到DoubleCommand找打开在E…

CHIL-SQL-MIN() 函数

MIN() 函数 MIN 函数返回一列中的最小值。NULL 值不包括在计算中。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name 注释&#xff1a;MIN 和 MAX 也可用于文本列&#xff0c;以获得按字母顺序排列的最高或最低值。 SQL MIN() 实例 我们拥有下面这个 "Orders&quo…

Google排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风

毋庸置疑&#xff0c;Python越来越被认可为程序员新时代的风口语言。无论是刚入门的程序员&#xff0c;还是年薪百万的 BATJ 的大牛都无可否认&#xff1a;Python的应用能力是成为一名码农大神的必要项。 所以&#xff0c;很多程序员把Python当做第一语言来学习。 但对于Python…

CSS滤镜详解

CSS滤镜详解 简介〓 设置文字透明层次&#xff0c;模糊效果&#xff0c;给文字加光晕等这些本来要靠图片才能处理的效果&#xff0c;现在CSS可以既简单又快速的把它实现了……接着往下看就知道了。 〓正文〓 语法&#xff1a;STYLE"filter:filtername(fparameter1, fpa…

php实现单链表

<?php //单链表的存储结构 class Node{ public $data;//数据域 public $next;//指针域 指向下一个结点 function __construct(){ $this->data null; $this->next null; } } //单链表数据类型 class LinkList{ public $data; public $next; function _…