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

将文件从Jenkins工作区提交到SVN,svn,jenkins,commit,svn-repository,Svn,Jenkins,Commit,Svn Repository,我在Subversion存储库中保存了一个项目,并用Jenkins编译了它。当我运行构建时,Jenkins将项目拉入工作区目录。我需要将一个已更改的文件从Jenkins workspace提交到Subversion。 我该怎么做 感谢您的回答…请查看此答案: 应该可以使用新的构建步骤(或构建后步骤)提交 但要小心Jenkins工作区的SVN布局。subversion插件使用SVNKit来处理SVN命令。您的工作区可能使用SVN布局1.6 如果SVN客户端在您的计算机上是较新的,则SVN提交将失败

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


感谢您的回答…

请查看此答案:

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

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

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

您能提供更多细节吗?这个文件到底是什么,为什么它需要作为Jenkins构建的一部分提交?你正在构建什么(java?C++?.NET),你是如何构建的? 通常,除了源文件,您不应该将任何内容置于版本控制之下。也就是说,如果您可以构建它,就不应该将其放入版本控制中。很多人喜欢将自己构建的代码提交到版本控制系统中,但这通常是一个很大的错误。二进制文件要大得多,而且很少有差异。这导致源代码存储库中90%的代码都是编译过的——几乎所有的代码都过时了。这对于Subversion尤其有问题,因为Subversion无法(轻松)删除过时的代码

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


尽管如此,如果你坚持这样做,有几件事你可以做,你必须注意:

  • 当Jenkins设置为自动生成每个更改,并在版本控制系统中提交更改时,Jenkins将看到这一点,并开始新的生成。然后,Jenkins保存更改,查看更改,并执行另一个构建。当Jenkins应该进行构建时,请确保将文件或目录从Jenkins的考虑范围中排除。您可以在指定签出的URL时指定此项

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

  • 您可以在Jenkins中将多个构建步骤添加到您的构建中。只需添加一个新的shell脚本或批处理脚本步骤,并添加一个
    svncommit-m“comment of some sort”
    步骤。一旦你注意到了前两点,就很容易做到。但是,请仔细想想你为什么要这样做

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


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

    您可以仔细使用:

    svn commit -username someuser -password %injected_password% 
    
    要在
    生成环境中注入密码,此命令将密码作为环境变量注入生成


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

    作为作业的一部分,您可以运行(bash)脚本,该脚本可以运行
    svn commit
    。我看到在生成中提交的一个原因是,作为自动发布的一部分,增加发布版本。当然,还有其他方法和其他工具,但它比十分之一更常见:)在这种情况下,没有理由签入任何内容。您有一个包含模板字符串的文件,该字符串将被替换为某个版本号。在Subversion中,可以使用Subversion版本号。更好的是,我们使用Jenkins作业名称和构建编号,这样我们就可以返回Jenkins构建,它向我们显示测试数据之类的内容,并帮助我们跟踪历史。否则,您所做的就是创建数千个Subversion修订版,其中绝对不包含任何有用的历史信息。您执行了一个
    svn日志
    ,列出的更改中有50%是由于构建引起的。我当然不建议对每个CI构建进行提交。显然,我们使用的是不同的术语,发布版本!=建造。在我描述的案例中,有一个面向公众的“营销”版本号,它随着每个发布版本的增加而增加。我确信这个问题对于某些用例是有效的,并且所有这些教学都是不必要的。或者可能是某人,我把它作为旁注。实际上它应该是svn commit--username someuser--password%injected\u password%(=选项的双破折号)