hudson獲取不到最新的程式碼
簡單的說就是 Hudson 的 Subversion 是根據時間戳來獲取程式碼(只獲取比Hudson 伺服器當前時間早的程式碼)。如果Hudson 伺服器和 Subversion 伺服器上的時間不同步,尤其是Hudson 伺服器慢於 Subversion 伺服器就會產生問題(問題是某些在 Hudson 伺服器上的時間之後的change 不能被同步下來)。
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hudson中subversion HEAD check out 的問題及疑惑
近期發現一個問題,hudson執行任務時,經常不能獲取到最新的程式碼,從而導致出現各種問題。
日常開發中的典型例子:發現一個bug,修改程式碼,本地測試通過,提交程式碼到subversion,手工啟用hudson構建,原本期望hudson獲取到剛剛提交的程式碼並測試/打包/釋出。結果事與願違,測試的結果發現剛剛做出的修改似乎沒有生效。正費解之時,再執行一次hudson構建,又成功了...
經歷過幾次上述蹊蹺遭遇之後,發現這個問題不是偶然。之後檢查hudson的日誌,發現問題的發現在最開始update / check out subversion程式碼時,明明已經提交的程式碼,hudson做update / check out時,居然沒有update / check out下來!顯示的subversion版本號也和subversion上實際的最新版本不一致,hudson總是要小一些,換言之,hudson update / check out的程式碼要比當前最新程式碼老一些。
google一番,發現這個問題之前就有人遭遇過,hudson上甚至已經有了好幾個關於這個問題的bug,比如 http://issues.hudson-ci.org/browse/HUDSON-1241 "force using HEAD SVN version for build"。問題的根源在於hudson 獲取subversion程式碼的方式,hudson是通過時間戳的方式來獲取程式碼,而不是我們一般認為的"最新程式碼"即"HEAD"。這種方式通常沒有問題,因為獲取當前時間戳,然後要求update / checkout這個時間戳前的程式碼,理論上也是可以拿到最新程式碼的。
但是,如果hudson所在的伺服器和subversion伺服器時間不一致,這個機制就會出現問題:
我們假設subversion伺服器的時間是準確的,再假設當時時間是15:10分,開發人員A提交程式碼,subversion上當前這個最新提交的程式碼時間戳為15:10:00。然後開發人員A手工啟用hudson進行構建。hudson在15:10:20時開始check out程式碼。如果hudson時間無誤,則hudson會發出請求說要求獲取時間戳在15:10:20之前的程式碼,這樣這個實際提交時間為15:10:00的新程式碼就可以如期的被check out。但是如果hudson的時鐘有誤,由於某些原因導致時鐘偏慢2分鐘,即在hudson上,"當前時間"為"15:08:20",則hudson獲取程式碼的請求為:獲取時間戳為15:08:20之前的程式碼,此時時間戳為15:10:00的新程式碼就無法checkout。
幾分鐘之後,疑惑的開發人員A再次啟用hudson再次構建,假設此時時間時間是15:15:00,hudson慢兩分鐘為15:13:00。此時hudson發出請求: 獲取時間戳為15:13:00之前的程式碼, 因此實際提交時間為15:10:00的新程式碼可以正常checkout,問題又在不知不覺被迴避了。
總結說,hudson 獲取程式碼的機制不是我們直覺中的獲取最新程式碼(即subversion中HEAD checkout),而是基於時間戳。由於這個方式通常如HEAD般工作,因此我們總是容易誤解為是獲取最新程式碼。當hudson的時鐘晚於subversion時,悲劇就出現了。
對這個問題,有幾點疑惑:
1. 不明白為什麼hudson不採用最直接最簡單最容易被人理解最不容易出誤解的HEAD checkout,而要基於時間戳
2. 這個問題很早就發生了,上面提到的bug 08年就被人提出, "Created: 31/Jan/08 05:37 AM Updated: 01/Jul/10 11:06 AM",三年了類似的bug被多次提出,但是就是始終沒有修復。
修復的方式很簡單,就改一個類的一行程式碼
in Class: hudson.scm.SubversionSCM
line 377:
final SVNRevision revision = SVNRevision.create(timestamp);
replace to:
final SVNRevision revision = SVNRevision.HEAD;
hudson拒絕修復的理由是什麼?
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hudson中subversion HEAD check out 的問題及疑惑
近期發現一個問題,hudson執行任務時,經常不能獲取到最新的程式碼,從而導致出現各種問題。
日常開發中的典型例子:發現一個bug,修改程式碼,本地測試通過,提交程式碼到subversion,手工啟用hudson構建,原本期望hudson獲取到剛剛提交的程式碼並測試/打包/釋出。結果事與願違,測試的結果發現剛剛做出的修改似乎沒有生效。正費解之時,再執行一次hudson構建,又成功了...
經歷過幾次上述蹊蹺遭遇之後,發現這個問題不是偶然。之後檢查hudson的日誌,發現問題的發現在最開始update / check out subversion程式碼時,明明已經提交的程式碼,hudson做update / check out時,居然沒有update / check out下來!顯示的subversion版本號也和subversion上實際的最新版本不一致,hudson總是要小一些,換言之,hudson update / check out的程式碼要比當前最新程式碼老一些。
google一番,發現這個問題之前就有人遭遇過,hudson上甚至已經有了好幾個關於這個問題的bug,比如 http://issues.hudson-ci.org/browse/HUDSON-1241 "force using HEAD SVN version for build"。問題的根源在於hudson 獲取subversion程式碼的方式,hudson是通過時間戳的方式來獲取程式碼,而不是我們一般認為的"最新程式碼"即"HEAD"。這種方式通常沒有問題,因為獲取當前時間戳,然後要求update / checkout這個時間戳前的程式碼,理論上也是可以拿到最新程式碼的。
但是,如果hudson所在的伺服器和subversion伺服器時間不一致,這個機制就會出現問題:
我們假設subversion伺服器的時間是準確的,再假設當時時間是15:10分,開發人員A提交程式碼,subversion上當前這個最新提交的程式碼時間戳為15:10:00。然後開發人員A手工啟用hudson進行構建。hudson在15:10:20時開始check out程式碼。如果hudson時間無誤,則hudson會發出請求說要求獲取時間戳在15:10:20之前的程式碼,這樣這個實際提交時間為15:10:00的新程式碼就可以如期的被check out。但是如果hudson的時鐘有誤,由於某些原因導致時鐘偏慢2分鐘,即在hudson上,"當前時間"為"15:08:20",則hudson獲取程式碼的請求為:獲取時間戳為15:08:20之前的程式碼,此時時間戳為15:10:00的新程式碼就無法checkout。
幾分鐘之後,疑惑的開發人員A再次啟用hudson再次構建,假設此時時間時間是15:15:00,hudson慢兩分鐘為15:13:00。此時hudson發出請求: 獲取時間戳為15:13:00之前的程式碼, 因此實際提交時間為15:10:00的新程式碼可以正常checkout,問題又在不知不覺被迴避了。
總結說,hudson 獲取程式碼的機制不是我們直覺中的獲取最新程式碼(即subversion中HEAD checkout),而是基於時間戳。由於這個方式通常如HEAD般工作,因此我們總是容易誤解為是獲取最新程式碼。當hudson的時鐘晚於subversion時,悲劇就出現了。
對這個問題,有幾點疑惑:
1. 不明白為什麼hudson不採用最直接最簡單最容易被人理解最不容易出誤解的HEAD checkout,而要基於時間戳
2. 這個問題很早就發生了,上面提到的bug 08年就被人提出, "Created: 31/Jan/08 05:37 AM Updated: 01/Jul/10 11:06 AM",三年了類似的bug被多次提出,但是就是始終沒有修復。
修復的方式很簡單,就改一個類的一行程式碼
in Class: hudson.scm.SubversionSCM
line 377:
final SVNRevision revision = SVNRevision.create(timestamp);
replace to:
final SVNRevision revision = SVNRevision.HEAD;
hudson拒絕修復的理由是什麼?
相關文章
- git從伺服器獲取最新程式碼Git伺服器
- request 獲取不到 CookieCookie
- iTunes構建版本 獲取不到應用程式
- 2015年淘點金程式碼獲取最新教程
- 小程式雲開發獲取不到資料庫的記錄資料庫
- 怎麼能接聽來電?獲取不到不到元素
- go 程式碼倉被設定為私倉了,無法go get -u 獲取最新的倉程式碼Go
- 歷史上的今天獲取介面程式碼
- 獲取 NodeJS 程式退出碼NodeJS
- 獲取小程式二維碼
- 線上問題總結-獲取不到連線池(logback 配置+程式碼問題)
- PHP獲取小程式openid,10行程式碼快速獲取小程式openidPHP行程
- 最新Godaddy賬戶域名解鎖/獲取轉移碼的方法Go
- PHP獲取MAC地址的實現程式碼PHPMac
- JavaScript 獲取主機名程式碼JavaScript
- JavaScript獲取星期程式碼例項JavaScript
- PHP 常用獲取路徑程式碼PHP
- js獲取北京時間程式碼JS
- [hudson]hudson的build trigger解釋UI
- Vue 部署後強制客戶端重新整理獲取最新的程式碼資源【純前端】Vue客戶端前端
- Laravel 分組獲取最新記錄Laravel
- 前端獲取不到後端新增的請求頭資訊前端後端
- python獲取命令列引數的程式碼Python命令列
- jQuery獲取指定的li元素程式碼例項jQuery
- js獲取事件的型別程式碼例項JS事件型別
- javascript獲取元素的順序程式碼例項JavaScript
- jQuery獲取視窗尺寸的例項程式碼jQuery
- 用JS獲取函式相關的程式碼JS函式
- 小程式獲取帶有分享者資訊的小程式碼
- 為啥從SurfaceView中獲取不到圖片?View
- 獲取絕對路徑 【檔案找不到】
- Oracle 獲取整數方式程式碼整理Oracle
- 兩步快速獲取小程式原始碼原始碼
- javascript使用class獲取元素物件程式碼JavaScript物件
- javascript獲取本地時間日期程式碼JavaScript
- jquery獲取元素高度程式碼例項jQuery
- js獲取數字中的最小數字程式碼程式碼例項JS
- jQuery獲取選中核取方塊的值程式碼例項jQuery