之前在做一个Jenkins任务使用多个代理进行配合完成的时候,没有涉及到锁的问题,最近因为要涉及到加锁,并且要锁定多个stage,pipeline不支持这种用法,没办法,只能想办法将其他代理的(linux)的任务通过Windows下的代理通过ssh免密登录连接过去执行,保证所有需要加锁的步骤都能在一个stage中运行,这样就可以实现过程加锁了。
但是在这个过程中就发现了这么个问题,就是ssh免密连接linux时,一直不是去找c:\users\username下的.ssh去拿密钥。
前情提要
Windows下的Jenkins代理服务是通过WinSW来添加的,相对比较简单,配置好xml然后管理员权限启动bat或者执行相关的install和net start命令即可。
问题表现
-
首先,在Jenkins的节点的系统信息中可以看到user.name不是Windows的系统登录用户,一般是一个比较奇怪的名字,user.home是
C:/Windows/system32/config/systemprofile
,USERPROFILE也是在C:/Windows/system32/config/systemprofile
-
其次在解决了前面的问题情况下,使用ssh命令连接时还是会去找
C:/Windows/system32/config/systemprofile
下的.ssh目录获取密钥。 -
自己登录系统使用ssh命令是获取c:\users\username下的密钥,使用管理员权限执行命令也是正常,也尝试在启动Jenkins代理服务之后立即执行也是正常的。
处理过程
首先排查Jenkins中的环境变量和本地变量的差异,发现了user.name、user.home等信息和Windows登录用户的相关信息不一致,首先想到的是将这些环境变量参数修改正确,分别通过了winsw的xml配置env节点、Jenkins的节点环境变量配置等方式,但是均失败告终,这里正好记录一下配置方式。
- winsw的xml配置环境变量的方式(无效)
<configuration>
<!-- ID of the service. It should be unique accross the Windows system-->
<id>Jenkins-Agent-Service</id>
<!-- Display name of the service -->
<name>Jenkins-Agent-Service</name>
<!-- Service description -->
<description>Jenkins的Windows代理服务</description>
<!-- Path to the executable, which should be started -->
<executable>java</executable>
<arguments>-Dfile.encoding=utf-8 -jar agent.jar 相关启动参数 可以直接通过Jenkins添加代理时获取</arguments>
<env name="USERPROFILE" value="C:\Users\username"/>
<env name="USERNAME" value="username"/>
<env name="HOME" value="C:\Users\username"/>
</configuration>
- Jenkins节点环境变量配置(无效)
节点列表 - 配置从节点 - 节点属性 - 键值对列表添加对应的键值
这两种方式均可修改环境变量中的信息,但是ssh连接时均无法使之使用登录用户的.ssh密钥连接。
经过翻查相关资料(bushi),询问AI,得知如下消息:
使用 winsw 启动的 Jenkins 服务默认以系统账户 (Local System) 运行,而不是以特定的用户账户运行。系统账户的默认主目录路径为 C:/Windows/system32/config/systemprofile,因此它会在这个路径下查找 .ssh 目录。
要解决这个问题,你可以通过以下方法之一来修改 Jenkins 服务的运行用户:
方法一:修改 Jenkins 服务的运行用户
-
打开服务管理器:按 Win + R 打开运行对话框。输入 services.msc 并按回车,打开服务管理器。
-
找到 Jenkins 服务:在服务列表中找到 Jenkins 服务。
-
修改服务登录账户:
右键点击 Jenkins 服务,选择“属性”。
切换到“登录”选项卡。
选择“此账户”,然后输入一个具有适当权限的用户账户和密码。
点击“确定”并重新启动 Jenkins 服务。
方法二:配置 Jenkins SSH 密钥路径
在 Jenkins Pipeline 中显式指定 SSH 密钥的路径。这可以通过配置 SSH Agent 插件来实现。
-
安装 SSH Agent 插件:
进入 Jenkins 管理界面,点击“管理 Jenkins” -> “管理插件”。
在“可选插件”选项卡下搜索 SSH Agent 插件并安装。
在 Pipeline 中使用 SSH Agent: -
在 Jenkins Pipeline 脚本中,配置 SSH Agent 插件以使用指定用户的 SSH 密钥。例如:
pipeline {
agent any
stages {
stage('SSH Stage') {
steps {
sshagent(['your-ssh-credentials-id']) {
sh 'your-ssh-command'
}
}
}
}
}
其中,your-ssh-credentials-id 是在 Jenkins 凭据管理中配置的 SSH 密钥的 ID。
以上两种方式前者相对简单,且突然比对了一下之前可正常使用ssh的系统,发现之前确实也这么配置过,但是时间过长忘记了,所以选择第一种方式。
评论区