Jenkins建立windows类型的节点

1,998 阅读4分钟

虽然Jenkins中使用linux节点机器是工程的主流,但是windows机器依然是不可缺少的一部分,用户在一开始配置的时候会遇到一些问题,这篇文章将向大家展示如何去正确配置一个windows节点

JNLP链接方式

这种方式首先在配置前打开端口,在安全设置中选择Agents中的Tcp链接端口配置为随机或者固定值。固定值一般用于和外部连接有防火墙限制时的操作。没设置防火墙的我们直接设置随机值。

image.png  

安全设置完成后,进入节点管理界面,建立新的节点   image.png

配置好远程目录,并选择登录方式为Launch agent by connect it to the controller,在某些 版本也称之为通过Java Web 代理启动。

界面会展示链接方法,我们可以将这个jar包先下载下来,然后在windows机器上执行对应命令进行连接。

image.png

执行命令以后可以看到机器成功链接上了。

刷新页面以后可以看到机器连接上了。

image.png

 

image.png

如果连接的过程中发现机器无法连接,提示jnlp4的协议不支持的话,可以在刚才设置代理TCP端口那里的高级选项中查看是否已经勾选上了.

image.png

我们创建一个任务限制在这个节点上运行,并在build阶段添加一个windows batch命令。

  image.png

观察运行结果我们发现有乱码。

image.png

联想到以前容器中的乱码,可以考虑在节点上设置jvm 参数来处理这个问题。

链接命令变为

java -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -jar agent.jar -jnlpUrl http://127.0.0.1:8080/computer/node%5Fwindows/jenkins-agent.jnlp -secret e27f6bbd90aa1734ece73dc6287e8cae1b9c56162dcc5fbf361cef15d6f6cd2e -workDir "D:/jenkins_data"

可以看到系统信息没有受到影响,仍旧是GBK,输出的编码还是ms936,另外一种中文编码。通过参数调整这两个stderr和stdout的编码,发现反而是控制台输出乱了,明显不是合理的。

image.png

image.png

 

 

我准备尝试设置系统的编码,在时间区域设置中的其他日期、时间和区域设置里,设置机器的编码为UTF-8,大家进到时间区域设置后可以按照下图所示的数字顺序进行操作。

image.png

确定后进行重启

此时,我们不需要额外参数就可以重新连接,并实现正确的编码展示

image.png

SSH方式

windows机器可以通过Windows自带的应用中可选功能->添加功能,搜索openssh进行安装,也可以在github仓库中直接下载openssh的release版本(下载msi格式的)进行安装。

两者都会自动建立一个22端口的防火墙规则,允许ssh登录机器。

windows系统里的需要手动启动net sshd start,软件包的安装完会自己启动的。

在Jenkins上建立节点时选择launch agent via ssh

此时需要配置机器的IP和账号密码的凭据。没有密码的需要先设置一下。

Host key的验证方式可以设置为不验证。

初次连接,发现无法访问这个jar文件

image.png 经过尝试和查询资料,这里需要将命令自行写入到jvm参数中,或者写入javaPath配置里。

"C:\Java\jdk-19.0.2\bin\java.exe" -jar "D:\jenkins_data_2\remoting.jar" -workDir D:\jenkins_data_2 -jar-cache D:\jenkins_data_2\remoting\jarCache &&

系统在寻找文件时用的还是/作为分隔符,所以很有可能找不到文件。像上面拼装起来的,才是完整的。

 

此时可以正常运行任务。如果在此之前没有设过机器的编码,控制台输出还有乱码,可以参考上一节进行编码设置

image.png

 

 

 

对比

在工程上两者并无太大差异,但是在链接方式上,jnlp相当于是被动的链接过来,如果机器自己没有发起连接,Jenkins系统是拿不到使用权的,而ssh方式属于主动连接,由Jenkins持有机器的相关凭据去调度机器,不会随着机器上链接命令进程的断开而断开。

jnlp有一个好处,就是机器可以处于私有网络下,只要能够访问公网,就能与公网的Jenkins机器进行连接,而不用担心连不上的问题,ssh就很难接通私有网络内部的机器了。这也是JNLP方式常用于容器集群的原因。