节点概念
Jenkins服务运行在一台服务器上,服务器的资源是有限的,Jenkins服务的构建速度受服务器资源影响,也是有限的。当我们需要构建的项目比较多或规模比较大的时候,可能会超出Jenkins的构建能力,超出其构建能力,导致构建任务堆积,严重的话会让服务崩溃。
单个Jenkins服务满足不了我们构建需求,但是多个Jenkins服务管理起来比较麻烦。我们可以以“分布式”的方法来维护构建数据,即Jenkins的节点概念。
节点,可以理解为是Jenkins的员工,我们部署的Jenkins服务是主节点,相当于领导。领导表示TA快忙死了,然后大老板知道后,就招了几个人(买服务器)作为领导的员工(节点),领导接到任务(构建任务)之后,就按照相关规则将任务分给员工,员工接收成功后就开始苦命的干活(执行命令),干活的时候将执行结果反馈给领导,领导接收反馈后更新构建结果(任务成功或失败等)。
总的来说,节点就是另一个服务器,这个服务器接收Jenkins主节点的命令并执行。我们一般叫Jenkins服务为主节点,主节点将构建任务分配到不同的节点。
节点配置
节点有多种配置方式,常用的是2种:agent代理和SSH登录
本文准备了2台linux服务器进行讲解。其中一台部署了Jenkins服务,另一台配置为节点。
节点的配置都是在【Manage Jenkins】下的【Nodes and Clouds】进行配置的
当前章节我们使用的可以触发构建任务的项目如下:
当前项目会下载源码:
当前项目会执行ip addr
命令
接下来,我们还要再子节点上配置项目可运行的环境:配置java环境和安装git工具
根据项目内容,我们需要将子节点服务器的环境配置成可以运行项目。首先,子节点需要接收来自jenkins的java命令(jenkins是使用Java语言写的),所以需要配置java环境;然后我们的项目会下载gitee仓库代码,需要支持git命令,所以需要安装git工具。即子节点服务器需要配置java环境、安装git工具。
agent代理方式
agent代理方式是Jenkins默认就有的节点配置方式,该方式是主节点提供agent控制器,节点运行agent控制器来与主节点进行连接,主节点就可以通过该连接指挥agent节点干活。
步骤如下:
- 1.在jenkins服务上配置agent子节点并保存
- 2.子节点服务器中,下载指定的agent.jar,并执行指定的java -jar命令去连接主节点
- 3.主节点执行构建任务
agent代理方式,是在子节点配置的时候,启动方式Launch method选择Launch agent by connecting it to the controller
。这种方式是jenkins服务根据子节点的配置,生成一个agent.jar,子节点服务器下载agent.jar,并通过java命令运行agent.jar主动与jenkins主节点连接
配置并保存节点后,我们看到该节点是未连接的状态:
点击节点名称(Name),进入节点状态(Status)页面,找到需要在子节点对应的服务器上执行的命令
由于子节点服务器是Linux系统,所以执行“Run from agent command line: (Unix)”下的命令,我们可以看到,第2条命令是java命令,所以我们需要在子节点服务器中配置java环境,即安装jdk,linux安装jdk的步骤参考这篇博客(Jenkins入门),配置好java环境后,执行相关命令,执行情况如下:
子节点服务器执行了指定的命令后,稍等几分钟,在jenkins服务的子节点列表页面,可以看到子节点连接状态为已连接
连接成功后,我们去配置项目,触发项目的构建:
项目构建成功后,我们在主节点服务器只能看到一些构建日志
实际工作目录workspace是在子节点服务器的指定路径(Remote root directory字段的绝对路径)中
SSH连接方式
SSH连接方式,是主节点通过配置的ssh信息(凭证等),通过ssh登录的方式登录到子节点,是主节点主动连接子节点。
Jenkins节点启动方式默认支持agent代理方式的,如果想要支持SSH,则需要安装SSH Build Agents
插件
需要创建一个子节点服务器的登录凭证,路径:【Manage Jenkins】–>【Manage Credentials】,Domain选择“global”,点击“Add Credentials”添加登录凭证
入门示例
凭证的种类有多种,我们先用Username with password
的方式
凭证添加完成后,我们去新增节点,路径:【Manage Jenkins】–>【Nodes and Clouds】,点击“New Node”新增节点,然后配置节点
相关字段说明:
- Remote root directory:远程根目录(绝对路径),相当于Jenkins根目录,存放项目的workspace(有代码下载的话会下载到这里)和ssh连接工具(比如remoting.jar)
- Launch method:启动方式,如果是要使用ssh登录方式,则选择
Launch agents via SSH
(需要安装SSH Build Agents
插件) - Host:子节点对应服务器的公网IP地址
- Credentials:凭证,即SSH登录凭证(登录信息),选择我们前面步骤创建的凭证
- Host Key Verification Strategy:主机密钥验证策略,如果是SSH用户密码的凭证进行连接的话,选择“Non verifying Verification Strategy”策略,如果是密钥的方式,则选择"Known hosts file Verification Strategy“策略
- JavaPath:由于jenkins是用java语言写的,相关的操作也是java命令,所以子节点服务器上必须配置java环境,如果是Linux系统,可以使用
which java
获取到java环境路径 - Remoting Work directory:远程工作目录(绝对路劲),即jenkins子节点的工作路径,存放一些构建日志数据(比如remoting)。如果未设置(为空)的话,则默认使用Remote root directory字段的路径
节点配置好后,点击Save按钮进行保存,主节点会自动去连接子节点,我们可以通过子节点的【Log】去查看ssh连接情况:
我们也可以在节点列表中查看连接情况:
连接过程中,也会在远程根目录(Remote root directory)下生成remoting.jar
ssh连接成功后,接下来我们去触发项目构建:
构建结束后,我们从此次构建的Console Output中查看构建日志
ssh凭证设置
ssh连接方式设置步骤中,我们需要先去创建ssh登录凭证,从截图中可以看到,ssh登录凭证的设置有多种方式,具体的使用如下:
- Username with password
- SSH Username with private key
- Secret file
- Secret text
常用的是Username with password
和SSH Username with private key
SSH Username with private key
步骤1:在Jenkins主节点上生成密钥,命令:ssh-keygen -t rsa
步骤2:进入jenkins目录,获取私钥和公钥
步骤3:将私钥配置到凭证credentials中
新建credentials,配置说明如下:
Kind
:这里我们介绍SSH Username with private key的用法,就选择这个Scope
:范围,即该凭证在哪里可以使用ID
:凭证ID,不重复就行Description
:凭证描述,在节点配置时方便区分凭证Username
:ssh登录子节点时的用户Private Key
:SSH Username with private key时,必须勾选,并将主节点服务器生成的id_rsa文件内容复制到key中
步骤4:将主节点服务器生成的公钥id_rsa.pub的文本内容,复制到子节点服务器的/{用户名}/.ssh
目录下的authorized_keys文件中。如果没有.ssh目录,可以自己创建:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
chmod -R 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
创建后将id_rsa.pub文本内容复制到authorized_keys文件中(linux系统可以使用vi命令)
步骤5:配置子节点
子节点的配置与【SSH连接方式】的Username with password
示例基本相同,只有以下几个字段配置不同:
Credentials
:选择步骤3:将私钥配置到凭证credentials中
步骤中创建的凭证Host Key Verification Strategy
:如果主节点服务器有通过ssh连接子节点服务器成功过,则可以选择Known hosts file Verification Strategy
;否则,选择Manually provided key Verification Strategy
Remote root directory
设置成"/root/test/jenkins_test/ssh_key",Remoting Work directory
为空
连接成功后,就可以触发构建任务了。
其他配置
Labels
Labels是主节点通过项目的Label进行匹配,将构建任务发给Labels匹配的子节点。
项目中的配置:
子节点没有配置Labels,主节点配置了Labels为"wen",所以项目在主节点运行: