2009-11-23 95 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

相关问题