2009-11-23 86 views
3

我正在將我的持續測試移至專用服務器(自動測試會讓我的本地筆記本電腦速度變慢)。我想要的是我的測試服務器(正好運行CruiseControl.rb)不斷通過Git獲取我最新(已提交)的更改 - 理想情況下,我的工作流程沒有任何更改。我是這個項目的唯一開發人員。遠程跟蹤Git中的當前分支

此前獲得的測試服務器,我有:

  • 我的筆記本電腦作爲我的主要開發系統
  • 多個分支在我的本地庫。
  • 本地工作副本,指向其中一個分支。我經常在分支之間切換(通常用於新功能)。
  • 我經常將本地分支推送到鏡像遠程分支的GitHub帳戶。 (這主要是爲了使用非現場備份;我沒有爲我當前的項目共享任何代碼)。至少在每個工作日結束時我都會嘗試推送GitHub,儘管我偶爾會忘記。

我想保留所有這些完好無損。最重要的是,我現在有:

  • 測試服務器
  • ...運行CruiseControl.rb
  • 我的筆記本電腦資料庫我的測試服務器上的克隆。 (目前它不克隆GitHub)
  • 測試服務器上的一個本地工作副本,CC正在其中進行構建/測試。
  • 這個工作拷貝到一個特定的Git分支

我一直在試圖讓我的測試服務器自動獲得我工作的任何分支在我的筆記本電腦工作拷貝,並從建設(當然) 。 (這會模仿自動測試的持續測試而不會消耗系統資源)。

事情我已經嘗試沒有成功:

  • git的結帳出身/ HEAD:此獲取文件不錯,但打破CruiseControl的,因爲它不喜歡的「網點」工作副本。
  • git checkout --track -b a_branch origin/a_branch:這對於獲取文件很好,而CC喜歡它,但它將測試服務器粘貼到特定分支。當在筆記本電腦上切換分支時,我將有效地停止測試當前的工作。
  • git checkout --track -b my_testing_branch origin/HEAD:這也可以獲得可構建的文件,但它遭受與上述命令相同的問題。從原點/ HEAD創建分支只會獲得「默認」分支的HEAD,因此它也很粘。

有沒有什麼辦法可以得到一個好的遠程連續測試系統(有或沒有git分支機構),它不涉及我的工作流程的重大變化?

回答

3

另一種選擇是編寫一個hook,通知測試服務器新的代碼拉。特別是,post-commit掛鉤可能是更好的路線。然後,每次提交時,都可以通知測試服務器要執行什麼操作以及從哪個分支中提取。

+0

爲了讓測試服務器獲得最新的測試代碼,你必須將它推到某個服務器可以抓取它的地方,我不相信git中有一個後推鉤,而且我也認爲掛鉤會在執行推送的機器上運行(例如,您的筆記本電腦,而不是具有存儲庫的服務器)。 – 2009-11-23 14:06:54

+0

最初,我完全是無推動,並從我的筆記本電腦拉服務器。 Pat的後置提交鉤子的建議可以起作用,如果它引發了一個消息到服務器(例如:一個ssh遠程命令),導致服務器開始拉動。但是,我現在正在靠向推送路線。 – 2009-11-23 18:26:41

+0

事實上,在git-push – 2009-11-23 18:27:47

0

我已經考慮過跳過git並轉到共享文件夾/ NFS/rsync解決方案,但這有一個主要問題:它不會觸發/限制提交,所以我最終會得到假陽性當我正在打字時,就會建立起來。

1

你可以有一個專門的測試分支,在其上合併你當前的分支工作。
您可以用當前工作分支的提交強制替換該分支的內容(請參閱git merge -s ours, what about 「their」問題)。

$ git fetch laptopRepo 
$ git checkout -b testingBranch laptopRepo/testingBranch 

這意味着在筆記本電腦上一邊一個第一步,發佈一些工作電流測試:

然後CI服務器上,您對其進行初始化。

+0

不錯;不幸的是需要額外的常規步驟來將我目前的工作合併到測試分支中,但到目前爲止,它已成爲領跑者。謝謝 – 2009-11-23 06:06:05

1

這是不是最大的解決方案,但它的東西......

測試服務器可以運行git remote show origin,看看哪個分支,目前在筆記本電腦上激活。例如,

 
$ git remote show origin 
* remote origin 
    Fetch URL: blade:/var/scratch/code 
    Push URL: blade:/var/scratch/code 
    HEAD branch: foo 
    Remote branches: 
    foo tracked 
    bar tracked 
    qux tracked 

因此,源存儲庫當前位於foo分支上。

我還沒有看到直接給你的低級命令,所以你可能不得不從它解析出來(也許有人會有更好的方法)。例如,現在

 
$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}') 
$ echo $b 
foo 

,因爲origin/foo將起到類似origin/HEAD(沒有本地分支)和你的CruiseControl不喜歡,你應該可能只是在測試機上創建本地分支,只需將其硬重置最新的位置:

 
$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}') 
$ git reset --hard origin/$b 

注意,這是稍微脆弱,因爲HEAD我並不總是你認爲它是。例如,在重組期間,HEAD將前後移動。如果您的測試服務器在重新綁定時檢查筆記本電腦上的HEAD,它可能會出現一些無效或不合需要的位置。

+0

這個週末我碰巧正在做很多重組,所以這是一個問題。 : - \ – 2009-11-23 06:38:03

1

我認爲通過顛倒兩個系統之間的關係得到了一個非常好的解決方案。而不是讓測試服務器從筆記本電腦的存儲庫中取出,我可以讓筆記本電腦將更改推送到要測試的服務器。

首先,我添加遠程對筆記本電腦的回購:

git remote add testing <url of testing server> 

然後,每當我有測試代碼,我做的一推:

git push -f testing HEAD:master 

這會從我的任何分支上工作m目前在。 -f確保我將吹掉該分支中已有的任何東西;我不必擔心任何血統。

這實際上並不會將最新的代碼放在工作副本中,但CruiseControl的輪詢可以解決這個問題。我也可以有一個服務器端鉤子更新工作副本運行測試套件(我甚至不需要CC在這一點上)。

我可能想要將一個組合的commit + push命令添加到腳本或別名;那會給我我的一個命令提交&測試。如果由於某種原因,我想在沒有測試推送的情況下進行提交(反之亦然),那麼我也有這些選項。

+1

中有一個「後推」鉤子形式的--receive-pack參數。這就是你可以在你的'post-commit'鉤子中做的事情。您只需要小心不要覆蓋正在積極構建或測試的代碼。 – 2009-11-23 15:08:51