【问题标题】:SVN externals and automated buildSVN 外部和自动构建
【发布时间】:2010-11-17 22:51:48
【问题描述】:

我有一个项目使用 SVN 外部来包含一些东西(实际上是 MSBuild 社区任务,但这是切题的)。外部存储库需要用户名“guest”但没有密码。

我设置了一个 externals 属性,这在本地执行 SVN 更新时非常有效。当我的 TeamCity 持续集成构建运行时,问题就出现了。 TeamCity 尝试检查外部资源和阻塞,因为它不知道用户名。

我尝试在 TeamCity 中将外部定义为单独的 SVN 根,但这不起作用,所以我认为这不是解决方案。

那么我该如何做呢?如何让 TeamCity 知道它需要登录外部 SVN 存储库?

【问题讨论】:

  • 我实际上通过简单地将外部内容导入到我的存储库中解决了这个问题。这是少量的东西,这只是最简单的方法,但这样做违背了原则。
  • 更新:4 年后,这个问题现在完全无关紧要了。我们现在使用 GIT 进行版本控制,使用 NuGet 来管理 3rd 方依赖项。如果某些东西没有 NuGet 包,我们会创建自己的包并从我们的 TeamCity 服务器发布它。这么短的时间发生了这么大的变化!成为一名软件工程师是一个激动人心的时刻。

标签: svn build tortoisesvn teamcity


【解决方案1】:

身份验证信息存储在运行程序的用户本地的配置文件中。或者至少,它可以配置为这样做。

我敢打赌,TeamCity 的代理程序在与您登录机器​​的用户不同的用户下运行。如果是这样,您应该尝试使用相同的用户登录机器,然后对临时目录执行svn checkout 并填写用户名和密码。这将被缓存,因此当 TeamCity 在同一用户下运行 SVN 时,它应该重用该信息。

【讨论】:

  • 我猜这是一种方式,但它似乎不是很健壮。例如,对于每个外部引用,我必须在每个构建代理上执行此操作。另外,缓存的凭据可能会被清理,等等。我真的希望也许有一种方法可以在设置或配置文件中以声明方式执行此操作。
【解决方案2】:

我从未使用过 TeamCity,但使用过其他 CI 工具。

而不是让 TeamCity 轮询 svn 存储库以获取新修订。也许有一个提交后挂钩调用 TeamCity,但在此之前,让它运行一个 ant 脚本,该脚本 svn 更新 TeamCity 服务器的本地目录。第一次结帐到此目录时,您应该有机会设置外部。

【讨论】:

  • 感谢您的建议,但我认为这太混乱了,并且会使 TeamCity 围绕 VCS 集成和构建触发的许多不错的功能短路。另外,构建代理运行在与 TeamCity 服务器不同的机器上,因此检查到硬编码目录可能不太容易维护。我正在尝试尽可能减少对固定位置的依赖。
【解决方案3】:

如果不需要密码,只需要用户名,那么您可以在 servers 配置文件中轻松设置(在 Windows 上,它位于 %APPDATA%\Subversion\servers)。

指定服务器,然后设置“用户名”选项。例如:

[groups]
communitytasks = *.comunityserver.com

[communitytasks]
username = guest

【讨论】:

  • 让我看看我是否理解正确。你是说我需要在 my SVN 服务器上执行此操作,即使外部服务器在其他人的服务器上?我可能误解了外部的工作原理。我在想客户端检查了外部,但你的建议是 服务器 出去并获取外部,对吗?
  • 不,获取外部数据的不是服务器。但是 svn clients 也使用了一个“服务器”文件 - 这是配置所有网络内容以及如何访问这些内容的地方。而且由于客户端访问外部,你必须在那里配置它。
  • 我遇到了完全相同的问题(除了我确实需要指定密码)。我查看了服务器文件,但只看到设置代理用户名和密码的选项。如何指定存储库用户名和密码?
【解决方案4】:

TeamCity 使用来自 SVN 客户端的缓存身份验证信息来访问外部。除了从命令行客户端访问远程服务器、在本地缓存凭据并让 TeamCity 使用它们之外,没有其他方法可以指定外部身份验证信息(在 TeamCity SVN 设置中,有一个复选框是否使用存储的 SVN 设置)

【讨论】:

    【解决方案5】:

    不特定于 TeamCity,但如果您需要在签出 svn:externals 存储库时指定要使用的用户名:

    svn:externals 属性中,不要指定用户名:

    the_vendor_dir     svn+ssh://hostname/path/to/repo
    

    默认情况下,结帐将使用当前用户的用户名。要使用不同的用户名:

    ~/.subversion/config:
    [tunnels]
    ssh = $SVN_SSH ssh -ljdoe
    

    这将导致 Subversion 使用jdoe 作为任何未指定用户名的svn+ssh 隧道的用户名。

    除了在 Subversion 级别更改 svn+ssh 隧道,您还可以在 SSH 级别更改它:

    ~/.ssh/config:
    Host svn.example.com
       User jdoe
    

    Stefan 上面关于 ~/.subversion/servers 的回答对我不起作用,而且似乎也不应该起作用,因为该文件中没有记录 username 设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多