Jenkins - 分布式构建

news/2025/3/13 19:20:49/文章来源:https://www.cnblogs.com/hanease/p/18677118

1 - 简介

Jenkins支持分布式多节点(Master-Slave)运行模式。
将安装Jenkins的主机作为Master节点,然后通过界面配置(或远端启动服务)来添加Slave节点。
在这种部署结构下,Master通常只充当管理者的角色,负责任务的调度,slave节点的管理,任务状态的收集等工作,具体的构建任务则会分配给slave节点。
一个Master节点理论上可以管理的slave节点数是没有上限的,但通常随着数量的增加,其性能以及稳定性就会有不同程度的下降,具体的影响则因Master硬件性能的高低而不同。
多节点(Master-Slave)部署通常以“Jenkins + Docker”的方式来部署,可以避免当测试用例变得海量以后可能会造成的一些问题。
通常规模较大,代码提交频繁(意味着构建频繁),自动化测试压力较大的项目都会采取这种部署结构。

回到顶部

2 - Slave节点

Slave节点实际上在其他主机上运行的agent进程,无需再安装完整的Jenkins服务。
通过建立双向的TCP/IP通信连接来实现启动Slave节点上的agent进程。

2.1 创建全新的Slave节点

系统管理--》节点管理--》新建节点

配置节点基本信息

2.2 关键配置说明

并发构建数
- 该节点可以并行的最大任务数,建议和CPU内核数相等
​
远程工作目录
- Salve节点的workplace目录,存放一些源码和文件
​
标签
- 用来表示节点的群组,在配置任务时可以指定对应的群组
​
用法
- 尽可能使用这个节点:被Jenkins随机调用
- 只允许运行绑定到这台机器的job:当任务指定使用该节点时,才会使用,适合特定任务和资源紧张的场景
​
启动方式(Launch slave agents via SSH)
- Jenkins通过SSH方式自动连接到远端节点并传送agent启动文件slave.jar,然后通过java方式启动一个Slave agent进程
- 无需对Slave节点进行任何配置操作,推荐使用。
​
启动方式(Launch agent via execution of command on the master)
- 在Master节点上通过SSH远程在Slave节点执行指令来启动agent程序
- 需要事先将Slave.jar放到到Slave节点
​
启动方式(Launch agent via Java Web Start)
- 可以连接Windows Slave节点
- 需要Slave节点主动连接到Master节点,适合设置没有主动访问权限的节点
​
可用性
- 控制启动和停止该节点的模式
​
节点属性
- 工具位置:如果设置Slave节点的工具执行路径,将覆盖全局配置的默认路径
- 环境变量:如果设置Slave节点的同名环境变量,将覆盖系统全局变量的值
​

2.3 查看状态

系统管理--》节点管理

系统管理--》节点管理--》 laveNode-192.168.16.203

回到顶部

3 - Slave节点启动日志

系统管理--》节点管理--》SlaveNode-192.168.16.203---》日志

