【问题标题】:jenkins subversion tagging multiple repositories詹金斯颠覆标记多个存储库
【发布时间】:2016-10-04 04:02:53
【问题描述】:

我在 jenkins 有一个使用 ant 编译 java 代码的项目。 我有 2 个 SVN 存储库 - 一个用于源代码文件,一个用于编译文件。 我正在使用 subversion 插件从 SVN 更新源文件和编译文件。 在构建过程结束时,我想将编译后的文件提交到存储库并在该存储库中创建一个标签。

我正在使用 Subversion Tagging Plugin ,它设法在已编译文件存储库中标记已编译文件,但随后它还尝试将源文件标记到已编译文件存储库(并且由于插件不支持而失败)。 我找不到一种方法来告诉标记插件只标记已编译的文件。 关于如何完成的任何想法?

附:我知道不建议将编译后的文件保存在 SVN 中,但出于各种原因我需要这样做。

【问题讨论】:

  • 插件似乎为每个 subversion 更新创建了一个标签。

标签: svn jenkins build build-process jenkins-plugins


【解决方案1】:

也许解决方案是将您的工作分成两份工作:

  1. Job 1 同步源文件并编译它们
  2. 作业 2 获取作业 1 的工作空间(使用 Clone Workspace SCM Plugin
  3. 通过批处理/shell 构建步骤,作业 2 在 SVN 中提交已编译的文件

【讨论】:

    【解决方案2】:

    不要将编译后的代码提交到 Subversion!

    Subversion 是一个 Source 存储库。如果源代码在 Subversion 存储库中,您应该能够重建已编译的代码。因此,理论上,如果您有良好且可重复的构建和部署实践。

    在源代码库中不包含编译后的代码有几个明确的理由:

    • 编译后的代码占用大量空间:想象一家公司提交编译后的代码。源文件主要是基于文本的。另外,大多数版本控制系统以某种 diff 格式存储源文件,其中只记录已更改的行。在存储二进制文件时——例如编译后的代码——大多数版本控制系统必须存储整个二进制文件。在短时间内,二进制代码占据了 repo 中的绝大部分空间。

      在我来到这里之前,我的公司正在存储构建的二进制代码。我们的 Subversion 存储库大小为 30 Gb,我估计至少 26 Gb 只是编译后的二进制文件。如果我没有停止这种做法,我们的 Subversion 存储库现在将超过 80 Gb。在这里工作两年多后,我们的 Subversion 存储库已从 28 Gb 增长到 30 Gb,尽管我们现在做的工作比以往任何时候都多,项目也更多。

    • 编译的代码在源代码库中毫无意义:想象一个站点使用某种机制将文件备份为源代码库。例如,一个使用 Netapps 每分钟拍摄一次快照的站点。您现在拥有源存储库中每个文件的完整版本。为什么这不是一个好的源代码控制系统?

      因为源代码控制不仅仅是版本控制文件。您会看到谁进行了更改以及为什么进行了更改。您可以删除更改。您可以在分支上工作并合并更改。编译后的代码告诉你什么?谁编译了代码,而不是谁进行了更改,如果您使用的是 Jenkins,那么您得到的只是 Jenkins 进行了更改。您看不到编译源的一个版本和另一个版本之间的区别。你看不出发生了什么变化或为什么。您不能合并两个编译代码分支之间的差异。您的版本控制系统的所有功能都毫无用处。

    • 编译后的代码使用寿命很短:在源代码中,我对代码的兴趣会随着时间的推移而回溯。我可以看到谁做了什么改变以及为什么。我可以指向一条特定的线,并一直追溯这段历史。我见过开发人员通过查看几个月、几年前的代码并跟踪其历史来追踪错误。编译后的代码几乎立即失效。想象一下,您创建了 1.0 版代码。六个月后,您发布了 1.5 版并将您的客户群转移到此新代码。现在,不再需要 1.0 版,但在 Subversion 中,您无法将其从存储库中删除。它仍然会阻塞磁盘空间。

    因此,编译代码会在您的存储库中占用大量空间,很快就会过时,而且您无法使用使源代码管理如此有用的强大工具。

    那么,如果您不使用 Subversion,您将编译后的代码存储在哪里?

    一个地方在詹金斯本身。 Jenkins 编译时,可以保存编译的工件。即使您让 Jenkins 只保留最后几个构建工件,您也可以使用锁定机制来永久保留已编译的工件。您还可以使用各种 Jenkins 插件来使用元信息标记构建本身。我们使用它来跟踪特定 Jenkins 构建的部署位置,以及哪个 Jenkins 构建被标记

    如果您使用 Java,您应该使用 Maven 存储库来存储您想要保留和安装的 Jars 和其他工件。如果您使用 Ant 进行构建,请查看 Ivy 插件,它允许 Ant 构建从 Maven 本身存储和获取工件。如果您正在进行 .NET 构建,请查看 NuGet,它类似于 Maven 的存储库结构,但它是专门为 .NET 项目制作的。

    如果这些都不适用,您可以使用 Curl、WGet、SFTP、SCP 等工具从标准文件系统存储和检索您构建的工件。 Jenkins 有各种插件可以帮助您完成这项任务。

    所以,不要在 Subversion 中存储二进制文件。使用部署系统来存储二进制文件。部署系统的重量比源代码控制系统轻,并且允许您轻松修剪过时的工件。如果您使用 Java,则可以使用 Artifactory 或 Nexus 创建本地 Maven 存储库。所有 Java 构建系统都可以支持从本地 Maven 存储库获取和检索工件。如果您使用 .NET,请使用直接集成在项目文件中的 NuGet。如果不出意外,请使用 SSH 或 WGet 来存储和检索工件。

    【讨论】:

      【解决方案3】:

      在詹金斯, SVN_URL 是作业中使用的变量名称。

      如果作业中使用了 2 个存储库,则定义为, SVN_URL1SVN_URL2

      如果作业的标记字段中未使用“../tags/”,Subversion 标记始终以 SVN_URL2 路径为目标。

      因此,在定义 Jenkins 作业时,您要标记为 2nd checkout 的 repo 应该是“Source Code Mgmt”部分中的第二个模块(添加模块)。

      【讨论】:

        猜你喜欢
        • 2013-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-13
        • 1970-01-01
        • 2018-06-19
        • 1970-01-01
        • 2014-02-28
        相关资源
        最近更新 更多