将文件从 Jenkins 工作区提交到 SVN

Commit file from Jenkins workspace to SVN

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

感谢您的回答...

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

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

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

如果您机器上的 SVN 客户端更新,您的 SVN 提交将失败并出现以下错误: org.apache.subversion.javahl.ClientException: 工作副本需要升级 svn: 工作副本 'C:.... 太旧(格式 10,由 Subversion 1.6 创建)

你能再说一些细节吗?这个文件到底是什么,为什么需要将其作为 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% 的原因存在 某处 ,但我从未见过。如果你想让你的其他项目普遍访问构建的文件,请使用 Jenkin 的归档构建文件的能力。

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

您可以谨慎使用:

svn commit -username someuser -password %injected_password% 

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

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