与Hudson和Mercurial持续整合

时间:2011-02-28 09:15:49

标签: mercurial continuous-integration hudson

我正在努力找出设置新流程的最佳方式,并希望得到一些反馈:

我们正在使用Mercurial和Hudson进行CI目的。 我正在领导一个有几个开发人员的团队。

现在,当门票进入时,我会将它们分配给检查后备箱并进行更改的相应开发人员。

我的目录结构如下:

PROJECT/bugfixes

现在,我的开发人员目前正在将修复程序克隆到PROJECT / bugfixes / bugticket(这是PROJECT的克隆,并进行了相应的更改)

在本周末,我可以查看错误修正并查看几个bugtickets目录,我想将其中的一些(我选择我想要的)合并到发布版本中:

PROJECT/releasebuild

我将PROJECT克隆到releasebuild中,然后拉下我想要的bugtickets并合并它们。

我开始和Hudson一起玩,我认为它会更好地满足我的目的。

现在,我的问题:

  • 如何设置Hudson来执行上述任务?我认为我的开发人员应该使用分支而不是PROJECT / bugfixes / bugtickets目录。这是对的吗?

  • 对于我想导入的每个分支,我应该为该特定分支创建一个新的Hudson项目吗?看起来Hudson的Mercurial插件只接受一个分支。

我有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

可能最简单的方法是设置每个分支的哈德森作业。在之前的项目中,我实际上发现不使用hudson mercurial插件更容易。相反,我设置了一个项目(仅限默认分支),它执行了hg purge(删除了不属于存储库的任何工件),然后是hg pull(来自主仓库),然后是hg update default。然后它完成了构建。

我在存储库中设置了一个mercurial钩子,只要将一个或多个更改集提交到存储库,就会使用hudson CLI触发hudson构建。

当然,事情可能已经发生了变化 - 我没有看过hudson / hg整合大约2年。

这是我使用的钩子 - 将它更新为最新版本的hudson或jenkins,或处理多个分支应该相当简单。

"""
[hooks]
commit.hudson = python:(path to)/hudson.py:hudson_build_trigger
changegroup.hudson = python:(path to)/hudson.py:hudson_build_trigger
"""

from mercurial.i18n import _
from mercurial import localrepo, util, commands, cmdutil, extensions
from mercurial.context import changectx
from mercurial.node import nullrev
import os, os.path, subprocess

def extsetup(ui):
    pass

def hudson_build_trigger(ui, repo, node, **kwargs):
    """Triggers a hudson build. Uses a [hudson] section in hgrc. The 'jar', 'url'
    and 'job' parameters are required, the 'branch' parameter defaults to 'default'
    if not specified e.g.

    [hudson]
    jar = /path/to/hudson-cli.jar
    url = http://server:port/path/to/hudson
    job = hudson_mercurial_job
    branch = developer1

    Use as a commit and changegroup hook e.g.:

    [hooks]
    commit.hudson = python:(path to)/hudson.py:hudson_build_trigger
    changegroup.hudson = python:(path to)/hudson.py:hudson_build_trigger
    """

    jar = ui.config('hudson', 'jar', '')
    url = ui.config('hudson', 'url', '')
    job = ui.config('hudson', 'job', '')
    branch = ui.config('hudson', 'branch', 'default')

    if not jar or not os.path.exists(jar) or not url or not job:
        raise util.Abort(_('must specify Hudson CLI jar, URL and job'))

    ctx = repo[node]

    for rev in range(ctx.rev(), len(repo)):
        if repo[rev].branch() == branch:
            # Trigger a hudson build
            result = subprocess.call([
                'java',
                '-jar',
                jar,
                '-s',
                url,
                'build',
                job
            ])

            if result != 0:
                raise util.Abort(_('failed to trigger Hudson build'))

            ui.write(_("triggered build for %s\n" % (job,)))
            break