如何让 Linux 上运行的 Jenkins 与 Windows 服务器进行通信?

如何让 Linux 上运行的 Jenkins 与 Windows 服务器进行通信?

我在 CentOS 7.2 上运行 Jenkins 1.6。我有 Windows 2012 服务器,我想从 Jenkins 服务器接收构建。这些 Windows 服务器不在域中。它们安装了 OpenSSH。在 Jenkins 服务器上,我手动创建了此路径(从 Linux 控制台):/home/jenkins/.ssh/

我授予 .ssh 文件夹完全开放的权限。然后,我运行了一个 Jenkins 作业,该作业仅在 Linux 服务器本身上进行。这是一个执行 Shell 作业,使用以下命令:

cd /tmp/
ssh-keygen -t rsa -N "" -f great.key
mv great.key.pub /home/jenkins/.ssh/
mv great.key /home/jenkins/.ssh

这些命令应该为 Jenkins 用户生成一个 SSH 密钥对。我不知道如何使用 Jenkins 用户登录 Linux 服务器。所以我想到了上述方法。

然后我手动将.ssh目录的权限设为600。我将.pub文件的内容复制到Windows服务器上的authorized_keys文件中,具体来说是C:\Users\jenkins.ssh\中的文件

Windows 服务器上的 authorized_keys 文件和 .ssh 文件夹都具有安全权限,其中只有管理员组分别对文件和文件夹具有完全控制权。然后我运行了一个 Jenkins 构建,它是一个 Execute Shell 脚本。以下是三行:

ssh -t -t [email protected]
echo "something" > foo.txt
exit

我在控制台输出中得到这个:

... 权限被拒绝,请重试。... 构建步骤“执行 shell”将构建标记为失败...

如何让 Linux 上运行的 Jenkins 与 Windows 服务器通信?我不想在 Windows 服务器上安装 Cygwin。存在许可证问题。这样做需要时间,而且我认为没有必要。

答案1

要调查发生了什么,请在插件的执行部分和正在运行的脚本中使用一些基本命令。首先,您必须比较部署脚本和工作文件夹的路径。在我的例子中,脚本部署路径是/home/jenkins/deploy,命令执行路径是/home/jenkins。使用dirs命令作为示例。还可以考虑使用绝对路径和/或cd命令。

然后你可能会注意到,在 Windows 中编写的脚本有 CRLF 行尾,而在 Linux 中编写的脚本只有 LF。在这里,解释器在非本地脚本中看到了额外的内容并对其进行处理:

  • Linux 解释器在每个预期的行结束符\r前都会看到多余的字符,并将它们处理为:\n

    • 作为每个命令中的额外参数。它可能会从命令中产生有关意外参数的警告。

      #                            |normal line-end
      echo "something" > foo.txt \r\n
      #      ^arg  pipe^ target^ ^argument of target?
      exit
      
    • 作为空行中的未知命令

      #  |normal line-end
       \r\n
      #^unknown command
      
  • Windows 解释器看到多余的\n字符(并且看不到预期的\r\n),并将它们全部和下一个命令视为第一个命令的一个参数列表

        #                                 |>no line-end
        echo "something" > foo.txt \n exit
        #      ^arg  pipe^ target^ ^---^-arguments of target
    

我使用 Jenkins 的 Publish Over SSH 插件并反转情况:构建机器(源)运行 Windows 而部署机器(目标)运行 Linux(Ubuntu)。

相关内容