Jenkins 创建 Node 到 Windows

Jenkins 创建 Node 到 Windows

一. 新建 Node

Dashboard -> Manage Jenkins -> Manage Nodes and Clouds
在这里插入图片描述
Dashboard -> Nodes -> New Node
在这里插入图片描述
在这里插入图片描述

二. 配置节点

在这里插入图片描述
在这里插入图片描述
Node:节点名
Description:节点描述
Number of executors:节点最大同时执行任务数量
Remote root directory:节点 代理机器上保存 Jenkins 启动文件的目录,最好使用绝对路径
Labels:节点标签,可以是多个,中间以空格分隔
Usage:控制何时构建时使用这个 Node,这里选择的 Only build jobs with label expressions matching this node:构建时只有当 任务Label 选择为此节点中包含的 Label 时,才会执行这个节点
Launch method :启动方法,这里选择了 Launch agents via SSH 通过 SSH 启动
Host:真正运行Node 的电脑的 ip
Credentials:凭证,上面选择了 Launch agents via SSH,这里需要选择一个 SSH 的凭证
Jenkins 配置 Credentials 凭证
Host Key Verfication Strategy:控制Jenkins在连接时如何验证远程主机提供的SSH密钥
Availability:控制Jenkins何时启动和停止此代理,此处选择了 Keep this agent online as much as possible:尽可能让这个代理保持在线状态
Tool Locations:用到的工具在 Windows 电脑上的路径
上面配置了 git,如果不配置,默认使用的是 启动 Jenkins电脑系统上配置的 git,会报错

最后点击 Save 保存

三. 创建如下

在这里插入图片描述
此时 节点 WinTest 图标上标记一个 红色 X,说明这个节点还未启动
点击 WinTest 节点名,打开节点
Status:节点状态,此时节点未启动
Deleta Agent:删除节点
Configure:节点配置,点击打开 回到 二. 配置节点

四.配置 SSH 服务

回到第二步看 Host 填写的 ip 这个是真正运行 Node 的 Windows 电脑的 ip
Jenkins 是在 Mac 电脑上运行,Node 配置中Launch method :启动方法,选择了 Launch agents via SSH

到 Windows 电脑 Windows 配置 SSH 服务
Mac 电脑上的 公钥 配置到 Windows 电脑中,具体位置在 Windows 配置 SSH 服务 找

测试 Mac 通过 SSH 连接 Windows 电脑,如果能成功连接,到 第五步. 启动节点
注意:Jenkins 中 创建的 SSH 凭证中填写的 UserName 需要配置为 Windows电脑的登录用户名,否则验证失败

五. 启动节点

在这里插入图片描述
到 Status 页签,点击 Launch agent

下面几种报错原因以及解决方案
1.

Connection refused (Connection refused)
SSH Connection failed with IOException: "Connection refused (Connection refused)", retrying in 15 seconds. There are 7 more retries left.
Connection refused (Connection refused)

原因:代理机器系统是 Win10,代理机器上还没有启动 SSH 服务
Windows 启动 SSH 服务
再次执行 Launch Agent

Warning: no key algorithms provided; JENKINS-42959 disabled
SSHLauncher{host='10.0.40.182', port=22, credentialsId='liqiangWin', jvmOptions='', javaPath='', prefixStartSlaveCmd='', suffixStartSlaveCmd='', launchTimeoutSeconds=60, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.KnownHostsFileKeyVerificationStrategy, tcpNoDelay=true, trackCredentials=true}
[02/18/25 21:20:44] [SSH] Opening SSH connection to 10.0.40.182:22.
Searching for 10.0.40.182 in /Users/townest/.ssh/known_hosts
Searching for 10.0.40.182:22 in /Users/townest/.ssh/known_hosts
[02/18/25 21:20:44] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.
Key exchange was not finished, connection is closed.
SSH Connection failed with IOException: "Key exchange was not finished, connection is closed.", retrying in 15 seconds. There are 10 more retries left.
Searching for 10.0.40.182 in /Users/townest/.ssh/known_hosts
Searching for 10.0.40.182:22 in /Users/townest/.ssh/known_hosts
[02/18/25 21:20:59] [SSH] WARNING: No entry currently exists in the Known Hosts file for this host. Connections will be denied until this new host and its associated key is added to the Known Hosts file.
Key exchange was not finished, connection is closed.

