开发者

Mercurial build on push

I'd like for a build to be done (on the server) each time a push is made to our central Mercurial repository. Builds are usually kicked off on our build server by running a Visual Build file either manually or via a scheduled task.

What are the ways of achieving this?

Simple, low impact solutions a开发者_如何学Gore preferred.


As Pablo suggested, you can do this with a hook, but you'll need an incoming hook on the server side. This hook runs "after a changeset has been pulled, pushed, or unbundled into the local repository" (hgrc manpage).

Edit the .hg/hgrc file of the repository located on the server and define your build hook as follows:

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

Of course, the build script called here just needs to be a trigger for whatever build process you actually use.

Note that an incoming hook runs for every single changeset in a push. If you don't want this, use a changegroup hook -- it runs only once for each push, no matter how many changesets it carries.


Another way, in addition to the hooks that Pablo mentions, is to set up a continuous integration server, like TeamCity. Then you could ask TeamCity to monitor your repository, pull new changesets and start the visual build script for you.


Disclaimer

These findings are for tortoisehg client and mercurial server behind apache on win32.

Try #1

The naive solution would be to make your push kick off the build.

In .hg\hgrc

[hooks]
incoming=.hg\build.py

In build.py

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

Problem

What you'll find is that, after a push, the tortoise hg client won't return until your os.system call returns. This may or not be acceptable. In my shop a build took about 20 minutes, and my boss deemed that unacceptable.

Try #2

My solution was for the hook to return immediately after creating a REQUESTBUILD file to the root directory.

In .hg\hgrc

[hooks]
incoming = .hg\write_buildrequest_file.bat

In .hg\write_buildrequest_file.bat

echo REQUESTBUILD > \REQUESTBUILD

Meanwhile, I had a python script running in an infinite loop, checking for the presence of REQUESTBUILD.

In .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 would generate an HTML file of results, which the submitter would have to pull via their web browser.

There are other issues (pushes while a build is commencing, saving historical results, building out of the working directory vs copying elsewhere) but this is the general idea.


You need to handle repository events with hooks.

So, after commit event you need to run a script that will perform your build accordingly.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