Python 如何使buildbot通过特定事件运行任务?

Python 如何使buildbot通过特定事件运行任务?,python,automated-tests,buildbot,smoke-testing,Python,Automated Tests,Buildbot,Smoke Testing,是否有任何方法可以将master.cfg配置为在项目文件夹或其中的文件被修改或其文件版本信息发生更改时,计划生成器执行代码 我知道这是一个很好的解决方法,但我需要这样做,以便在开发人员编译了新版本的产品之后立即运行构建验证测试,并且由于许多项目的开发不在CVS中,因此我需要一个项目文件夹的扫描程序 以下是master.cfg的摘录: def create_builders_and_schedule_it(factory, build_slaves, **kwargs): # kwargs

是否有任何方法可以将master.cfg配置为在项目文件夹或其中的文件被修改或其文件版本信息发生更改时,计划生成器执行代码

我知道这是一个很好的解决方法,但我需要这样做,以便在开发人员编译了新版本的产品之后立即运行构建验证测试,并且由于许多项目的开发不在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)
)

是否有一种常见的方法来执行此类检查?或者我应该看另一个方向

您可以在以下行中使用自定义版本的:

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))
如果找不到该文件或该文件不满足您的约束,则该文件将停止,并且不会执行测试

需要注意的重要事项是,此步骤将在从机上执行,这意味着将在从机上而不是在主机上检查文件

我希望这对你有帮助