每次向我们的中央Mercurial存储库进行推送时,我都希望在服务器上完成构建。 构建通常通过手动或通过计划任务运行Visual Build文件在我们的构建服务器上启动。
实现这一目标的方法有哪些?
首选简单,低影响的解决方案。
答案 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
事件之后,您需要运行一个脚本来相应地执行构建。