您当前的位置:首页 > 互联网教程

Jenkins使用痛点小析

发布时间:2025-05-22 03:41:30    发布人:远客网络

Jenkins使用痛点小析

一、Jenkins使用痛点小析

Jenkins刚开始搭建的时候,我们惊叹,这也太方便了吧?功能还这么强,慢慢的,我们会发现对方的缺点了,嗯,恋爱的味道,不对,似乎扯远了,还是说回来 Jenkins了。

我们很难想象 Jenkins,这么庞大的一个应用,居然没有数据库。那配置在哪保存呢?运行日志了?构建数据了?等等这些都是需要保存的啊。

当jenkins job数量达到一定量级,访问量大时候,会非常卡顿,仿佛回到了零几年的时候,网页那么卡。

查原因我们会发现瓶颈在 I/O。因为jenkins每次访问,都需要读取配置,都需要读写日志,这些都是以文件方式写入磁盘的,是所有slave节点和一台master通信。

可是我们是没有办法做负载均衡的

当我们部署后端服务时候,肯定做 LB(负载均衡), Jenkins master因为只能单节点,啊,挂了master,所有slave都掉链子了。

配置存储 master节点磁盘,嗯,还好,比较小

构建日志存储在master节点磁盘,这个,百万行代码的编译日志几百M大小,每天N个业务构建M次,存储在master,哈哈,每天上班第一件事清磁盘?

构建产物存储在master节点磁盘,这个,占磁盘,不安全

针对这种情况了,日志用 ELK,产物放到到对象存储

调度,一个好高深的话题,教材上学过操作系统对进程的各种调度算法,什么先入先出,最短耗时,最高优先级(PRI,NI)等等,而类似的集群调度, k8s可能是最常见的了,但是 Jenkins对于任务调度这块,实际来讲,确实很弱,虽然调度也是 Jenkins的核心能力之一

k8s里面有 node节点概念, Jenkins也有

k8s里面有 pod概念, Jenkins没有,类似的, Jenkins是限制 node的最大并行个数

k8s里面有调度器,进行 Predicates和 Priorities两个过程, Jenkins算法很简单,默认就是调度到最近一次成功节点上。

这样会带来一个比较严重的问题,会导致部分机器处于极度打满,部分机器确空转,资源利用率严重两级分化。

针对这点,我们其实有两种小的补救。

一种是降低node节点并行数量,比如原来是最大限制是10,下降到2后,第三个任务,比如调度另一个节点了,缺点就是可能造成更多排队情况

一种就是利用插件了,比如插件 throttle-concurrents会比较均匀分配

总体而言,调度这块,Jenkins确实有很长路走

微服务相比单体应用似乎高大上了很多,我们把服务抽象出来,只专注于某一部分,然后各个部分串联起来。

Jenkins里面,一次构建,我们可能会写一个长长的脚本,举例子来说,我们需要构建一个移动端产物apk/ipa,我们需要

clone code->更新依赖库->编译->产物保存->分发到商店

传统上,我们可以把这一串代码都写到 job配置里面,但更好的做法,我们是把每一步抽象出来,每一步都是一个服务(一个job)

怎么串联起来呢?没有流水线之前,是 Jenkins上下游任务关联,哈哈,当任务量多了,我们发现,调用链很难捋清楚了,当然微服务里面有自己的解决办法-链路追踪,网关

流水线,可以帮我们把这些串联起来,我们最后需要管理的只是流水线

二、如何修改jenkins配置权限

安装插件后,进入系统设置页面,配置如下:

官网上安全域设置为Servlet容器代理,实际操作发现Jenkins专有用户数据库也是可以的。

在系统管理页面点击Manage and Assign Roles进入角色管理页面:

选择该项可以创建全局角色、项目角色,并可以为角色分配权限。

如上图,分别创建了admin、anonymous两个全局角色,Online Program、test两个项目角色。

项目角色与全局角色的区别就是,项目角色只能管理项目,没有管理jenkins的权限配置。

添加项目角色时,需要制定匹配项目的模式,如上图中的Pattern,官方文档介绍该选项支持正则表达式,如“Roger-.”表示所有以Roger-开头的项目,“(?i)roger-.*”表示以roger-开头的项目并且不区分大小写,如以ABC开头的项目可以配置为“ABC|ABC.*”,也可以使用“abc|bcd|efg”直接匹配多个项目。

在分配角色之前需要先创建用户。

在系统管理页面,点击管理用户:

点击新建使用者可以创建新用户,如果之前有项目与scm版本管理系统(如svn、git等)连接并获取源码构建过,jenkins会从svn中读取到一些用户信息,可以在查看用户菜单中看到这些用户:

点击用户id或名称都可以修改用户信息。

选择Assign Roles可以为用户分配所属角色,可以分配全局角色和项目角色。

如上图,将不同的用户分别分配给不同的角色,这样用户就可以具有角色所拥有的权限。

该插件从2011年10月发布1.1.2版本后就不再维护了,因此会有一些小问题,但不影响使用,比如在分配角色后点击保存按钮时有可能会发生异常,浏览器点击后退按钮后重新提交就可以操作成功。

另外如果配置失败导致不能登录,可以通过修改配置文件恢复初始设置。

进入jenkins安装目录,用户配置信息和角色配置信息都以配置文件的形式存储。

上图中users目录存放了各个用户的配置信息,每个用户都会创建与用户名相同的文件夹,文件夹中包含config.xml文件,配置示例如下:

<?xml version='1.0' encoding='UTF-8'?>

<fullName>admin</fullName>

<jenkins.security.ApiTokenProperty>

<apiToken>EfowsOP9H5arYxMmuFrbPjjITgu/fjtvHib5okFJ9DmPTu/088cvHxlE9RHwVv+S</apiToken>

</jenkins.security.ApiTokenProperty>

<hudson.model.MyViewsProperty>

<owner class="hudson.model.MyViewsProperty" reference=".."/>

<filterExecutors>false</filterExecutors>

<filterQueue>false</filterQueue>

<properties class="hudson.model.View$PropertyList"/>

</hudson.model.MyViewsProperty>

<hudson.search.UserSearchProperty>

<insensitiveSearch>false</insensitiveSearch>

</hudson.search.UserSearchProperty>

<hudson.security.HudsonPrivateSecurityRealm_-Details>

<passwordHash>uAEYii:02e0cd0d78abf90e42b28e7d3d4fe64776ae8fa9500e379f2598cc65e1b0fb70</passwordHash>

</hudson.security.HudsonPrivateSecurityRealm_-Details>

<hudson.tasks.Mailer_-UserProperty>

<emailAddress>gaoliang@esrichina.com.cn</emailAddress>

</hudson.tasks.Mailer_-UserProperty>

三、MATLAB 项目-Jenkins持续集成工作流

1、设置 MATLAB项目以实现持续集成及使用 Jenkins的步骤如下:

2、先决条件包括安装 Jenkins、MATLAB插件、将项目置于 Git存储库中并在 GitHub上共享。

3、在 Jenkins中创建新项目,配置存储库 URL、构建触发器、构建环境、测试运行等。

4、为实现持续集成,配置 Jenkins项目以进行构建、测试运行、缓存和存档依赖项分析。

5、使用 Jenkins进行依赖项缓存和影响分析,设置缓存文件以减少测试运行时,通过增量影响分析仅运行受影响的测试。

6、增强工作流程可包括共享 SLXC文件以加快仿真速度、使用数据库或存储库管理工具管理缓存文件、自动检索关联的依赖项缓存文件。

7、通过以上步骤,可以高效地实现 MATLAB项目的持续集成,提高开发效率与代码质量。