51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

通过WinSW添加Jenkins代理服务出现帐号权限问题

之前在做一个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>

                      </code>
                    </pre>
    
    • Jenkins节点环境变量配置(无效)

    节点列表 - 配置从节点 - 节点属性 - 键值对列表添加对应的键值

    这两种方式均可修改环境变量中的信息,但是ssh连接时均无法使之使用登录用户的.ssh密钥连接。

    经过翻查相关资料(bushi),询问AI,得知如下消息:

    使用 winsw 启动的 Jenkins 服务默认以系统账户 (Local System) 运行,而不是以特定的用户账户运行。系统账户的默认主目录路径为 C:/Windows/system32/config/systemprofile,因此它会在这个路径下查找 .ssh 目录。

    要解决这个问题,你可以通过以下方法之一来修改 Jenkins 服务的运行用户:

    方法一:修改 Jenkins 服务的运行用户 {#方法一修改-jenkins-服务的运行用户}

    1. 打开服务管理器:按 Win + R 打开运行对话框。输入 services.msc 并按回车,打开服务管理器。

    2. 找到 Jenkins 服务:在服务列表中找到 Jenkins 服务。

    3. 修改服务登录账户: 右键点击 Jenkins 服务,选择"属性"。 切换到"登录"选项卡。 选择"此账户",然后输入一个具有适当权限的用户账户和密码。 点击"确定"并重新启动 Jenkins 服务。

    方法二:配置 Jenkins SSH 密钥路径 {#方法二配置-jenkins-ssh-密钥路径}

    在 Jenkins Pipeline 中显式指定 SSH 密钥的路径。这可以通过配置 SSH Agent 插件来实现。

    1. 安装 SSH Agent 插件: 进入 Jenkins 管理界面,点击"管理 Jenkins" -> "管理插件"。 在"可选插件"选项卡下搜索 SSH Agent 插件并安装。 在 Pipeline 中使用 SSH Agent:

    2. 在 Jenkins Pipeline 脚本中,配置 SSH Agent 插件以使用指定用户的 SSH 密钥。例如:

                         pipeline {
       agent any
       stages {
           stage('SSH Stage') {
               steps {
                   sshagent(['your-ssh-credentials-id']) {
                       sh 'your-ssh-command'
                   }
               }
           }
       }
      

      }

                       </code>
                     </pre>
      

      其中,your-ssh-credentials-id 是在 Jenkins 凭据管理中配置的 SSH 密钥的 ID。

      以上两种方式前者相对简单,且突然比对了一下之前可正常使用ssh的系统,发现之前确实也这么配置过,但是时间过长忘记了,所以选择第一种方式。

赞(0)
未经允许不得转载:工具盒子 » 通过WinSW添加Jenkins代理服务出现帐号权限问题