执行远程服务器上的脚本是持续集成最常见也是最基本的功能需求,而其中最关键还是要解决如何连接远程服务器,在Jenkins平台上可以通过系统自带的node(节点)分布式特性或插件(如本文介绍的SSH Plugin)来实现此需求。
节点管理 - Node
首先还是要介绍系统本身自带的节点管理特性,其主要用于多任务分布式地分发到各节点(slave)执行上,而我们则可以利用此特性去连接远程服务器并在该节点上执行远程服务器脚本的任务
Manage Jenkins -> Manage Nodes
节点我们可以理解为一台服务器,当创建一个节点后,jenkins应用会根据节点的配置信息通过ssh连接到该节点上,通过一系列的初始化操作后jenkins最终就激活跟该节点的连接。
Permanent Agent: 固定代理,可以理解为网络配置相对固定的物理主机和虚拟机等
一般默认就只能选择Permanent Agent即可,节点名称不限制
以下重点解释一下配置信息的各项含义:
- # of executors: 可并行执行的最大任务数
- Remote root directory: Jenkins远程脚本执行的默认工作根目录,例如初始化时会传输一个slave.jar文件到节点的此目录上。
- Labels: 此项配置很关键,Job(任务)是通过此配置来限定可执行的节点,所以尽量使用规范且合法的英文、数组及下划线组合的名词
- Usage: 主要影响节点能接收Job的范围
- Launch method: 连接的启动模式
- Availability: 连接的可访问性
- JavaPath(必须点开表单的Advanced按钮): 配置Jenkins所运行的java程序路径
- Environment variables: 环境变量配置,连接成功后自动配置,但只针对当前连接会话生效,不影响节点原有的环境变量;此功能最常用语
JAVA_HOME
的配置 - Tool Locations: 一些常用工具的home目录
Launch method
Use this node as much as possible
尽可能地使用此节点,则让jenkins自由且优先地使用该节点来执行Job
Launch slave agents via SSH
通过SSH的方式来连接,主要针对常见的linux系统
其中要注意SSH公钥校验的策略(Host Key Verification Strategy)配置:
- 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: 如果对安全性要求不高可选择此项,直接禁用校验
SSH公钥检查主要用来防止中间人攻击,具体原理可查看此文章禁用 SSH 远程主机的公钥检查
节点密钥生成方式:
- 在jenkins应用所在服务器上生成密钥
ssh-keygen
- id_rsa: 私钥
- id_rsa.pub: 公钥
- 将公钥(id_rsa.pub)拷贝至远程节点工作根目录的
.ssh
目录中 - 将公钥重命名为
authorized_keys
- 调整公钥权限
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"按钮后才会展开看到此配置项)
参考文献
- jenkins配置slave节点 构建项目并执行操作
- jenkins配置从节点
- Add linux slave node in the Jenkins
- SSH公钥校验策略相关(Host Key Verification Strategy)
- ProcessTreeKiller相关
Unsupported major.minor version
问题
插件 - SSH Plugin
其实除了即将介绍的SSH Plugin插件外,另外Publish Over SSH Plugin这个插件也同样能实现远程执行命令的功能。两者主要区别如下:
- 远程服务器认证信息管理:SSH Plugin使用jenkins系统自带的Credentials进行管理,而Publish Over SSH Plugin则由插件自身进行管理
- 文件传输:Publish Over SSH Plugin自带文件传输到远程服务器的功能,功能更加强大
所以后者功能更侧重于文件传输后并执行命令。但考虑到认证信息管理的统一性和功能的单一性,而且后者在2016年就已经停止更新了,因此最终选择了前者——SSH Plugin。
服务器连接信息配置
Manage Jenkins -> Configure System -> SSH remote hosts
pty
、serverAliveInterval
和timeout
一般情况下均不用配置