3

我正在将我的持续测试转移到专用服务器上(自动测试会大大降低我本地笔记本电脑的速度)。我想要的是我的测试服务器(它恰好正在运行 CruiseControl.rb)通过 Git 不断地获取我最新的(提交的)更改——理想情况下,我自己的工作流程没有任何更改。我是唯一从事这个项目的开发人员。

在获得测试服务器之前,我有:

  • 我的笔记本电脑作为我的主要开发系统
  • 我的本地存储库中有多个分支。
  • 本地工作副本,指向其中一个分支。我经常在分支之间切换(通常是为了新功能)。
  • 一个 GitHub 帐户,我经常将本地分支推送到镜像的远程分支。(这主要用于异地备份;我不会为我当前的项目共享任何代码)。我尝试至少在每个工作日结束时推送到 GitHub,尽管我偶尔会忘记。

我想保持所有这些完好无损。最重要的是,我现在有:

  • 测试服务器
  • ...运行 CruiseControl.rb
  • 我的测试服务器上的笔记本电脑存储库的克隆。(目前不克隆 GitHub)
  • 测试服务器上的本地工作副本,CC 从中构建/测试。
  • 这个工作副本指向一个特定的 Git 分支(当然)

我一直在尝试让我的测试服务器自动获取我在笔记本电脑工作副本上正在处理的任何分支并从中构建。(这将在不消耗系统资源的情况下模拟 autotest 的连续测试)。

我尝试过但没有成功的事情:

  • git checkout origin/HEAD:这会使文件正常,但会破坏 CruiseControl,因为它不喜欢“无分支”工作副本。
  • git checkout --track -b a_branch origin/a_branch:这对于获取文件很有效,并且 CC 喜欢它,但它将测试服务器固定到特定的分支。在笔记本电脑上切换分支时,我将有效地停止测试我当前的工作。
  • git checkout --track -b my_testing_branch origin/HEAD:这也获取可构建文件,但它遇到与上述命令相同的问题。从 origin/HEAD 创建分支只会获取“默认”分支的 HEAD,因此它也很粘。

有什么方法可以让我获得一个不涉及对我的工作流程进行重大更改的良好远程连续测试系统(有或没有 git 分支)?

4

6 回答 6

3

另一种选择是编写一个钩子,通知测试服务器有新的代码要拉。特别是,post-commit钩子可能是更好的路线。然后,每次提交时,您都可以通知测试服务器要提取什么以及从哪个分支提取。

于 2009-11-23T06:35:36.647 回答
1

您可以有一个专门的测试分支,在该分支上合并您当前的分支工作。
您可以用当前工作分支的提交强制替换该分支的内容(参见git merge -s ours,“他们的”问题呢)。

然后在 CI 服务器上,使用以下命令对其进行初始化:

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

这意味着在笔记本电脑方面的第一步是发布一些当前工作进行测试。

于 2009-11-23T05:03:31.060 回答
1

这不是最好的解决方案,但它是......

测试服务器可以运行git remote show origin以查看您的笔记本电脑上当前处于活动状态的分支。例如,

$ git 远程显示原点
* 远程来源
  获取 URL:blade:/var/scratch/code
  推送 URL:blade:/var/scratch/code
  HEAD 分支:foo
  远程分支:
    foo 跟踪
    条形跟踪
    qux 跟踪

因此,原始存储库当前位于foo分支上。

我还没有看到一个低级命令可以直接给你,所以你可能不得不从中解析出来(也许有人会有更好的方法)。例子,

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

现在,因为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将向后和向前移动。如果你的测试服务器HEAD在 rebase 期间检查你的笔记本电脑,它可能会得到一些无效或不需要的位置。

于 2009-11-23T06:19:52.980 回答
1

我认为通过颠倒两个系统之间的关系得到了一个很好的解决方案。我可以让笔记本电脑将更改推送到要测试的服务器,而不是让测试服务器从笔记本电脑的存储库中提取。

首先,我在笔记本电脑的仓库中添加了一个遥控器:

git remote add testing <url of testing server>

然后,每当我有测试代码时,我都会推送:

git push -f testing HEAD:master

这将适用于我目前所在的任何分支。-f 确保我会吹走该分支中已经存在的任何内容;我不必担心任何祖先。

这实际上不会将最新代码放入工作副本中,但 CruiseControl 的轮询可以解决这个问题。我还可以有一个服务器端挂钩来更新工作副本运行测试套件(那时我什至不需要 CC)。

我可能想将组合的 commit+push 命令添加到脚本或别名中;这将给我一个命令提交和测试。如果出于某种原因我想在没有测试推送的情况下进行提交(反之亦然),那么我也有这些选项。

于 2009-11-23T07:25:52.380 回答
1

在 GitHub 上托管并使用他们的post-receive hooks。这就是DevverRunCodeRun等服务的工作方式。

于 2009-11-23T14:11:14.087 回答
0

我考虑过跳过 git 并转到共享文件夹/NFS/rsync 解决方案,但这有一个主要问题:它不是由提交触发/仅限于提交,所以我最终会得到误报的损坏构建,而我' m 在打字的过程中。

于 2009-11-23T04:49:18.860 回答