簡析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修復了下:

參考:
相關文章
相關標籤/搜索