前言
借助Jenkins
我们可以做一些CI/CD的工作,例如我们可以关联一个git merge master
的trigger
,当有合入到主分支的代码时,就可以借助一些工具例如jacoco,HTML Publisher等去跑一些单元测试并且生成报告,发送邮件通知到相关人员。
当然,一个团队不可能只有一个项目,例如会有Android、ios、Web等等各端,然后每个端可能还会有多个项目需要构建,那么由于Jenkins Pipeline的机制,同一个节点的多任务就会排队执行,这样的执行方式是低效的。这时就需要配置多个节点来分布式的运行任务,本文就来描述一下如何新增一个Jenkins 的 slave 的节点。
我使用的是新增一个MacOs Slave,作为master的机器使用的是docker Jenkins 镜像。
新建Slave步骤
-
在
Jenkins master
生成 ssh-key:# 进入docker环境,如果不是安装在docker的话,不需要执行这一步 docker exec -it devops-jenkins /bin/bash # 新建.ssh 目录 mkdir ~/.ssh # 进入.ssh目录 cd .ssh # 生成密钥对,如果不需要指定密码一路回车即可 ssh-keygen -t rsa
这时在
~/.ssh
路径下应该生成了一个私钥id_rsa
, 一个公钥id_rsa.pub
, 稍后会用到。 -
打开
Jenkins
主页,首先需要将 master 生成的私钥添加到Credentials
:- 点
Jenkins
左侧菜单栏的凭据
->系统
->全局凭据
选项:
- 点击
添加凭据
:
对上图中的各选项做一个解释:
类型: 类型这里指的是这里要添加的凭据类型,例如用户名密码、
SSH Key
等等,由于我们这里要添加SSH Key
因此需要选择SSH Username with private key
。范围: 凭据的作用范围,这里选择全局
ID: 凭据对应的唯一的ID,可以不用填,会根据
SSH Key
生成一个。描述: 凭据主要是用来干什么的
Username: username表示root用户的用户名(这里指的是我们对应的Slave的机器的admin 用户名)。
Private Key: 这里我们直接勾选
Enter directly
, 然后将第一步中生成的私钥:id_rsa
的全部内容拷贝过来(全部拷贝过来)。Passphrase: 如果在生成SSH Key的时候指定了密码,这里需要填入,没有的话就不用填。
知道了每个选项用途后,我们只需要填入我们需要的值即可。
- 点
-
然后退出到 Jenkins 主页,选择左侧菜单栏
Manage Jenkins
, 跳转到 Jenkins 的管理页面之后,选择Manage Nodes and Clouds
:- 选择新建节点:
- 在新建节点页面,输入节点名称,由于我们是新建节点,所以选择 Permanent Agent (固定节点),自后点击确定。
这里主要解释一下比较重要的几项:
远程工作目录: 是指Jenkins的工作目录,例如之后如果与GitHub建立了trigger,clone下来一些项目存放位置
启动方式: 由于我们是通过SSH Key与Slave连接,所以这里选择了 Launch agents via SSH ,即通过SSH 与Slave连接。
主机: Slave的IP地址。
Credentials: 即在第二步中生成的凭据。
Host Key Verification Strategy: 指的是SSH 公钥的校验策略,这里依据对安全性要求的情况,进行选择,分别有以下四种:
- Known hosts file Verification Strategy: 会根据 Jenkins 应用所在服务器上的known_hosts(
/var/jenkins_home/.ssh/known_hosts
)的 agent 记录来判断,所以需要提前向文件添加远程节点的公钥 - Manually provided key Verification Strategy: 手动声明远程节点的公钥
- Manually trusted key Verification Strategy: 待连接初始化成功后需要手动在节点界面中信任公钥
- Non verifying Verification Strategy: 禁用校验
Java 路径: Java路径指的是Slave上Java所在的位置,一般是在
/usr/bin/java
填完上述选项后,可以先点击保存,将信息保存下来,但这是还是连接不成功的。
-
为Slave节点添加公钥:
关于
Jenkins
网站的配置都完成了,但我们此时还需要将 master 的公钥 拷贝到 Slave节点上:# 进入docker环境 docker exec -it devops-jenkins /bin/bash # 查看公钥 cat ~/.ssh/id_rsa.pub
以上是在master上的操作,即获取到公钥内容,接下来需要将公钥拷贝到Slave节点的
~/.ssh/authorized_keys
中去(这里拷贝方式可以按照个人喜好,最方便的是使用scp,当然登录微信,发邮件之类的都可以,下面就讲一下scp的方式):注意以下是在Slave的机器上操作:
如果Slave没有.ssh文件夹,就按照master上生成.ssh的步骤,先生成密钥,之后可以通过scp命令直接拷贝master上的公钥到slave 机器:
注意这里需要master这台机器开启了远程登录,macOs的话在【系统偏好设置 -> 共享】 中开启
# 拷贝master的公钥到 Slave 桌面 scp admin_name@192.168.1.103 ~/.ssh/id_rsa.pub ~/Desktop/key # 将master的公钥拼接到 authorized_keys中 cat ~/Desktop/key >> ~/.ssh/authorized_keys
以上所有步骤都完成后,再去Jenkins
上Node详情页面,点一下重新启动试试,日志就会输出成功信息了。
总结
总结一下新增一个Slave的步骤,主要分为三步:
- 首先需要在master生成SSH Key
- Jenkins 主页新建 Credentials,选择
SSH Key
的连接方式, 将第一步中master上的私钥id_rsa
填入,并且 username需要写Slave
的admin 用户名。 - 将master的公钥
id_rsa.pub
拷贝进入 Slave 的~/.ssh/authorized_keys
中