Mercurial建立在推动上

时间:2010-12-14 16:34:53

标签: mercurial continuous-integration

每次向我们的中央Mercurial存储库进行推送时,我都希望在服务器上完成构建。 构建通常通过手动或通过计划任务运行Visual Build文件在我们的构建服务器上启动。

实现这一目标的方法有哪些?

首选简单,低影响的解决方案。

4 个答案:

答案 0 :(得分:15)

正如Pablo建议的那样,你可以用钩子做到这一点,但是你需要在服务器端有一个传入钩子。此挂钩在“将变更集拉入,推送或非捆绑到本地存储库后”(hgrc manpage)之后运行。

编辑位于服务器上的存储库的.hg/hgrc文件,并按如下方式定义构建挂钩:

[hooks]
incoming = /path/to/executable-build-script

当然,这里调用的构建脚本只需要成为您实际使用的构建过程的触发器。

请注意,传入挂钩会针对推送中的每个变更集运行。如果您不想这样做,请使用 changegroup 挂钩 - 每次推送只运行一次,无论它携带多少更改集。

答案 1 :(得分:5)

除了Pablo提到的钩子之外,另一种方法是建立一个持续集成服务器,如TeamCity。然后,您可以要求TeamCity监控您的存储库,提取新的变更集并为您启动可视化构建脚本。

答案 2 :(得分:4)

<强>声明

这些调查结果适用于win32上的apache后面的tortoisehg客户端和mercurial服务器。

尝试#1

天真的解决方案是让你的推动开始。

.hg\hgrc

[hooks]
incoming=.hg\build.py

build.py

os.system('\Progra~2\Micros~2.0\Common7\IDE\devenv /build release project.sln > logfile')

<强> 问题

你会发现,在推送之后,在你的os.system调用返回之前,togise hg客户端将不会返回。这可能是否可以接受。在我的店里,一个构建花了大约20分钟,我的老板认为这是不可接受的。

尝试#2

我的解决方案是在创建REQUESTBUILD文件到根目录后立即返回钩子。

.hg\hgrc

[hooks]
incoming = .hg\write_buildrequest_file.bat

.hg\write_buildrequest_file.bat

echo REQUESTBUILD > \REQUESTBUILD

与此同时,我有一个无限循环运行的python脚本,检查是否存在REQUESTBUILD。

.hg\monitor_buildrequest_file.py

import popen2, time, os
import subprocess

while True:
    if os.path.exists("\REQUESTBUILD"):
        os.system("del \REQUESTBUILD")
        os.chdir("/yourrepo/.hg")
        retcode = subprocess.call("\python27\python.exe build.py")
    else:
        time.sleep(10)

build.py会生成一个结果的HTML文件,提交者必须通过他们的网络浏览器提取这些文件。

还有其他问题(在构建开始时推送,保存历史结果,构建工作目录与在其他地方复制)但这是一般的想法。

答案 3 :(得分:2)

您需要handle repository events with hooks

因此,在commit事件之后,您需要运行一个脚本来相应地执行构建。