Sky's blog

          我和我追逐的夢

          常用鏈接

          統計

          其他鏈接

          友情鏈接

          最新評論

          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拒絕修復的理由是什么?

          posted on 2010-09-29 23:02 sky ao 閱讀(2688) 評論(0)  編輯  收藏 所屬分類: project manager

          主站蜘蛛池模板: 拉萨市| 道孚县| 甘孜县| 甘德县| 内黄县| 呼和浩特市| 金塔县| 襄樊市| 固原市| 泰和县| 自治县| 兴海县| 公安县| 连江县| 嘉定区| 逊克县| 福清市| 东辽县| 三江| 盘锦市| 溧阳市| 宿迁市| 芷江| 阳新县| 乌鲁木齐县| 库尔勒市| 凤凰县| 汾阳市| 简阳市| 和林格尔县| 廊坊市| 汉源县| 静乐县| 永胜县| 新乐市| 瑞安市| 静安区| 莒南县| 平度市| 阜南县| 宜阳县|