我正在将我的连续测试移到专用服务器上(自动测试会使我的本地笔记本电脑变得太慢)。我想要的是我的测试服务器(恰好运行CruiseControl.rb)通过Git不断获取我最新的(提交的)更改 - 理想情况下,我自己的工作流程没有任何变化。我是这个项目的唯一开发人员。
在获得测试服务器之前,我有:
我想保持所有这一切。最重要的是,我现在有:
我一直在尝试让我的测试服务器自动获取我在笔记本电脑工作副本上工作的任何分支并从中构建。 (这将模仿自动测试的连续测试而不占用系统资源)。
我尝试过的事情没有成功:
有什么方法可以让我的远程连续测试系统(有或没有git分支)不会对我的工作流程产生重大变化吗?
答案 0 :(得分:3)
另一个选择是编写一个hook,通知测试服务器要提取的新代码。特别是,post-commit
钩子可能是更好的路线。然后,每次提交时,都可以通知测试服务器要从哪个分支拉出来。
答案 1 :(得分:1)
您可以拥有一个专门的测试分支,您可以在其上合并当前的分支工作 您可以使用当前工作分支的提交强制替换该分支的内容(请参阅git merge -s ours, what about “their” 问题)。
然后在CI服务器上,使用以下命令对其进行初始化:
$ git fetch laptopRepo
$ git checkout -b testingBranch laptopRepo/testingBranch
这意味着笔记本电脑方面的第一步是发布一些当前要测试的作品。
答案 2 :(得分: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
我并不总是你认为的那样。例如,在rebase期间HEAD
将向后和向前移动。如果您的测试服务器在rebase期间检查笔记本电脑上的HEAD
,则可能会出现一些无效或不受欢迎的位置。
答案 3 :(得分:1)
我认为通过颠倒两个系统之间的关系可以得到一个很好的解决方案。我没有让测试服务器从笔记本电脑的存储库中取出,而是可以将笔记本电脑推送到服务器进行测试。
首先,我在笔记本电脑的回购中添加一个遥控器:
git remote add testing <url of testing server>
然后,每当我有测试代码时,我都会推送:
git push -f testing HEAD:master
这将适用于我目前所处的任何分支。 -f确保我会吹掉那个分支中已有的东西;我不必担心任何祖先。
这实际上并不会将最新的代码放在工作副本中,但CruiseControl的轮询可以解决这个问题。我还可以有一个服务器端钩子来更新工作副本和运行测试套件(我当时甚至不需要CC)。
我可能想要将一个组合的commit + push命令添加到脚本或别名中;这将给我一个命令提交&amp;测试。如果由于某种原因我想在没有测试推送的情况下进行提交(反之亦然),那么我也有这些选项。
答案 4 :(得分:1)
在GitHub上托管并使用他们的post-recieve hooks。这就是像Devver和RunCodeRun这样的服务。
答案 5 :(得分:0)
我考虑跳过git并转到共享文件夹/ NFS / rsync解决方案,但这有一个主要问题:它不是由提交触发/限制,所以我最终会得到假阳性的破坏版本我正在打字的时候。