SSHLauncher{host='192.168.16.203', port=22, credentialsId='e6ae3eab-fbe7-406e-bf12-8d13deaf308a', jvmOptions='', javaPath='', prefixStartSlaveCmd='', suffixStartSlaveCmd='', launchTimeoutSeconds=210, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.NonVerifyingKeyVerificationStrategy, tcpNoDelay=true, trackCredentials=true}
[12/04/19 09:06:38] [SSH] Opening SSH connection to 192.168.16.203:22.
[12/04/19 09:06:38] [SSH] WARNING: SSH Host Keys are not being verified. Man-in-the-middle attacks may be possible against this connection.
[12/04/19 09:06:38] [SSH] Authentication successful.
[12/04/19 09:06:38] [SSH] The remote user's environment is:
BASH=/usr/bin/bash
BASHOPTS=cmdhist:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_EXECUTION_STRING=set
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.2.46(2)-release'
DIRSTACK=()
EUID=0
GROUPS=()
HOME=/root
HOSTNAME=node203
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=en_US.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LOGNAME=root
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/mail/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
PIPESTATUS=([0]="0")
PPID=3026
PS4='+ '
PWD=/root
SHELL=/bin/bash
SHELLOPTS=braceexpand:hashall:interactive-comments
SHLVL=1
SSH_CLIENT='192.168.16.102 53268 22'
SSH_CONNECTION='192.168.16.102 53268 192.168.16.203 22'
TERM=dumb
UID=0
USER=root
XDG_DATA_DIRS=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/:/usr/local/share/:/usr/share/
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=12
_=/etc/bashrc
flatpak_dirs=/root/.local/share/flatpak/exports/share/:/var/lib/flatpak/exports/share/
command_not_found_handle () 
{ local runcnf=1;local retval=127;[[ $- =~ i ]] || runcnf=0;[[ ! -S /run/dbus/system_bus_socket ]] && runcnf=0;[[ ! -x '/usr/libexec/packagekitd' ]] && runcnf=0;[[ -n ${COMP_CWORD-} ]] && runcnf=0;if [ $runcnf -eq 1 ]; then'/usr/libexec/pk-command-not-found' "$@";retval=$?;elseif [[ -n "${BASH_VERSION-}" ]]; thenprintf 'bash: %scommand not found\n' "${1:+$1: }" 1>&2;fi;fi;return $retval
}
[12/04/19 09:06:38] [SSH] Checking java version of /jenkins-data/jdk/bin/java
Couldn't figure out the Java version of /jenkins-data/jdk/bin/java
bash: /jenkins-data/jdk/bin/java: No such file or directory
​
[12/04/19 09:06:38] [SSH] Checking java version of java
[12/04/19 09:06:39] [SSH] java -version returned 1.8.0_161.
[12/04/19 09:06:39] [SSH] Starting sftp client.
[12/04/19 09:06:39] [SSH] Remote file system root /jenkins-data does not exist. Will try to create it...
[12/04/19 09:06:39] [SSH] Copying latest remoting.jar...
[12/04/19 09:06:39] [SSH] Copied 872,440 bytes.
Expanded the channel window size to 4MB
[12/04/19 09:06:39] [SSH] Starting agent process: cd "/jenkins-data" && java  -jar remoting.jar -workDir /jenkins-data -jar-cache /jenkins-data/remoting/jarCache
Dec 04, 2019 5:06:41 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /jenkins-data/remoting as a remoting work directory
Dec 04, 2019 5:06:41 PM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
INFO: Both error and output logs will be printed to /jenkins-data/remoting
<===[JENKINS REMOTING CAPACITY]===>channel started
Remoting version: 3.33
This is a Unix agent
Evacuated stdout
Agent successfully connected and online
回到顶部

4 - 执行pipeline任务

4.1 建立流水线任务

4.2 构建

4.3 查看输出

控制台输出

查看Blue Ocean

回到顶部

5 - 通过Kubernetes部署和更新Jenkins

5.1 简介

如果将Jenkins环境迁移到Kubernetes集群,可以直接通过Kubernetes进行部署和更新,也是说,通过K8s集群环境中的Jenkins来进行持续集成和部署。
Jenkins Master和Slave节点分别位于K8s的不同节点。
资源可以动态生成和销毁,合理利用资源,并且能够给任务提供干净的初始化环境。
必要时,K8s创建的Pod也可以保留,用于状态和问题的跟踪。

前置条件:需要具备足够的K8s基础知识。

5.2 Kubernetes中的Jenkins

Jenkins Master节点

  • 主目录通过磁盘挂在持久化的宿主机或NFS中,保证数据的高可用性。
  • 如果Jenkins服务异常,通过K8s重新部署环境后,之前的数据也依然存在。

Jenkins Slave节点

  • 由K8s集群动态自动生成,随机在资源空闲的节点上创建一个pod并定义多个容器(Slave节点),执行Jenkins任务
  • 任务执行结束后,自动注销并删除该Pod,资源自动释放。
  • Slave节点的数据可以通过磁盘挂载的方式进行数据共享和数据持久化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870803.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins - 安装并启动Jenkins

1 - 关于Jenkins 构建流水线(build pipeline)工具Jenkins可以轻松地定义和管理各种各样的操作(构建、测试等),并将这些操作像管道pipe一样自由地进行组合,从而自动、流畅地执行一系列处理。将操作以项目project为单位整合并运行,操作简洁 消除手工操作,安全可靠 保留执…

