基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

作者 | 刘春明,责编 | Carol

出品 | CSDN 云计算(ID:CSDNcloud)

封图 | CSDN下载于视觉中国

目前公司为了降低机器使用成本,对所有的AWS虚拟机进行了盘点,发现利用率低的机器中,有一部分是测试团队用作Jenkins Slave的机器。这不出我们所料,使用虚拟机作为Jenkins Slave,一定会存在很大浪费,因为测试Job运行完成后,Slave 处于空闲状态时,虚拟机资源并没有被释放掉。

除了资源利用率不高外,虚拟机作为I Y ] O RJenkins Slave还有其他方面的弊端,比如资源分配不均衡,有的 Slave 要运行的 job/ 7 h ) @ X r P ~ 出现排队等待,而有的 Slave 可能正处于空闲状态。另外,扩容不方便,使用虚拟机作为Slave,想要增加Jenkins Slave,, E q o u m ? F 8需要手动挂载虚拟机到Jenkins Ma~ [ x I B 0 q [ster上,并给Slave配置环境,导致管理起来非常不方便,维护起来也是比较耗时。

在2019年,运维团队搭建了Kubernetes容器云平台。为了实现公司降低机器使用成w K C u = e本的目标,我E V P 4 u ? T所在的车联网测试团队考虑将Jenkins Slave全面迁移到Kuber @ X b @ 8 Knec J ; z ] O &tes容1 * H 4器云平台。主要是想提高Jenkins Slave资源利用率,并且提供比较灵活的弹性扩容能力满足越来越多的测试Job对Slave的需求。

本文就是我们的实践总结。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

整体架构

我们知道Jenkins是采用的Master-Slave架构,Master负责管理Job,Slave负责运行Job。在我们公司Master搭建在一台虚拟机上,Slave则来自KX : A U yubernetes平台,每一个Slave都是KuZ R dbernetes平台中的一个Pod,Pod是Kubernetes的原子调u V T V F度单位,更多Kubernetes的基础知识不做过多介绍,在这篇文章中,大家只要记住Pod就是Jenkins Slave就行了。

基于 Kubernetes 搭建的 Jenkins S} u | D s 7 q ? Wlave 集群示意图如下。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

在这个架构中,Jenkins Master 负责管理测试Job,为了能够利用Kubernetes平台上的资源,需要在Master上安装Kubernetes-plugin。

Kubernetes平台负责产生Pod,用作Jenkins Slave执行Job任务。当Jenkins MasteT I : gr上有Job被调度时,JenkiE = . G h } Zns Master通@ M h过Kubernetes-plugin向KuberY @ Bnetes平台7 b u X 9 3 v t L发起请求,请Kubernetes根据Pod模板产生对应的Pod对象,Pod对象会向Jenkins Master发起JNLP请求,以便连接上Jenkins Master,一旦连接成功,就可以在Pod上面执行Job了。

Pod中所用的容器镜像则来自Harbor,在这里,一个Pod中用到了三个镜像+ b 6 / u,分别是Java镜像Python镜像JNLP镜像。Java镜像提供Java环境,可用来进行编译、执行Java编写的b r d j J !测试代码,Python镜像提供Python环境,用来执行Python编写的测试代码,JNLP镜像是Jenkins官方提供的Slave镜像。

使_ C B |用Kubernetes作为Jenkins Slave,如何解决前面提到的使用虚拟机时的资源利用率低、资源分配不% 9 Y c k均的问题,并且实现SlG i B ) ] ^ave} h - c A动态弹性扩容的呢?

首先,只有在Jenkins Master有Job被调度时,才会向Kubernetes申请Pod创建Jenkins Slave,测试Job执行完成后,所用的Slave会被Kubernetes回收。不会像虚拟机作为Slave时,有Slave闲置的情况出现,从I S 8 5 / X (而提高了计算资源的利用率。

其次,资源分配不均衡的主要问题在于不同测试小组之间,因为测试环境和依赖不同而不能共享JeG } N 2 Ankins Slave。而Kubernetes平台打破了共享的障碍,只要Kubernetes集群v * o h S Y T R中有计算资源P N I O O ],那么就可以从中申C 0 T请到适合自己项目的Jenkins Slave,从而不再会发生Job排队的现象。

