Jenkins新增Slave

1,413 阅读5分钟

前言

什么是Jenkins

​ 借助Jenkins我们可以做一些CI/CD的工作,例如我们可以关联一个git merge mastertrigger,当有合入到主分支的代码时,就可以借助一些工具例如jacoco,HTML Publisher等去跑一些单元测试并且生成报告,发送邮件通知到相关人员。

​ 当然,一个团队不可能只有一个项目,例如会有Android、ios、Web等等各端,然后每个端可能还会有多个项目需要构建,那么由于Jenkins Pipeline的机制,同一个节点的多任务就会排队执行,这样的执行方式是低效的。这时就需要配置多个节点来分布式的运行任务,本文就来描述一下如何新增一个Jenkins 的 slave 的节点。

​ 我使用的是新增一个MacOs Slave,作为master的机器使用的是docker Jenkins 镜像。

新建Slave步骤

  1. 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 , 稍后会用到。

  2. 打开Jenkins 主页,首先需要将 master 生成的私钥添加到 Credentials

    1. Jenkins 左侧菜单栏的 凭据 -> 系统 -> 全局凭据选项:

    image-20200717194206431

    1. 点击 添加凭据

    image-20200717194321307

    1. image-20200717194358619

    对上图中的各选项做一个解释:

    类型: 类型这里指的是这里要添加的凭据类型,例如用户名密码、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的时候指定了密码,这里需要填入,没有的话就不用填。

    知道了每个选项用途后,我们只需要填入我们需要的值即可。

  3. 然后退出到 Jenkins 主页,选择左侧菜单栏 Manage Jenkins, 跳转到 Jenkins 的管理页面之后,选择 Manage Nodes and Clouds:

    1. 选择新建节点:

    image-20200717195518552

    1. 在新建节点页面,输入节点名称,由于我们是新建节点,所以选择 Permanent Agent (固定节点),自后点击确定。

    image-20200717195604379

    image-20200717200236786

    这里主要解释一下比较重要的几项:

    远程工作目录: 是指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

    填完上述选项后,可以先点击保存,将信息保存下来,但这是还是连接不成功的。

  4. 为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的步骤,主要分为三步:

  1. 首先需要在master生成SSH Key
  2. Jenkins 主页新建 Credentials,选择SSH Key的连接方式, 将第一步中master上的私钥 id_rsa 填入,并且 username需要写Slave 的admin 用户名。
  3. 将master的公钥 id_rsa.pub 拷贝进入 Slave 的~/.ssh/authorized_keys