Jenkins - 初识

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 通常企业都会将持续集成和持续交付的过程标准化一个单独的生态系统,将涉及的特定工具标…

10分钟搞懂大模型备案

大模型备案作为合规化运营的重要资质,办理难度大,申报周期长。为了方便大家快速弄懂大模型备案,我将大量涉及文件和繁杂的流程进行了精简和总结,力求让大家能快速理解重点。一、申报材料 大模型备案主要涉及语料安全评估、模型安全评估、安全措施评估三部分,主要申报材料如…

视频为什么会糊(二)?B站的码率变化

原文链接:https://tingxuanr.github.io/note/视频为什么会糊二b站的码率变化/ 摘要:流媒体平台(不只B站,所有流媒体都在干,画质最差的还得是优爱腾三家)为了节约成本,不断的降低自家视频的码率。很多所谓的4k、蓝光清晰度还不如六七年前的,纯粹是自欺欺人。上一篇对比 …

爬取二手房案例--parsel教学篇(CSS选择器)

本文通过一个爬取二手房的案例,来分享另外一种解析数据的方式:解析神器python第三方库parsel库。之所以叫他解析神奇,是因为它支持三种解析方式。 可以通过Xpath,CSS选择器和正则表达式来提取HTML或XML文档中的数据。@目录前言导航parsel的使用安装parsel创建Selector对象解…

duckX 读写word,替换word中内容的整理

一、库编译 1.下载地址:https://github.com/amiremohamadi/DuckX 2. 使用git 下载: git clone https://github.com/amiremohamadi/DuckX 3.编译 1.打开代码所在目录 2.创建生成目录build 3.依次点击 config generate 4. 打开项目,选择编译库的种类 生成库位置二、使用 C++读…

OpenAI 宕机思考丨Kubernetes 复杂度带来的服务发现系统的风险和应对措施

本文以社区主流服务发现系统 Nacos 为例,从可靠性、可伸缩性、高性能、可维护性等 4 个方面探讨如何提升 Kubernetes 中微服务应用的稳定性。作者:王建伟(正己) 12 月 11 日,OpenAI 旗下 AI 聊天机器人平台 ChatGPT、视频生成工具 Sora 及其面向开发人员的 API 自太平洋时…

如何删除www目录下无法删除的文件?

您好,有时在尝试删除www目录下的文件时,可能会遇到权限不足或其他问题导致无法删除。以下是详细的排查步骤和解决方案,帮助您顺利删除这些文件:检查文件权限:确认要删除的文件和目录具有适当的权限。可以通过FTP客户端或SSH连接到服务器并检查文件夹权限。例如:bashls -l…

请问忘记FTP账号密码,如何重置?

如果您忘记了FTP账号密码,可以通过以下几种方式重置密码,确保您的FTP账户能够正常使用:通过控制面板重置:大多数云服务提供商和托管平台都提供了在线控制面板,您可以在其中找到FTP管理选项。登录控制面板后,选择“FTP管理”或类似选项,然后点击“重置密码”。按照提示完…

如何解决FTP上传文件失败的问题?

您好,FTP(文件传输协议)是用于在互联网上进行文件传输的常用工具。如果遇到FTP上传文件失败的情况,可能是由多种原因引起的。以下是详细的排查步骤和解决方案:检查FTP账户信息:确认您使用的FTP账户名和密码是否正确。如果不确定,可以尝试使用其他已知有效的账户进行测试…

如何开通25端口发送邮件

开通25端口通常是为了发送邮件。以下是详细的步骤和注意事项:检查防火墙设置:登录到您的服务器,确保防火墙已放行25端口。 使用命令行工具(如iptables或firewalld)查看防火墙规则。 示例命令:sudo iptables -L sudo firewall-cmd --list-all配置邮件服务:安装并配置邮件…

请问所有网站不能打开,云服务器问题如何排查?

当所有网站无法打开时,可能是由于云服务器配置错误或网络问题引起的。以下是详细的排查和解决方案:检查服务器状态:确认云服务器是否正常运行,可以通过云平台的管理界面查看服务器状态。 如果服务器处于关机或重启状态,尝试手动启动服务器,并等待其完全启动后再进行测试。…