借助Kubernetes实现Slave动态弹性扩容就更加简单了。因为Kubernetes天生就支持弹性扩容。当监控到KuberneG R P r Ites资源不够时,只需要通过运维r j j平台向其中增加Node节点即可。对于测试工作来讲,这一步完全是透明的。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

配置Jenkins Master

要想q G B = V p利用Kubernetes作为Jenkins Slave,第一X D 2 H y步是在Jenkins Master上安装Kubernetes插件。安装方法很简单[ t q Y ` E,用Jenkisn管理员账号登录Jenkins,在Manage Plugin页面,搜索Kubernetes,勾选并安装即可。

接下来就是在Jenkins Master上配置Kubernetes连接信息。Jenkins Mastz Q Q `er连接Kubernetes云需要配置三个关键信息:名称l _ . C C ?E & O w ` B :证书。全部配置信息如下图所示。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

名称将会在Jenkins Pipeline中用到,配置多个Ku) 5 ibe= S R H % n r 5 crnetes云时,需要为每一个云h d S _ B U t p都指定一个不同的名称。

Kubernetes地址指的是Kubernetes API server的地址,Jenkins Master正是通过Kubernete B g F ; j 8es plugin向这个地址发起调度Pod的请求。

Kubernetes服务证书key是用来与Kubernez 7 |tes API server建立连接的,生成方法是,从Kubernetes API server的/root# K & u/.kube/config文件中,3 ? % . k * . h $v Y : | - 5 %取/root/.kube/config中 + = 9 ^ 1certificate-authority-data的内容,并转化成base64 编码的文件即可。

# echo ce3 j n U V f 5 N crtificate-authX V B O 1ority-data的内容 | base64 -D > ~/ca.crt

ca.crt的内容就I : 1是Kubernetes服务证书key。

上图中的凭据,是使用客户端的证书和key生成的pxf文件。先将/root/.kube/config中client-certificate-data和client-key-data的内容分别转化! | P b U ! % 5 ;成base64 编码的文# [ Q 9 ] + 1 `件。

# echo client-certificate-data的内容 | baseD * u N k64 -D > ~/client.crt# echo client-key-data的内容 | bas7 p 9 ve64 -D > ~/client.crt

根据这两个J i 文件制作pxf文件:

# openssl pkcs12 -export -out ~/cert.pfx -inkey ~/client.key -in6 ! W ? s D 5 S ~/client.crt -certfile ~/ca.crt

# Ent5 p 8 H jer Exporo n r / -t Password:

# Verifying - Enter Export Passwor2 2 } p h _ ~d:

自定义一个password并牢记。

点击Add,选择类型是Cetificate,点击Upload certifi3 # n P E = Hcate,选取前面生成cert.pfx文件,输入生成cert.pfx文件时的密码,就完成了凭据的添加。

接着再配置H [ 8 V O Q一下Jenkins URL和同时可以被调度的Pod数量。

配置完毕,可以点击 “Test Connection” 按钮测试是否能够连接到 Kubernetes,如果显示 Connection test successful 则表示连接成功,配置没有问题。

配置完Kubernetes插件后] d h y - 8 r,在Jenkins Ma, g & d Y a 9 5ster上根据需要配置一些公共工具,比如我这了配置了allure,用来生成报告。这样在Je? 1 Wnkins Slave中用到这些工具时,就会自动安装到Jenkins Slave中了。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

定制Jenkins Pipeline

配置完成Kubernetesk W 6 { @ h连接信息后,就可V i = B L c D以在测试Job. H 5 h o ~ e的Pipeline中使用kubernetes作为agent了。与d p K q @ F _ 2使用虚拟机作为K V z $ + 6 k K 0Jenkins Slave的区别主要在于pipeline.agent部分。下面代码是完整的Jenkinsfile内容。

pi~ I 0 Z ! Y gpeline {; y A N P $ ` [

agent {

kubernetes{8 m n x x

cloud \'kubernetes-bj\l P 7 ] | % j Q' //Jent + }kins Master上配置的Kuberneteq x O a C = E ! *s名称

label \'SEQ-AUTOTEST-PYTHON36\' //Jenkins slave的前缀

defaultContainer \'python36\' // stages和post步骤中默认用到的container。如需指定其他container,可用语法 con8 6 $tainer9 5 M * w B g ?(\"jnlp\"){...}

idleMinutes 10 //~ : [ Xa C U创建的pod在job结束后的空闲生存时间

yamlFile \"jenkins/jenkins_pod_template.yaml\" // p7 y n T $ L Qod的yaml文件

}

}

environment {

git_u( U m s D Z Url = \'git@github.com:liuchunming033H , | W f Z n u/seq_jenkins_template.git\'

git_key = \'c8615bc3-c995-40ed-92ba-d5b66\'

git_branch = \'master\'

email_list = \'lN i n V r ` 7iuchunming@163.com\'

}

options {

buildDi. M h 0 - Z G | mscarder(logRotator(numToKeepStr: \'30\')) //保存的jobQ n p v & / ^ {构建记录总数

timeout(time: 30,E % e ? M p b q y unit: 0 , 5 U @ ` S X\'MINUTES\') //job超时时间

disableConcurrentBuild= - A *s //不允许同时执行流水线

}

stages {

stage(\'拉取测试代码\'* t Q e y T # $ D) {

steps {

git branch: \"${git_branch}\", credentialsId: \"${git_key}\", url: \"${git_url}\"

}

}

stage(\'安装测试依赖\') {

steps {

sh \"pipenv install\"

}

}

stage(\'执行测试用例\') {

steps {

sh \"pipenv run py.test\"

}

}

}

post {

always{

container(\"jnlp\"){ //在jnlp container中生成测试报告

allure includeProperties e Q: false, jdk: \'\', report: \'jenkins-allure-re2 V 6 d mport\', r3 r 5 besults: [[path: \'allure-re{ T 3 |sults\']]

}

}

}

}B } - ~ I T c u U

上面的Pipeline中,与本文相关的核心部分是agent.kubernetes一段,这一段描述了如何在kubernetes 平台生成Jenkins Slave。

clj Y i ^ f Youd,是JenkP A j -ins Master上配H 3 X置的Kubernetes名称,用来标识当前的Pipeline使用的是哪一个K] q wubernetes cloud。

label,是Jenkins Slave名称的前缀,用来区分不同的Jenkins Slave,当出现异常时,可以根据这个名称到Kubernetew ` W $ : _ s cloud中进行debug。

defaultContainer,. D f 2 y Y | 5在Jenkins Slave中我定义了是三个container,在前面有介绍。defaultContainer表示在Pipeline中的stages和post阶段,代码运行的默认container。也就是说,如果在stages和post阶段不指定container,那么代码都是默认运行在defaultCont} T q ! jam K u *iner里面的。如果要用其他的container运行代码,则需要通过类似container(“jnlp”){…}方式来指定。

id} C { p B f h 0leMinutes,l 4 N k w m定了Jenkins Slave上运行的测试job结束后,Jenkins S+ % k f .lave可以保留的时长。在这段时间内,Jenkins SlR ^ k ? ` A Lave不会被Kuberneq , x L Rt! ` B p T * kes回收,这段时间内如果有相同label的测试Jo] b h : p _ j Cb被调度,那么可以继续使用这个空闲的Jenkins SlaveQ : # y h y s - (。这样做的目的是,提高Jenkins Slave的利用率,避免Kubernetes进行频繁调度,因为成功产生一个Jenkins Slave还是比较耗_ E z x c )时的。

yamlFile,这个文件是标准的Kubernetes的Pod 模} K I n P a g F X板文件。Kubernetes根据这个文件产生Pod对象,用来作为Jenkins Slave。这个. m [文件中定义了三个容器(Container)以及调度的规则和外部存储。这个文件是利用Kubernetes作为Jenkins Slave集群的核心文件,下面将详) + B G U ? | 5细介绍这个文件的I } ? v Y e内容。

至此,测试Job的Pipeline就建立好了。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

定制Jenkins Slave模板

使用虚拟机作为Jenkins Slave时,如果新加入一台虚拟机,我们需要对虚拟机进行初始化,主要是安装工具软件、依赖包,并连接到Jenkins Master上。使用Kubernetes cloud作为B 8 # Z q u fJenk, 2 lins Slave集群也是一样,要定义Jenkins Slave使用的操作系统、依赖软件和外部| 3 r H磁盘等信息N 0 o。只不过这些信息被写在了一个Yaml文件中,这个文件是KZ Y 2 ) 9 :ubernetes的Pop J O jd 对象的标准模板文件。Kubernetes会自根据这个Yaml文件,产生Pod并连接到Jenkins Master上。

这个Yaml文件内容如下:

apiVersion: v1

kind: Pod

metadata:

# ① 指定 Pod 将产生在Kubernet- A f ! 8 7 B * Pes的哪个namespace下,需要有这个namespace% ! M T # t @ i Q的权限

namespace: sqe-te, | H , 2 J X i Lst

spec:

containers:

# ② 必选,负责I } % R U连接Jens 3 K u 0 P HkE w Q ( ; u sine @ S 6 ; ss Master,注意name一定要是jnlp

- name: jnlp

image: swc-harbor.nioint.com/sqe/jnlp-slave:root_user

imagePullPolicy: Always

# 将| % $ T @ tJenkins的WORKSPACE(/home/jenkins/agent)挂载到jenki= y p 5 v ]ns-slave

volumeMounts:

- mountPath: /home/jenkins/agent

name: je! r j [nkins-slave

# ③ 可选,python36环境,已安装pipenv,负责执行python编写的测试代码

- name: python36

image: swc-harbor.nioint.com/sqe/automation_python36:v1

imagePullPolicy: Alwaj l @ i Pys

# 通过cat命令,让这个container保持持续运行

command:

- catz 2 p c / } 1

tty: true

env:

# 设置pipenv的P u P { % K虚拟环境路径变o - 5 R 9量 WORKOl M ! v N n l Z .N_HOME

- name: WORKON_HOME

value: /home/jenkins/agent/.local/share/virtualenvs/

# 创建/homk t & T - {e/jenkins/: M I Pagent目录并挂载到jenkins-slaved - z 0 f Volume上

volumeMounZ m S 1ts:

- mountPath: /home/jenkins/agent

name: jenkins-slave

# 可以对Pod使用的资源进行限定,可调。尽量不要用太多,够用即可。

resources:

limits:

cpu: 300m

memory: 500Mi

# ④ 可选,Java8环境,已安装maven,负责执行Java编写的测试代码

- name: java8

image:r B 6 x * V F sB Z P w @ q 7 N wc-harbor.nioint.com/sqe/automation_java8:v2

imagePuX @ B M M +llPolicy: Always

command:

- cat

tty: true

volumem h ( _ ` , % =Mounts:

- mountPath: /home/jenkins/agent5 : f p x L

name: jenkins) t =-slave

# ⑤ 声明一个名称为 jenkins-slave 的 NFS Volume,多个container共享

volumes:

- name: jenkins-slac u z qve

nfs:

path: /data/je* k p 1 nnkins-slave-nfs/

server: 10.125.234.64

# ⑥ 指定在Kubernetes的哪些Node节点上产生Pod

nog t 0 / -deSelector:

node-app: normal

node-dept: sqe

通过上面的Yaml文件,可以看到通过 spec.containers 在Pod中定义了三个容器,分别是负责连接Jenkins Master的jnlp,负责运行Python代码的pythonB y f #36,负责运行Java代码的java8。我们可以把Jenkins Sla2 8 L jve比喻成豆荚,里面的容器比喻成豆荚Y z j E k m Q中的豆粒,每颗豆粒具有不同的职责。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

同时,还声明了一个叫作jenkins-slave 的volume,jnlp 容器将Jenkins WORKSE % RPACE目录(/home/jenkU l vins/agent )mount到n O T 0 D G oju & b ! n { ( venkins-slave 上。同时python36和java8这两个容器也将目录/home/jenkins/agent mount到jenkins-slave 上。从而,在任何一个容器中对/home/jenkins/agent 目录的修改,在其他两个容器中都能读取到修改后的内容。挂载外部存储的主要好处是可以将测试结果、虚拟环境持久化下来,特别是将虚拟环境持久化下来之后,不用每次# _ 8 8 m o K执行测试创建新的虚拟环境,而是复用已有的t g c [ 4 b z虚拟环境,加快了整个测试执行的过程。

另外,还指定了使用kubernetes的哪一个NamespaX y L _ {ce命名空间以及在哪些Node5 J X节点上产生Jenkins Slave。关于这个Yaml文件的其他细节说明,我都写在了文件的注释上,大家可以参考着理解。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

定制容器镜像

前面介绍了Jenkins Slave中用到了三个容器,Q 4 q a a下面我们分别f a i R _来看下这三个容器的镜像。

首先,DockerHub(https://hub.docker.com+ [ ( h S `/r/jenkinscS a i & 5i/jnlp-slau Q _ Pve)提供了Jenkins Slave的官方镜像,我们这里将官方镜像中的默认用户切换成root用户,否则在执行测试用例时,可能会出现权限问题。JNLP容器镜像的Dockerfile如下:

FROM jenkinsci/jnlp-slave:latest

LABEL maintainer=6 0 + K S u O J\": p z fliuchunming@163.com\"

USER root

Python镜像是在官方的Python3.6.4镜像中安装了pipenv。因为我们团队目前的Python项目都是用pipenv管理项目依赖的。这里说一下,pipenv是pip的升级版,j B ) r ; w它既能为你项目创建独立的虚拟环境,还能够自动维护和管理项目的依赖软件包。与pip使用requirements.txt管理依赖不同,pipenv使用Pipefile管理依赖,这里的好处不展- @ N O X开介绍,有兴趣的朋友可以查看一下pipenv的官方文档https://github.com/pypa/pi) I Gpenv。Python镜像的Dockerfile如下:

FROM python:3.6.4

LABEL maintainer=\"xG B O _ 8 ) Z Mxx@163.com\"

USER root

RUN pip install --upgrade pi* D 0 qp

RUN pip3 install pipenv

Java镜像是根据DockerHub上的maven镜像扩展来的。j 9 N j $ p 8 c U主要改动则是将公司内部使用的maven配置文件settings.xml放到镜像里面。完整的Dockerfile如下:

FROM maven:3.6.3-jdk-8

LABEL maintainer=\"xxx@l ~ d163.com\"

USER root

#/ 9 j o X Z X % r 设置系统时区为北京时间

RUN mv /etc/localtime /etc/localtime.bak && \\

ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &? 3 A M G O;& \\

echo \"Asia/Shanghai\" >Q M 9 @ ^ U i &; /etcO Z _ l i 9 h I ?/timezone # 解决JVM与linux系统时间不一致问题

# 支持中文

RUN apt-get update && \\

apt-get install locales -y &a^ M N v / omp;& \\

echo \"zh_CN.UTF-8 UTF-8\" > /etc/locale.gen && \\

locale-gen

# 更新资源地址

ADD settings.xml /root/.m2/

# 安装jab m Y # t dcococlir G ; 3 x # U

COPY jacoco-plugf n , M q @ V ain/jacococli.jar /usr/bin

RUN chmod +x /usr/bin/jacococli.jar

制作完容器镜像之后,我们会将其push到公司内部的harbor上,以便kubernetes能够快速的拉取镜像。大家可以根据自W 9 U己实际情况,按照项目需求制作自己的容器镜像。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

执行自动化测试

通过前面的步骤,我们使用Kubernetes作为Jenkins Slave的准备工作就全部完成了。接下来就是执行测试Jw c 2ob6 h x ` { c ! % F了。与使用虚拟机执行测试Job相比,这一步其实完全相同。

创建一个Pipeline风格的Job,并进行如下配置:

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

配置完成后,点击Build就可以开始测试了。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

性能优化

跟虚拟机z F L |作为JenkO A T G , Z + I 5ins Salve不同,Kubernetes生成Jenkins Slave是个动态创建的过程,因为是动态创建,就涉及到效率问题。解决效率问题可以从两方面入手,一方面是尽量利用已有的Jenkins Slave来运行测试Job,另一方面是加快产E n w Z生Jenkins Slave的效率。下面我们分别从这两方面看看具体的优化措施。

7.1 充分利用已有的Jenkins Slave

充分利用已有的Jenkins Sy 1 k 3 wlave,可以从两方面入手。

一方面,设置idleMinutes让Jenkins Slave在执行完测试Job后,不要被立即消毁,而是可以空闲一段时间,在这段时间内如果有测试Job启动,则可以分配到上面来执行,既提高* j U z 6 Y j了已有的Jenkins Slave的利用率,也避免创建Jenkins Slave耗费时间。

另一方面,在更多的测试Job流水线中,使用相同的label,这样当前面的测试Job结束后,所使用的JenkinsP d ; * N Slave也能被即将启动的使用相同lable的测试Job所使用。比如,测试job1使用的jenkins Slave 的lable是

DD-SEQ-AUTOTEST-PYT| W 4 HON,那么当测试job1结束后,使用相同lable的测试job2启动后,既可以直接使用测试job1使用过的Je_ u D y Z ! O $ bnkins Slave了。

7.2 加快Jenkins Slave的调度效率

Kubernetes上产生x n `Jenkinn 6 { ? W P y Hs Slave并加入到Jenkins MX ) v 1 r l V kaster的完整流程是:

  • Jenking r Is Master计算现在的负载情况;

  • Jenkins Masc & , * Yter根据负载情况,按需通过Kub) a j u kernq n 1 ( P e O uetes Plugin向KubeV D , `rnetes APb g 8 s N z o ^ 0I server发起请求;

  • Kubernetes API server向Kubernetes集群: q i * F 4 g调度Pod;

  • Pod产生后通过JNLP协议自动连接到JP { i c g kenkins Master。

后三个步骤都是很快的,主要受网络影响。而第一个步骤,Jenkins Master会经过一系列算法计算之后,S Y [ A P Q发现没有可用的Jenkins Slave才决定向Kubernetes API server发起请求。这个过程在Jenkins Master的x l a 4默认启动配置下是不高效的。经常会导致一个新的测试Job启动后需要等一段时间,才开始在Kubernetes上产生Pod。

因此,需求* H y , 2 g 6 k ;对Jenkins Master的启动项进行修改,Q 3 v 5 z [主要涉及h 3 f ( x以下几个参数:

-Dhudson[ c _ h ! b % 7.model.LoadStatistics.clock=2000

-Dhudson.slaves.NodeProvisioner.recurrencePer8 p : : l 7 Niod=5000

-Dhuq * 1 ^ q . ,dson.slaves.NodeProvisioner.initn j ialDelay=0

-f 2 9 D $ [ XDhudson.model.LoadStatistics.decay=0.5

-Dhudson.slaves.NodeProvisioner.MARGIN=50

-Dhudson.slaves.NodeProvis? 6 v + ioner.MARGINs z H ! 2 I 50=0.85

Jenkins Master每隔一段时间会计算集群负载,时间间隔由hudsz 1 K o u Y |on.model.LoadStatistics.clock决4 [ i W 9 p ,定,默认是1k : Z0秒,我们将其调整到2秒,以加快 Master计算T @ ; : 5 T m @集群负载的频率,从而更快的知道负载的变化情况。比如原来最快需要10秒才知R W ( } ? Q $道目前有多少job需要被调度执C 5 9 H 6行,现在只需要2秒。

当Jenkins Maste, T B K d { gr计算得到集群负载后,发现J ( s z 1 t没有可用的Jenkins Slave。Jenkins master会通知Kubernetes Plugin的NodeProvin ) ^sioner以recurrencePeriod间隔生产Pod。因此r4 B % 3 L o !ecurrencePeriod值不能比hudson.4 x x ~ K 3model.LoadStatisticz I ts.cloA v L , ^ 2ck小,否则会生成多个Jenkins slave。

initialDelay是一个延迟时间,原本用于确保让静态的Jenkins Slave和Master建立起来连接,因为我们这里{ t 5 Y , Y T j v是使用Kubernetes插件动态产生Jenkins slave,没有静态Jenkins Slave,所以我们将参数设置成0。

hudson.model.LoadStatistiV K / I $cs.decay这个参数原本的意义是用于抑制评估mastG x c ? U ] # Ter负载的抖动,对于评估得到的负载值有很大影响。默认decay是D i K r 8 / D 90.9。我们d y $ 8 ! R把decay设成了0.5,允许负载有比较大的波动,Jenkins Master评估的负载就是在当前尽可能真实的负载之上,评估的需要的Jenkins Slave的个数。

hudson.slaves.NodeProvisioner.MARGIN 和hudson.slaves.NoI R 0 f c [deProvisioner.MARGIN0,这两个参数使计算出来? ~ [ U ! 8的负载做整数向上对齐,从而可能多产生一个Slave,以此来提高效率。

将上面的参数,加入到Jenkins Mater启动进程上,重启Jenkins Master即生效。

java -Dhudson.model.LoadSta3 | I ? L M + otistic5 ^ u e ^ + w xs.clock=2000 -Dxxx -jar jenkins.war

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

总结

本文介绍了使用Kubernetes作为持续集成测试环境的优势,并详细介绍了使用方法,对其性能也进行了优化。通过这个方式完美解决虚拟机作为Jenkins Slave的弊端。

1 5 N 7 I k ~ F了自动化测试l i z Y ` K 0 I X能够从Kubernetes中收益之外,在性能测试环境搭建过程中,借助Kubernetes动态弹性扩容的机制,对于M k t 1 N大规模压测集群的创建,在效率、便捷性方面更具有明显优势。

作者介绍:刘春明,软件8 8 x } T I z测试技术布道者,十年测试老兵,CSDN博客专家,MSTC大会讲师,ArchSummit讲师,运营“明说软件测试”公众号。擅长测试框架开发、测试平台开发、持续集成、测试环境治理等,熟悉服务端测试、APP测试、Web测试和性能测试。

基于 Jenkins 和 Kubernetes 的持续集成测试实践了解一下

☞一站式杀手级 AI 开发平台来袭!告别切换零散建模工具

☞北京四环堵车引发的智能交通大构想

☞拜托,别再问我什么是堆了!

☞北京四环堵车引发的智能交通大构想

☞你公司的虚拟机还闲着?基于Jenkins和Kubernetes的持续集成测试x s ; | & ; - L %实践了解一下!

☞从Web1.a R U Q ` 4 X0到Web3.0:详析这些年互联网的发展及未来方向

上一篇

当前疫情下火爆的直播应用,你了解背后的技术架构吗?

下一篇

华为有救了!三星舍弃自研5G芯片,“联姻”华为!

评论已经被关闭。

插入图片
返回顶部