报错提示连接的 SSH 主机的身份没有经过验证,可能存在中间人攻击的风险。
为了确保安全,SSH 客户端需要验证连接的服务器的身份,以防止被伪装或受到中间人攻击

回到 第二步 Host Key Verfication Strategy:Known hosts file Verification Strategy
主机密钥验证策略 配置的为 从 Known 文件验证
可以到 Mac 电脑上到 ~/.ssh 路径,可以看到一个 known_hosts 文件,这里边存放了需要访问的电脑的 ip
打开会看到 每行以一个 ip 地址开头,后跟 ssh 公钥
比如上面 启动 SSH 服务的 Windows 电脑 ip 为 10.0.40.182
解决方案有多种,这里只处理一种

# ssh-keyscan -H hostname >> ~/.ssh/known_hosts
# hostname 就是启动 SSH 服务电脑的 IP
ssh-keyscan -H 10.0.40.182 >> ~/.ssh/known_hosts

这个命令会获取主机10.0.40.182的公钥并将其追加到 ~/.ssh/known_hosts 文件中

SSHLauncher{host='10.0.40.182', port=22, credentialsId='liqiangWin', jvmOptions='', javaPath='', prefixStartSlaveCmd='', suffixStartSlaveCmd='', launchTimeoutSeconds=60, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.NonVerifyingKeyVerificationStrategy, tcpNoDelay=true, trackCredentials=true}
[02/19/25 11:27:27] [SSH] Opening SSH connection to 10.0.40.182:22.
[02/19/25 11:27:27] [SSH] WARNING: SSH Host Keys are not being verified. Man-in-the-middle attacks may be possible against this connection.
ERROR: Server rejected the 1 private key(s) for xxxxx (credentialId:Win/method:publickey)
[02/19/25 11:27:27] [SSH] 认证失败。
认证失败。
[02/19/25 11:27:27] Launch failed - cleaning up connection
[02/19/25 11:27:27] [SSH] 连接关闭。

SSH 服务器上配置了 Mac 电脑的公钥,不了解的看这里 Windows 配置 SSH 服务
上面这个报错是 SSH服务器 通过 Mac 的公钥验证 Mac 电脑的私钥 失败

ERROR: Server rejected the 1 private key(s) for xxxxx (credentialId:Win/method:publickey)

看上面报错日志中的 for xxxxx 这个 xxxxx 是导致验证失败的原因
这是因为 我在Jenkins 中配置 SSH密钥凭证的时候 UserName 没有写成 开启 SSH 服务的 Windows 电脑的登录账号名
回到 SSH 密钥凭证,修改密钥凭证的 UserName为 SSH 服务的 Windows 电脑的登录账号名

[SSH] Starting agent process: cd "F:\Jenkins" && E:\JDK12/bin/java  -jar remoting.jar -workDir D:\jenkins_ws -jar-cache D:\jenkins_ws/remoting/jarCache
Error: Unable to access jarfile remoting.jar
Agent JVM has terminated. Exit code=1

上面报错原因是 通过 JDK 启动 jenkins 的时候没有对 remoting.jar 的权限
(1) remoting.jar 文件的作用:我们这里是 Mac 电脑上配置的 Jenkins 添加一个 Node 到 Windows 电脑上,那么Windows 电脑需要从 Mac 电脑的 Jenkins 中下载一个 remoting.jar 有的是 agent.jar 到 Windows 电脑上,然后通过 JDK命令执行这个 remoting.jar 或者 agent.jar,启动Jenkins 在 Windows 电脑上运行

(2) 对于命令中的几个路径从哪里来的做个解释

cd "F:\Jenkins" && E:\JDK12/bin/java  -jar remoting.jar -workDir D:\jenkins_ws -jar-cache D:\jenkins_ws/remoting/jarCache

先到 Node 配置界面
Remote root directory 配置为 F:\Jenkins
Remoting Work directory 配置为 D:\jenkins_ws
在这里插入图片描述
这个命令是一个组合命令
先执行 cd "F:\Jenkins" 切换路径
在执行 E:\JDK12/bin/java -jar remoting.jar -workDir D:\jenkins_ws -jar-cache D:\jenkins_ws/remoting/jarCache
Jenkins 执行 通过 SSH 连接到 SSH 服务的时候其实是在路径 C:\Users\Administrator>
remoting.jar 文件是被 Jenkins 放到路径 F:\Jenkins,所以要先 cd 到这个路径

