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

Posted chenjinxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简析Jenkins的SVN插件未更新到最新代码相关的知识,希望对你有一定的参考价值。

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

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

 

查阅网上相关内容,有一种说法为:
Jenkins服务器时间与SVN服务器时间不一致,Jenkins的SVN插件是使用时间标签下载,而不是取HEAD,
因此如果svn服务器的提交代码时间比Jenkins的当前时间晚,该代码就不会被更新。
 
所解决问题的方法是:
 
如果jenkins的当前构建时间(也就是jenkins服务器的当前系统时间)比SVN最新一次提交时间记录晚的话,jenkins就不能 checkout 最新提交一次版本,而会 checkout jenkins服务器当前构建时间与SVN提交记录最相近的版本,反正是不能 checkout 出比jenkins当前系统时间早的SVN版本。简单点说就是  svn服务器系统的时间不能比jenkins服务器系统时间早,最好各服务器时间同步。
要注意的是向SVN提交代码的日志记录时间是以SVN服务器当时的时间记录的。
 
只要将Jenkins服务器时间与SVN服务器时间设置成一样的就可以,因为肯定是先向svn提交代码,svn以svn当前系统时间记录此次提交的时间戳,然后再点击构建,在jenkins与svn服务器时间同步的情况下,jenkins当前构建时间一定是包含svn最新一次提交的代码时间戳的,或者说jenkins当前构建时间大于svn服务器系统当前时间。 后面对这个问题专门做了个测试,把svn服务器的系统时间调到比jenkins服务器时间大5分钟,然后再提交一下测试代码到svn,此时svn生成一个版本号及时间戳,紧接着用jenkins构建,发现jenkins不是拉取的刚刚提交的测试代码的版本号。
 
没错,上面是解决了问题,但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选项,截图如下:

技术分享图片

 
由上可见,revision选项有:NUMBER(revision number),‘{‘ DATE‘}‘(时间戳)以及revison关键字(HEAD、BASSE、COMMITTED、PREV)。
 
通过查看Jenkins SVN插件的源码:

WorkspaceUpdater.java部分源码截图如下:

技术分享图片

 
从注释中可以看出获取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修复了下:
 
参考:
 
转自: https://my.oschina.net/donhui/blog/490125



以上是关于简析Jenkins的SVN插件未更新到最新代码的主要内容,如果未能解决你的问题,请参考以下文章

如何用Jenkins实现自动化部署svn更新代码

如何用Jenkins实现自动化部署svn更新代码

利用jenkins打造通过自定义参数更新svn 指定文件任务

jenkins定时任务未生效解决

svn自动更新服务器最新代码

如何用Jenkins实现自动化部署svn更新代码