Как заставить buildbot запускать задачу по определенному событию?

Есть ли способ настроить master.cfg, чтобы запланировать выполнение кода компоновщиком к моменту изменения папки проекта или файла в нем (или изменения его FileVersionInfo)?

Я знаю, что это довольно обходной путь, но мне это нужно, чтобы запустить тесты проверки сборки сразу после того, как разработчики скомпилировали более новую версию продукта, и, поскольку разработка ряда проектов не в CVS, мне нужен сканер для папки проекта.

Вот выдержки из master.cfg:

def create_builders_and_schedule_it(factory, build_slaves, **kwargs):
    # kwargs: change_filter=None, nightly=None, trigger_name=None)

    builder_names = []

    if hasattr(factory, 'subcategory'):
        cat = "%s_%s" % (factory.category, factory.subcategory)
    else:
        cat = factory.category

    if 'change_filter' in kwargs:
        change_filter = kwargs['change_filter']
    else:
        change_filter = filter.ChangeFilter( branch = factory.branch )

    for i_slave in build_slaves:
        builder_name = "%s_%s" % (cat, i_slave)
        builder_names.append(builder_name)
    c['builders'].append(
        BuilderConfig(name = builder_name,
                      category = factory.category,
                      factory = factory,
                      slavename = i_slave
                ))

    # every task has 'forced' scheduler at least
    c['schedulers'].append(
        ForceScheduler(name = cat + "_force",
                       builderNames = builder_names))

    # every task has 'on commit' scheduler
    c['schedulers'].append(
        SingleBranchScheduler(name = cat + "_singlebranch",
                       builderNames = builder_names,
                       change_filter = change_filter))

    # some task can be scheduled
    if 'nightly' in kwargs:
        c['schedulers'].append( timed.Nightly(
                                name = cat + '_nightly',
                                branch = factory.branch,
                                builderNames = builder_names,
                                hour = kwargs['nightly'][0], minute = kwargs['nightly'][1]))                                

    if 'trigger_name' in kwargs:
        c['schedulers'].append(
            Triggerable(
                name = kwargs['trigger_name'],
                builderNames = builder_names))

Типичный класс, производный от BuildFactory:

class Autotests(BuildFactory):
    """ Build products from Autotests repository """
    def __init__(self, branch):
        BuildFactory.__init__(self)
        self.category = "autotests"
        self.branch = branch
        self.addStep(
            Git(repourl = AUTOTESTS_REPO, branch = branch))

    def build_source_archive(self):
        self.subcategory = "source"
        self.addStep(
            ShellCommand(
                workdir = "build",
                command = ["./upload_to_binary_repo.sh"]))
        return self

    def run_BVT_prod(self):
        self.subcategory = "BVT_prod"
        self.addStep(
            ShellCommand(
                workdir = "build/BVT_tests/prod",
                env = {'PATH':"/usr/bin:/bin", 'VIRTUAL_ENV':''},
                command = ["./bvt_runner.sh"] ))
        return self

Теперь, когда у нас есть метод и класс, мы

create_builders_and_schedule_it(
    Autotests("devel").run_BVT_Prod(),
    ['VIX_runner'],
    nightly = (2,0)
)

Есть ли общий способ выполнить такую ​​​​проверку? Или я должен смотреть в другом направлении?


person user3625397    schedule 19.09.2014    source источник


Ответы (1)


Вы можете использовать настроенную версию FileExists, что-то в следующих строках:

from buildbot.steps.slave import FileExists
class CustomFileExists(FileExists):
    # By default false
    output_files_exist = False

    def __init__(self, file, **kwargs):
        CustomFileExists.output_files_exist = False
        FileExists.__init__(self, file, **kwargs)

    # Override the commandComplete
    def commandComplete(self, cmd):
        if not cmd.didFail():
            # for e.g. check the last modification time on the file
            # or do your own cooking to check whether to proceed or not !!
            s = cmd.updates["stat"][-1]
            if s[stat.ST_MTIME] > s[stat.ST_CTIME]:
                # If it satisfies your condition, then set it to True
                CustomFileExists.output_files_exist = True
        self.finished(SUCCESS)
        return

Из названия кажется, что он просто проверяет файл, но вы можете делать с ним все, что угодно, например. командой stat.

В вашей основной конфигурации сборки для этого билдера вам нужно добавить новый шаг перед выполнением тестов. Что-то вроде:

project_file = r'path\to\the\built\product\image'
factory.addStep(CustomFileExists(project_file))

Если файл не найден (или не удовлетворяет вашим ограничениям), он остановится на этом и тесты выполняться не будут.

Важно отметить, что этот шаг будет выполняться на ведомом устройстве, то есть файл будет проверяться на ведомом устройстве, а не на ведущем.

Я надеюсь, это поможет вам.

person sk11    schedule 19.09.2014