Error: Unable to access jarfile remoting.jar 纯属是个人 Windows 系统 cmd 环境不同导致的报错
经过测试发现有的电脑 cmd 不管当前在哪个盘符
执行 cd "F:\Jenkins" && E:\JDK12/bin/java -jar remoting.jar -workDir D:\jenkins_ws -jar-cache D:\jenkins_ws/remoting/jarCache 就是成功的

我的电脑上 如果 cmd 当前盘符不是 F盘 那么就会报这个错
修改命令在 cd 后边加上 /d

cd /d "F:\Jenkins" && E:\JDK12/bin/java  -jar remoting.jar -workDir D:\jenkins_ws -jar-cache D:\jenkins_ws/remoting/jarCache

执行发现可以执行成功
解释:在命令行中使用 /d 参数的作用是允许跨磁盘驱动器切换目录
如果不加 /d 参数,cd 命令通常只能在同一磁盘驱动器内切换目录
例如
如果当前目录在 C 盘,使用 cd 命令切换到 C 盘的其他目录是可以正常工作的
但如果要切换到 D 盘的某个目录则会失败
而加上 /d 参数后,就可以跨磁盘驱动器切换目录,例如从 C 盘切换到 D 盘的某个目录‌

因为这个命令行是 Jenkins 拼接的,我没找到在哪里配置的,所以我没法加 /d
我的修改方案是,Remote root directory:C:\Jenkins
直接修改到 C盘

再次重新 Launch agent

[SSH] Starting agent process: cd "C:\Jenkins" && E:\JDK12/bin/java  -jar remoting.jar -workDir D:\jenkins_ws -jar-cache D:\jenkins_ws/remoting/jarCache
org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
: Using D:\jenkins_ws\remoting as a remoting work directory
rg.jenkinsci.remoting.engine.WorkDirManager setupLogging
Both error and output logs will be printed to D:\jenkins_ws\remoting
<===[JENKINS REMOTING CAPACITY]===>channel started
Remoting version: 4.10

上面日志显示节点启动成功

[02/21/25 14:14:07] [SSH] Starting agent process: cd "C:\Jenkins_2" && java  -jar remoting.jar -workDir C:\Jenkins_2 -jar-cache C:\Jenkins_2/remoting/jarCache
2�� 21, 2025 2:14:07 ���� org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
��Ϣ: Using C:\Jenkins_2\remoting as a remoting work directory
2�� 21, 2025 2:14:07 ���� org.jenkinsci.remoting.engine.WorkDirManager setupLogging
��Ϣ: Both error and output logs will be printed to C:\Jenkins_2\remoting
<===[JENKINS REMOTING CAPACITY]===>channel started
2�� 21, 2025 2:14:07 ���� hudson.remoting.UserRequest perform
����: LinkageError while performing UserRequest:hudson.slaves.SlaveComputer$SlaveVersion@455044b3
java.lang.UnsupportedClassVersionError: Failed to load hudson.slaves.SlaveComputer$SlaveVersionat hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:472)at hudson.remoting.RemoteClassLoader.loadRemoteClass(RemoteClassLoader.java:301)at hudson.remoting.RemoteClassLoader.loadWithMultiClassLoader(RemoteClassLoader.java:277)at hudson.remoting.RemoteClassLoader.findClass(RemoteClassLoader.java:236)at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)at java.base/java.lang.Class.forName0(Native Method)at java.base/java.lang.Class.forName(Class.java:398)at hudson.remoting.MultiClassLoaderSerializer$Input.resolveClass(MultiClassLoaderSerializer.java:133)at java.base/java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1886)at java.base/java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1772)at java.base/java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:2060)at java.base/java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1594)at java.base/java.io.ObjectInputStream.readObject(ObjectInputStream.java:430)at hudson.remoting.UserRequest.deserialize(UserRequest.java:312)at hudson.remoting.UserRequest.perform(UserRequest.java:196)at hudson.remoting.UserRequest.perform(UserRequest.java:50)at hudson.remoting.Request$2.run(Request.java:391)at hudson.remoting.InterceptingExecutorService.lambda$wrap$0(InterceptingExecutorService.java:81)at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.UnsupportedClassVersionError: hudson/slaves/SlaveComputer$SlaveVersion has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0at java.base/java.lang.ClassLoader.defineClass1(Native Method)at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:877)at hudson.remoting.RemoteClassLoader.loadClassFile(RemoteClassLoader.java:470)... 22 moreAgent JVM has not reported exit code. Is it still running?
[02/21/25 14:14:10] Launch failed - cleaning up connection
[02/21/25 14:14:10] [SSH] Connection closed.
ERROR: Connection terminated

