【问题标题】:Commit file from Jenkins workspace to SVN将文件从 Jenkins 工作区提交到 SVN
【发布时间】:2015-03-22 04:57:45
【问题描述】:

我在 Subversion 存储库中保存了一个项目,并使用 Jenkins 对其进行编译。当我运行构建时,Jenkins 将项目拉入工作区目录。我需要将 Jenkins 工作区中的一个更改文件提交到 Subversion。 我该怎么做??

感谢您的回答...

【问题讨论】:

  • 作为工作的一部分,您可以运行一个 (bash) 脚本,该脚本可以运行 svn commit <yourfile>

标签: svn jenkins commit svn-repository


【解决方案1】:

请看一下这个答案:Jenkins svn commit post-build

应该可以使用新的构建步骤(或构建后步骤)提交。

但请注意 Jenkins 工作区的 SVN 布局。 subversion 插件使用 SVNKit 来处理 SVN 命令。您的工作区可能使用 SVN 布局 1.6。

如果 SVN 客户端在您的计算机上更新,您的 SVN 提交将失败并出现以下错误: org.apache.subversion.javahl.ClientException:工作副本需要升级 svn: Working copy 'C:.... is too old (format 10, created by Subversion 1.6)

【讨论】:

    【解决方案2】:

    你能提供更多细节吗?这个文件到底是什么,为什么需要将它作为 Jenkins 构建的一部分提交?您正在构建什么(Java?C++?.NET?)以及您如何构建它?

    通常,您不应将任何内容置于版本控制之下,除了 source 文件。也就是说,如果你能构建它,你就不应该把它放到版本控制中。很多人喜欢将他们构建的代码提交到他们的版本控制系统中,但这通常是一个很大的错误。二进制文件要大得多,而且很少有差异。这会导致源存储库中 90% 是编译后的代码——几乎所有代码都已过时。这对于无法(轻松)删除过时代码的 Subversion 尤其成问题。

    Jenkins 有一项功能,可让您归档已构建的文件以便于访问。我们一直在使用它。我们构建我们的代码,该程序可在 Jenkins 中下载。更好的是,Jenkins 将删除旧版本(您可以保存最后 X 个版本或仅保存小于 X 天的版本)。如果您有一个发布候选版本,您可以锁定该版本以防止它被删除。


    不过,如果你坚持这样做,你可以做几件事,但你必须注意一些事情:

    1. 当您将 Jenkins 设置为自动构建每个更改,并在版本控制系统中提交更改时,Jenkins 会看到并开始新的构建。然后,Jenkins 保存更改,查看更改并进行另一个构建。确保在 Jenkins 应该进行构建时将文件或目录排除在考虑之外。您可以在指定结帐的 URL 时指定此项。

    2. 与大多数版本控制系统不同,Subversion 独立于客户端。有一个实际的客户端 API。 Jenkins 不需要标准的 Subversion 命令行客户端,因此请确保已安装它。确保安装与 Jenkins 内置 SVNKit 客户端兼容的客户端。尤其如此,因为 Subversion 1.6、1.7 和 1.8 都采用不同的客户端格式。

    3. 您可以向 Jenkins 中的构建添加多个构建步骤。只需添加一个新的 shell 脚本或批处理脚本步骤,然后添加一个svn commit -m "comment of some sort" 步骤。一旦你处理了前两点,这很简单。但是,请仔细考虑为什么要这样做。

    正如我之前所说,在 99.9999% 的情况下,您不应该使用 Jenkins 来提交它构建的更改。我确信 0.0001% 的原因存在于某处,但我从未见过。如果您想让构建文件对您的其他项目普遍可访问,请使用 Jenkins 归档构建文件的能力。

    如果另一个构建需要 Jenkins 正在构建的产品,您可以使用 Copy Artifact Plugin 将构建工件复制到另一个作业,然后启动该作业。更好的是,使用发布存储库系统。在 Java 中,您可以使用 Maven 发布存储库,例如 Nexus 或 Artifactory。要使用工件并将其部署到该存储库,您可以使用 Ivy、Maven 或 Gradle。如果您正在构建 .NET,请查看 Nuget。

    【讨论】:

    • 我看到在构建中提交的一个原因是增加发布版本作为自动发布的一部分。当然,还有其他方法和其他工具可以做到这一点,但它比 10^6 中的 1 更常见 :)
    • 在这种情况下没有理由检查任何东西。您有一个文件,其中包含一个模板字符串,该字符串被替换为某个版本号。在 Subversion 中,您可以使用 Subversion 修订号。更好的是,我们使用 Jenkins 作业名称和内部版本号,因此我们可以返回 Jenkins 构建版本,它向我们展示了测试数据等内容,并帮助我们追溯历史。否则,您所做的只是创建数千个完全不包含有用历史信息的 Subversion 修订。您执行svn log,列出的更改中有 50% 是由于构建造成的。
    • 我当然不建议对每个 CI 构建都进行承诺。显然,我们使用了不同的术语,release build != build。在我描述的情况下,有一个面向公众的“营销”版本号随着每个 release 构建而增加。
    • 我确信这个问题对于某些用例是有效的,并且没有必要进行所有这些教学。或者可能是给某人的,我会把它作为一个旁注。
    【解决方案3】:

    你可以小心使用:

    svn commit -username someuser -password %injected_password% 
    

    要在Build Environment 中注入密码,此命令会将密码作为环境变量注入到构建中

    注意:该密码可能在作业触发器批处理中可见。

    【讨论】:

    • 其实应该是 svn commit --username someuser --password %injected_pa​​ssword% (=选项的双破折号)
    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    相关资源
    最近更新 更多