【问题标题】:SVN command line in jenkins fails due to server certificate mismatchjenkins 中的 SVN 命令行由于服务器证书不匹配而失败
【发布时间】:2012-08-10 16:48:12
【问题描述】:

当我从 Jenkins shell 运行 svn 命令行时,我得到了这个错误:

 D:\Jenkins\jobs\Merge Trunk to Stable\workspace\stable>svn up --trust-server-cert --non-interactive 
 Updating '.':
 svn: E175002: Unable to connect to a repository at URL 'https://xxx/stable'
 svn: E175002: OPTIONS of 'https://xxx/stable': Server certificate verification failed: certificate issued for a different hostname,  issuer is not trusted (https://xxx)

但是当我从命令行 CMD 窗口运行相同的命令时,就可以了:

 D:\Jenkins\jobs\Merge Trunk to Stable\workspace\stable>svn up
 Updating '.':
 At revision 1797.

 D:\Jenkins\jobs\Merge Trunk to Stable\workspace\stable>svn up --trust-server-cert --non-interactive
 Updating '.':
 At revision 1797.

知道怎么解决吗?

【问题讨论】:

  • 您需要在某处添加该服务器的服务器指纹吗?
  • 我不知道。我实际上不明白这个问题......我知道服务器证书名称不匹配。它以前没有给我带来任何问题。
  • 我想到了 Tortoise/Network/Subversion 服务器文件中的内容;那里可能缺少设置,但这只是猜测。
  • 不是乌龟SVN客户端,是collabnet的CLI客户端。
  • 您能否在每种情况下都使用--verbose 标志运行它以获取更多信息?但就像@fduff 所说,听起来两者之间的某些配置(在文件或环境变量中)是不同的。

标签: svn jenkins


【解决方案1】:

相当老的问题,但仍然很活跃。

如您所知,问题在于接受的证书缓存(以及用户名/密码缓存)是每个用户的,并且由于 Jenkins 以不同的用户身份运行(很可能是 SYSTEM),因此它不知道您的常规用户缓存。

并非所有 SVN 客户端都允许您在那里执行“echo p”操作(它对我不起作用),--trust-server-cert 在这种情况下显然也不起作用。

对我有用的是open a console window as SYSTEM,并在那里进行交互式的接受证书-登录-密码舞蹈。

由于所有这些都被缓存了,你只需要这样做一次,从那时起,所有svn up和类似的请求都可以工作。

【讨论】:

  • plusone - 三年后,仍然是一个问题,你的回答救了我!谢谢。
  • 在windows服务本身中,将“登录”从系统更改为用户。如果该用户可以在命令中使用 svn,那么服务也应该如此。这是我为解决问题所做的(类似于首先将 svn 作为系统运行,但感觉不像是 hack)
【解决方案2】:

我终于设法解决了这个问题!我所做的只是简单地放入 Jenkins 脚本中:

echo p | svn up --username <usr> --password <pwrd>

这解决了它!因为 echo 模拟了手动输入以永久接受证书。

根本原因是 Jenkins shell 脚本在 Windows 服务用户下运行 - 因此用户配置文件缓存使用不同的位置(在 C:\Windows\System32\config\systemprofile\AppData\Roaming\Subversion 而不是 %USERPROFILE%\AppData\Roaming\Subversion\

【讨论】:

    【解决方案3】:

    echo p | svn commands

    在 Jenkins windows 批处理命令提示符下工作得很好。这样做一次将永久接受 Jenkins 用户在 Build 框中的证书。

    【讨论】:

      【解决方案4】:

      即使您接受了证书,也可能发生这种情况。

      在 Linux 中,Jenkins 使用自己的用户名。你可以使用命令sudo su jenkins切换到jenkins用户,然后使用命令cd ~ls查看jenkins用户的根路径。对我来说,它是 jenkins 安装路径(var/lib/jenkins)。

      您可以在您的用户包中看到.subversion 包。如果您之前接受过证书,您可以在 .subversion 中看到 auth 包。

      将整个.subversion包复制到jenkins安装包(jenkins用户的根路径)。

      再试一次,在 jenkins shell 中使用svn up 命令就可以了。

      我的英语很差,感谢您的阅读。

      【讨论】:

        【解决方案5】:

        也许,证书颁发给不同的主机名(不是 xxx,而是类似 xxx.yourcompany.com)。如果是,则使用此主机名进行干净的结帐。

        【讨论】:

          【解决方案6】:

          通过 Jenkins 在 slave 上运行 Svn 命令给我带来了困难。我做了以下事情:

          如果您使用的是 unix,请点击此链接:http://www.microhowto.info/howto/configure_subversion_to_trust_a_given_ssl_certificate.html

          如果您使用的是 Windows,请执行以下操作:

          cd %APPDATA%\Subversion\
          

          然后编辑该目录中的 server 文件,方法是从 ssl-authority-files 元素中删除 # 符号,并更新您存储 ssl 证书文件的路径。

          如果您希望使用它来存储您的凭据,还可以更改以下内容。

          store-passwords = yes 
          store-ssl-client-cert-pp = yes
          

          完成后,您还需要按照Add the Cert to the Trusted Root CA Store 将证书添加到您的 Windows 机器

          【讨论】:

            【解决方案7】:

            这似乎是一个可怕的答案,但在用尽其他答案后,由于其他问题对我不起作用,我选择了更改 SVN 服务器以不使用 SSL 的路线。

            这只是一个选项,因为我刚刚设置了这台服务器,它位于一个完全内部的网络上,但它确实完全消除了这个问题。而且我已经没有其他选择和时间了。

            我也只是建议这样做,以防有人没有意识到它甚至是一种选择。无论服务器暴露如何,使用 SSL 都会让我感觉好很多。

            【讨论】:

              【解决方案8】:

              Jenkins 和 Window 7 有同样的问题。 我通过进入服务并选择 Jenkins 并转到登录并输入管理凭据并重新启动 jenkins 服务来解决此问题。

              希望这能解决您的问题。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-12-30
                • 2017-04-11
                • 1970-01-01
                • 2011-07-07
                • 1970-01-01
                • 1970-01-01
                • 2014-01-31
                • 2018-10-20
                相关资源
                最近更新 更多