在使用Jenkins做持續內建時,遇到Jenkins的SVN插件沒有更新到最新的代碼的情況。
例如,在代碼送出之後就立即使用Jenkins更新代碼,結果剛送出的代碼沒有被更新到,更新到的代碼是舊版本的。
查閱網上相關内容,有一種說法為:
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選項,截圖如下:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-cmbw5CbthzdzJWbsFXZvwVMxATNxITNtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
由上可見,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://github.com/jenkinsci/subversion-plugin/pull/130
參考:
http://blog.chinaunix.net/uid-26598889-id-3402223.html
http://www.tuicool.com/articles/B326v27
https://wiki.jenkins-ci.org/display/JENKINS/Subversion+Plugin
https://github.com/jenkinsci/subversion-plugin
(adsbygoogle = window.adsbygoogle || []).push({});