Jenkins持续集成实践-(2)连接远程服务器

/ 0评 / 0

执行远程服务器上的脚本是持续集成最常见也是最基本的功能需求,而其中最关键还是要解决如何连接远程服务器,在Jenkins平台上可以通过系统自带的node(节点)分布式特性或插件(如本文介绍的SSH Plugin)来实现此需求。

节点管理 - Node

首先还是要介绍系统本身自带的节点管理特性,其主要用于多任务分布式地分发到各节点(slave)执行上,而我们则可以利用此特性去连接远程服务器并在该节点上执行远程服务器脚本的任务

Manage Jenkins -> Manage Nodes

节点我们可以理解为一台服务器,当创建一个节点后,jenkins应用会根据节点的配置信息通过ssh连接到该节点上,通过一系列的初始化操作后jenkins最终就激活跟该节点的连接。

Permanent Agent: 固定代理,可以理解为网络配置相对固定的物理主机和虚拟机等

一般默认就只能选择Permanent Agent即可,节点名称不限制

以下重点解释一下配置信息的各项含义:

Launch method

Use this node as much as possible

尽可能地使用此节点,则让jenkins自由且优先地使用该节点来执行Job

Launch slave agents via SSH

通过SSH的方式来连接,主要针对常见的linux系统

其中要注意SSH公钥校验的策略(Host Key Verification Strategy)配置:

SSH公钥检查主要用来防止中间人攻击,具体原理可查看此文章禁用 SSH 远程主机的公钥检查

节点密钥生成方式:

  1. 在jenkins应用所在服务器上生成密钥ssh-keygen
    • id_rsa: 私钥
    • id_rsa.pub: 公钥
  2. 将公钥(id_rsa.pub)拷贝至远程节点工作根目录的.ssh目录中
  3. 将公钥重命名为authorized_keys
  4. 调整公钥权限chmod 700 authorized_keys

Let Jenkins control this Windows slave as a Windows service

此方式仅针对windows服务器,且通过DCOM方式进行连接,但是Jenkins提示不建议此方式来连接windows服务器,会很容易遇到各种各样的奇葩问题,稳定性堪忧。

Launch agent via Java Web Start

此方式是通过在目标服务器上先启动一个JNLP文件的java应用,然后再让jenkins去连接

Usage

Use this node as much as possible

尽可能地使用此节点,则让jenkins自由且优先地使用该节点来执行Job

Only build jobs with label expressions matching this node

只运行绑定了此节上的Job执行,具体Job创建时的配置如下:

Restrict where this project can be run填写的就是上文node节点配置时的tag标签名称

Availability

Keep this agent online as much as possible

保持连接一直在线

Take this agent online and offline at specific times

让连接按照一定周期在线和离线,就是在线和离线的时长是可配置,且是不断交替

Take this agent online when in demand, and offline when idle

只有在有任务需要在上面执行的时候才在线,执行完毕后关闭连接

常见问题

ProcessTreeKiller机制

通过节点slave方式执行远程脚本是需要注意jenkins的ProcessTreeKiller机制,该机制当jenkins执行完脚本后它会清理掉该会话执行过程中所有的子进程,这就导致如果Job是启动tomcat等需要常驻服务器进程的话,在Job结束之时进程就会被jenkins杀掉。要解决这个问题就得针对这种类型的Job在执行之前,先配置如下环境变量

export BUILD_ID=dontKillMe

通过处理后,Jenkins脚本执行完毕后就不会执行ProcessTreeKiller机制了

Unsupported major.minor version 问题

一般是执行Jenkins的slave程序的java版本过低导致,建议安装最新的java版本,并修改节点配置表单中的JavaPath指向(需要点击"Advanced"按钮后才会展开看到此配置项)

参考文献

插件 - SSH Plugin

其实除了即将介绍的SSH Plugin插件外,另外Publish Over SSH Plugin这个插件也同样能实现远程执行命令的功能。两者主要区别如下:

所以后者功能更侧重于文件传输后并执行命令。但考虑到认证信息管理的统一性和功能的单一性,而且后者在2016年就已经停止更新了,因此最终选择了前者——SSH Plugin。

服务器连接信息配置

Manage Jenkins -> Configure System -> SSH remote hosts

ptyserverAliveIntervaltimeout一般情况下均不用配置

参考文献

发表评论

电子邮件地址不会被公开。 必填项已用*标注