我在 Subversion 存储库中有一个保存的项目,并用 Jenkins 编译它。当我运行构建时,Jenkins 将项目拉入工作区目录。我需要将 Jenkins 工作区中的一个更改文件提交到 Subversion。我该怎么做??
感谢您的回答...
我在 Subversion 存储库中有一个保存的项目,并用 Jenkins 编译它。当我运行构建时,Jenkins 将项目拉入工作区目录。我需要将 Jenkins 工作区中的一个更改文件提交到 Subversion。我该怎么做??
感谢您的回答...
你能提供更多细节吗?这个文件到底是什么,为什么需要将它作为 Jenkins 构建的一部分提交?你在构建什么(Java?C++?.NET?),你是如何构建它的?
通常,除了源文件之外,您不应将任何内容置于版本控制之下。也就是说,如果你能构建它,你就不应该把它放到版本控制中。很多人喜欢将他们构建的代码提交到他们的版本控制系统中,但这通常是一个很大的错误。二进制文件要大得多,而且很少有差异。这会导致源存储库中 90% 是编译后的代码——几乎所有代码都已过时。这对于没有办法(轻松)删除过时代码的 Subversion 尤其成问题。
Jenkins 有一个功能可以让你归档你构建的文件以便于访问。我们一直在使用它。我们构建我们的代码,该程序可在 Jenkins 中下载。更好的是,Jenkins 将删除旧版本(您可以保存最后 X 个版本或仅保存小于 X 天的版本)。如果你有一个发布候选版本,你可以锁定该版本以防止它被删除。
尽管如此,如果你坚持这样做,你可以做几件事,但你必须注意以下几点:
当您将 Jenkins 设置为自动构建每个更改,并且您在版本控制系统中提交更改时,Jenkins 会看到并开始新的构建。然后,Jenkins 保存更改,查看更改并进行另一个构建。确保在 Jenkins 应该进行构建时将文件或目录排除在考虑之外。您可以在指定结帐的 URL 时指定此项。
与大多数版本控制系统不同,Subversion 是独立于客户端的。有一个实际的客户端 API。Jenkins 不需要标准的 Subversion 命令行客户端,因此请确保已安装它。确保安装与 Jenkins 内置 SVNKit 客户端兼容的客户端。尤其如此,因为 Subversion 1.6、1.7 和 1.8 都采用不同的客户端格式。
您可以在 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。
请看一下这个答案:Jenkins svn commit post-build
应该可以使用新的构建步骤(或构建后步骤)进行提交。
但要小心 Jenkins 工作区的 SVN 布局。subversion 插件使用 SVNKit 来处理 SVN 命令。您的工作区可能使用 SVN 布局 1.6。
如果 SVN 客户端在您的机器上更新,您的 SVN 提交将失败并出现以下错误: org.apache.subversion.javahl.ClientException: The working copy needs to be upgrade svn: Working copy 'C:.... is太旧(格式 10,由 Subversion 1.6 创建)
你可以小心使用:
svn commit -username someuser -password %injected_password%
注入密码Build Environment
,此命令将密码作为环境变量注入构建
注意:该密码可能在作业触发器批处理中可见。