有什么方法可以在 Jenkins 作业中指定外部的 svn 修订版?

Any way to specify the svn revision of externals in a Jenkins job?

假设我有这样的svn结构:

svn://myhost/repository_main
svn://myhost/repository_ext

这两个版本库的修订号是孤立的.

现在我在 svn://myhost/repository_main/foo 上设置了一个 svn:externals:

svn://myhost/repository_main/foo --> svn://myhost/repository_ext/bar

然后在 Jenkins 中我有一份使用 svn://myhost/repository_main 的工作,我可以指定要更新的修订号,如:

svn://myhost/repository_main@REVISION

当 Jenkins 将更新 /repository_main/foo 修订版 REVISION 时,它总是更新到 repository_ext/barHEAD 修订版。

有什么方法可以让我不仅可以指定 main 的修订版,还可以指定 ext 的修订版?

externals 机制使用它自己指定的修订版。这与詹金斯无关。即使没有 Jenkins(通过浏览器或您的 SVN 客户端),如果您尝试从具有指定修订版的 repository_main 中检出,它将需要 HEAD for repository_ext

externals 是一个 SVN 属性。它指定了两件事:

  1. 远程(外部)位置
  2. 那个位置的修订

如果您将 属性 配置为远程 HEAD,它将始终是远程位置的 HEAD,即使您转到 main 的先前版本也是如此。将其视为具有值的本地文件。如果文件在 main 修订版 100 中具有值 remote@HEAD 并且此后没有更改,当您处于 main 修订版 200 时,值该文件仍然是 remote@HEAD。当您转到 main 修订版 199 时,该文件仍指向 remote@HEAD

您的另一种选择是将 external 锁定到特定修订版,即 remote@123,但随后它将 始终 处于 [=29] =] 修订版,同样与 main 修订版无关。

如果您在 main 中的代码修订与适当的 ext 修订之间存在硬依赖关系,那么您的 externals 属性 不应指向 HEAD 的远程,但在指定的版本。您将需要一些过程来使 属性 更新为最新的所需修订。 如果你这样做,你的 external 属性 可能 remote@123main 修订版 100,然后 remote@456main 修订版150 然后 remote@789main 修订 200.

只有在这种情况下,指定 main 修订才会影响获取的外部存储库的修订。

选择:
作为一个完整的解决方法(上面描述的是 SVN 希望您使用它的方式),您可以为 "externals revision" 使用 Jenkins 参数。然后在 SCM 步骤中,告诉 Jenkins 忽略外部因素。然后在构建步骤中,手动解析外部值 属性,找出远程位置,并使用您在参数中指定的修订从该位置手动检出。