Непрерывная интеграция с Hudson и Mercurial - PullRequest
2 голосов
/ 28 февраля 2011

Я пытаюсь найти лучший способ настроить наш новый процесс и хотел бы получить некоторую обратную связь:

Мы используем Mercurial и Hudson для целей CI.Я возглавляю команду с несколькими разработчиками.

Теперь, когда приходят заявки, я назначаю их соответствующим разработчикам, которые проверяют транк и вносят свои изменения.

Моя структура каталогов выглядит следующим образом:

PROJECT/bugfixes

Теперь мои разработчики клонируют свои исправления в PROJECT / bugfixes / bugticket (это клон PROJECT с соответствующими изменениями)

В конце недели я могу посмотреть на исправления и увидеть несколько каталогов ошибок, и я хотел бы объединить некоторые из них (я выбираю, какие я хочу) в сборку релиза:

PROJECT/releasebuild

Я клонирую PROJECT в releasebuild, и я извлекаю нужные мне жучки и объединяю их.

Я начал играть с Хадсоном, и я думаю, что он лучше послужит моим целям.

Итак, мои вопросы:

  • Как мне настроить Hudson для выполнения вышеуказанной задачи?Я думаю, что мои разработчики должны использовать ветки, а не каталог PROJECT / bugfixes / bugtickets.Это правильно?

  • Для каждой ветви, которую я хочу импортировать, должен ли я создать новый проект Hudson для этой конкретной ветви?Похоже, что плагин Mercurial для Hudson принимает только одну ветвь.

Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 28 февраля 2011

Вероятно, самый простой способ - это настроить работу Hudson для каждой ветви. В предыдущем проекте я обнаружил, что проще не использовать плагин Hudson Mercurial. Вместо этого я настроил проект (только для ветки по умолчанию), который сделал hg purge (чтобы удалить любые артефакты, которые не были частью репозитория), затем hg pull (из основного репо), за которым следует hg update default. Затем он сделал сборку.

Я установил ртутный хук в репозитории, который запускал сборку hudson с использованием интерфейса hudson CLI каждый раз, когда один или несколько наборов изменений были зафиксированы в репозитории.

Конечно, с тех пор все могло измениться - я не смотрел на интеграцию 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
...