我在Subversion存储库中有一个已保存的项目,并使用Jenkins编译它。当我运行构建时,Jenkins将项目拉入工作区目录。我需要将一个从Jenkins工作区更改的文件提交到Subversion。 我该怎么办?
感谢您的回答......
答案 0 :(得分:6)
你能提供一些细节吗?究竟是什么文件,为什么它需要作为Jenkins构建的一部分提交?你在构建什么(Java?C ++ ?. NET?),你是如何构建它的?
通常情况下,除了 source 文件外,不应将任何内容置于版本控制之下。也就是说,如果你可以构建它,你不应该把它放到版本控制中。很多人喜欢将他们构建的代码提交到他们的版本控制系统中,但这通常是一个很大的错误。二进制文件更大,很少差异。这导致一个源存储库是90%的编译代码 - 几乎所有代码都已过时。这对于Subversion来说尤其成问题,因为Subversion没有办法(轻松地)删除过时的代码。
Jenkins有一项功能,允许您存档您构建的文件,以便于访问。我们一直都在使用这个。我们构建了我们的代码,该程序在Jenkins中可用于下载。更好的是,Jenkins将删除旧版本(您可以保存最后的X版本或仅保存不到X天的版本)。如果你有一个候选版本,你可以锁定该版本以防止它被删除。
尽管如此,如果你坚持这样做,你可以做几件事情和你必须注意的事情:
当Jenkins设置为自动构建每个更改,并且您在版本控制系统中提交更改时,Jenkins将会看到,并开始新的构建。然后,Jenkins保存更改,查看更改,并执行另一个构建。确保在应该进行构建时从Jenkins的考虑中排除文件或目录。您可以在指定结帐的URL时指定此内容。
与大多数版本控制系统不同,Subversion与客户端无关。客户端有一个实际的API。 Jenkins中不需要标准的Subversion命令行客户端,因此请确保已安装。确保安装与SVNKit客户端内置的Jenkins兼容的客户端。由于Subversion 1.6,1.7和1.8都采用不同的客户端格式,因此尤其如此。
您可以在Jenkins的构建中添加多个构建步骤。只需添加新的shell脚本或批处理脚本步骤,然后添加svn commit -m "comment of some sort"
步骤即可。一旦你处理了前两点,这很简单。但是,请仔细考虑为什么要这样做。
正如我之前所说,99.9999%的时间,你不应该使用Jenkins来提交它所构建的更改。我确信0.0001%的理由存在某处,但我从未见过它。如果要使其他项目可以普遍访问构建文件,请使用Jenkin存档构建文件的功能。
如果另一个版本需要构建Jenkins产品,您可以使用Copy Artifact Plugin将构建工件复制到另一个作业,然后启动该作业。更好的是,使用发布存储库系统。在Java中,您可以使用像Nexus或Artifactory这样的Maven版本库。要使用工件并将工件部署到该存储库,可以使用Ivy或Maven或Gradle。如果您正在构建.NET,请查看Nuget。
答案 1 :(得分:2)
请查看以下答案:Jenkins svn commit post-build
应该可以使用新的构建步骤(或构建后步骤)进行提交。
但要小心Jenkins工作区的SVN布局。 subversion插件使用SVNKit来处理SVN命令。您的工作区可能使用SVN布局1.6。
如果SVN客户端在您的计算机上更新,则SVN提交将失败,并显示以下错误: org.apache.subversion.javahl.ClientException:需要升级工作副本 svn:工作副本'C:....太旧了(格式10,由Subversion 1.6创建)
答案 2 :(得分:0)
你可以小心使用:
svn commit -username someuser -password %injected_password%
在Build Environment
中注入密码,此命令将密码作为环境变量注入构建
注意:该密码可能在作业触发批处理中可见。