上面日志 cd "C:\Jenkins_2" && java -jar remoting.jar -workDir C:\Jenkins_2 -jar-cache C:\Jenkins_2/remoting/jarCache 执行已经成功了,下面还有报错
找到日志中

Caused by: java.lang.UnsupportedClassVersionError: hudson/slaves/SlaveComputer$SlaveVersion has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

这表明当前使用的 Java 运行时只能处理到 class 文件版本 55.0,而 Jenkins 代码则是用 class 文件版本 61.0 编译的
根据 Java 的版本对应关系:
Class file version 61.0 对应 Java 17
Class file version 55.0 对应 Java 11
因此,这个错误的解决方案是确保 Jenkins 节点 也就是 Windows 使用 Java 17 或更高版本来运行,安装 JDK17

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70692.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Opengl常用缓冲对象功能介绍及使用示例(C++实现)

本文整理了常用的opengl缓冲区对象并安排了使用示例 名称英文全称作用简述顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置&#xff0c;存储顶点属性设置&#xff0c;简化渲染流程&#xff0c;避免重复设置状态顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点…

矩阵加减乘除的意义与应用

矩阵加法 数学意义 线性空间的封闭性线性变换的叠加矩阵分解与表示 实际应用 数据聚合与统计图像处理与计算机视觉物理学与工程学动态系统与优化经济学与运筹学信号处理与通信游戏开发与计算机图形学环境科学与地理信息矩阵加法的关键特点 矩阵减法 数学意义线性空间封闭性 线…

【Redis原理】底层数据结构 五种数据类型

文章目录 动态字符串SDS(simple dynamic string )SDS结构定义SDS动态扩容 IntSetIntSet 结构定义IntSet的升级 DictDict结构定义Dict的扩容Dict的收缩Dict 的rehash ZipListZipListEntryencoding 编码字符串整数 ZipList的连锁更新问题 QuickListQuickList源码 SkipListRedisOb…

微信小程序 - 页面跳转(wx.navigateTo、wx.redirectTo、wx.switchTab、wx.reLaunch)

API 跳转 1、wx.navigateTo &#xff08;1&#xff09;基本介绍 功能&#xff1a;保留当前页面&#xff0c;跳转到应用内的某个页面&#xff0c;使用该方法跳转后可以通过返回按钮返回到原页面 使用场景&#xff1a;适用于需要保留当前页面状态&#xff0c;后续还需返回的情…

Qt 中集成mqtt协议

一&#xff0c;引入qmqtt 库 我是将整个头文件/源文件都添加到了工程中进行编译&#xff0c;这样 跨平台时 方便&#xff0c;直接编译就行了。 原始仓库路径&#xff1a;https://github.com/emqx/qmqtt/tree/master 二&#xff0c;使用 声明一个单例类&#xff0c;将订阅到…

分布式之Raft算法

参考&#xff1a; 分布式算法 - Raft算法 | Java 全栈知识体系 Raft 算法详解 | JavaGuide 分布式 | CS-Notes 面试笔记

安装PHPStudy 并搭建DVWA靶场

目录 一、PHPStudy 简介 二、DVWA 简介 三、安装 PHPStudy 四&#xff1a;安装 DVWA 一、PHPStudy 简介 phpstudy傻瓜式的一键启动&#xff0c;支持WAMP、WNMP、LAMP、LNMP&#xff0c;一键切换环境&#xff08;nginxapahce&#xff09;,一键切换PHP版本&#xff08;5.1-7…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统&#xff0c;延续了2022年开发的孜然多应用授权系统V2.0 变更&#xff1a;多应用变单系统&#xff0c;去除没用的垃圾代码&#xff0c;从0开发&#xff0c;去除了一些没用的功能 完善了开发文档&#xff0c;之前那套是我写着玩的屎山代码&#xff0c;V1.0将展…

红帽7基于kickstart搭建PXE环境

Kickstart 文件是一种配置文件&#xff0c;用于定义 Linux 系统安装过程中的各种参数&#xff0c;如分区、网络配置、软件包选择等。system-config-kickstart 提供了一个图形界面&#xff0c;方便用户快速生成这些配置文件。 用户可以通过图形界面进行系统安装的详细配置&…

