天天看點

簡析Jenkins的SVN插件未更新到最新代碼

在使用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選項,截圖如下:

簡析Jenkins的SVN插件未更新到最新代碼

由上可見,revision選項有:NUMBER(revision number),'{' DATE'}'(時間戳)以及revison關鍵字(HEAD、BASSE、COMMITTED、PREV)。

通過檢視Jenkins SVN插件的源碼:

WorkspaceUpdater.java部分源碼截圖如下:

簡析Jenkins的SVN插件未更新到最新代碼

從注釋中可以看出擷取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({});