简析Jenkins的SVN插件未更新到最新代码

在使用Jenkins作持续集成时,遇到Jenkins的SVN插件没有更新到最新的代码的状况。

例如,在代码提交以后就当即使用Jenkins更新代码,结果刚提交的代码没有被更新到,更新到的代码是旧版本的。 html


查阅网上相关内容,有一种说法为:
Jenkins服务器时间与SVN服务器时间不一致,Jenkins的SVN插件是使用时间标签下载,而不是取HEAD,
所以若是svn服务器的提交代码时间比Jenkins的当前时间晚,该代码就不会被更新。
所解决问题的方法是:
只要将Jenkins服务器时间与SVN服务器时间设置成同样的就能够。

没错,上面是解决了问题,但Jenkins的SVN插件是与时间戳相关的SVN revision吗?

查看某个Jenkins Job的构建日志,在使用SVN插件更新代码时,日志以下:
Updating svn://repository_path at revision '2015-08-06T08:48:12.490 +0800'
从上面能够看出来,该次构建相应的revision确实是构建时间戳。

那么,能够让Jenkins的SVN插件更新代码时,设置revision为HEAD吗?
答案是能够的,在SVN URL加@HEAD后缀便可,Jenkins的SVN插件是支持这个的。
在SVN URL加@HEAD后缀后,构建Jenkins Job后日志输出以下:
Updating svn://repository_path@HEAD  at revision HEAD
并且这样确保更新的代码是最新的,不会由于Jenkins服务器与SVN服务器之间的时间差受到影响。
注:HEAD是SVN revision关键字,表示版本库中的最新版本。

经过svn help查看svn checkout/update的帮助文档,关于revision选项,截图以下: java

由上可见,revision选项有:NUMBER(revision number),'{' DATE'}'(时间戳)以及revison关键字(HEAD、BASSE、COMMITTED、PREV)。

经过查看Jenkins SVN插件的源码:

WorkspaceUpdater.java部分源码截图以下: git

从注释中能够看出获取SVN revision的策略:
// for the SVN revision, we will use the first off:
// - a @NNN suffix of the SVN url
// - a value found in a RevisionParameterAction
// - the revision corresponding to the build timestamp

可见,对于SVN revision,按以下优先级获取:
- SVN url的@NNN后缀(@NNN是svn revision)
- RevisionParameterAction中的值,RevisionParameterAction主要用于参数化构建,保持两个build之间revision的一致性
- 构建时间戳相对应的revision

以前,该注释有点小错误,提交了个Pull Request修复了下:

参考:
相关文章
相关标签/搜索