怎么合并主从分支,要注意什么

在 Git 中合并主从分支&#xff08;例如将 feature 分支合并到 main 分支&#xff09;是一个常见操作。以下是具体步骤和注意事项&#xff1a; 合并分支的步骤 切换到主分支 git checkout main确保当前在 main 分支。 拉取最新代码 git pull origin main确保 main 分支是最…

Java数据结构第十二期:走进二叉树的奇妙世界(一)

专栏&#xff1a;数据结构(Java版) 个人主页&#xff1a;手握风云 目录 一、树型结构 1.1. 树的定义 1.2. 树的基本概念 1.3. 树的表示形式 二、二叉树 2.1. 概念 2.2. 两种特殊的二叉树 2.3. 二叉树的性质 2.4. 二叉树的存储 三、二叉树的基本操作 一、树型结构 1.…

匹配算法:向下就近原则,向下没有就向上

匹配算法&#xff1a;向下就近原则&#xff0c;向下没有就向上 实现方式一实现方式二总结 实现方式一 private static List<Integer> findMatches(List<Integer> sourceList, List<Integer> searchValues) {List<Integer> sortedList sourceList.stre…

基于 Python Django 的校园互助平台(附源码,文档)

博主介绍&#xff1a;✌Java徐师兄、7年大厂程序员经历。全网粉丝13w、csdn博客专家、掘金/华为云等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不…

IP地址 vs 域名:分布式系统中的服务寻址之争

在分布式系统中&#xff0c;服务之间的通信是核心问题之一。如何高效、稳定地找到目标服务&#xff0c;是每个开发者都需要面对的挑战。常见的服务寻址方式有两种&#xff1a;IP地址 和 域名。这两种方式各有优劣&#xff0c;适用于不同的场景。本文将从性能、稳定性、动态性、…

【技术笔记】Cadence 创建元器件 Pin 引脚的创建与设置

【技术笔记】Cadence 创建元器件 Pin 引脚设置 一、管脚 Pin 放置方式1. 直接放置&#xff08;快捷键【Shift】【G】&#xff09;2. 按照Pin阵列放置引脚&#xff08;快捷键【Shift】【J】&#xff09;3. 通过Excel表格创建元器件 二、引脚属性设置1. 创建Pin设置&#xff0c;E…

java面试场景问题

还在补充&#xff0c;这几天工作忙&#xff0c;闲了会把答案附上去&#xff0c;也欢迎各位大佬评论区讨论 1.不用分布式锁如何防重复提交 方法 1&#xff1a;基于唯一请求 ID&#xff08;幂等 Token&#xff09; 思路&#xff1a;前端生成 一个唯一的 requestId&#xff08;…

Windows11安装GPU版本Pytorch2.6教程

1: 准备工作 针对已经安装好的Windows11系统&#xff0c;先检查Nvidia驱动和使用的CUDA版本情况。先打开Windows PowerShell&#xff0c;通过nvidia-smi命令查看GPU的情况&#xff0c;结果如下图1所示&#xff0c;从结果中可知使用的CUDA版本为12.8。 图1&#xff1a;检测安装…

深入了解Text2SQL开源项目(Chat2DB、SQL Chat 、Wren AI 、Vanna)

深入了解Text2SQL开源项目&#xff08;Chat2DB、SQL Chat 、Wren AI 、Vanna&#xff09; 前言 1.Chat2DB2.SQL Chat3.Wren AI4.Vanna 前言 在数据驱动决策的时代&#xff0c;将自然语言查询转化为结构化查询语言&#xff08;SQL&#xff09;的能力变得日益重要。无论是小型…

go 环境准备

配置路径&#xff1a; GOROOT&#xff1a;D:\GoGOPATH&#xff1a;go的工作目录 D:\workspacego 验证版本&#xff1a;go version 配置第三方仓库&#xff1a; GO111MODULE&#xff1a;开启mod模式GOPROXY&#xff1a;go语言三方库地址GOSUMDB&#xff1a;go语言软件包的M…

Qt/C++项目积累:3.日志管理系统 - 3.1 项目介绍

在实际工程项目中&#xff0c;日志系统无疑是比较重要地分析问题的手段&#xff0c;常用的一般是将其写入到日志文件中&#xff0c;或者写入数据库文件&#xff0c;进行分析&#xff0c;而工程人员或者开发人员需要实时查看日志&#xff0c;可能不太方便&#xff0c;于是就需要…