2014-09-19 93 views
0

有没有什么办法可以配置master.cfg来安排构建器在其中的项目文件夹或文件被修改(或其FileVersionInfo已更改)时执行代码?如何让buildbot通过某些事件来运行任务?

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

有没有一种常见的方法来执行这种检查?或者我应该朝另一个方向看?

回答

0

您可以使用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)) 

如果找不到文件(或不符合您的约束条件),它将停止在那里,测试将不会执行。

重要的是要注意,这一步将在从站上执行,这意味着文件将在从站而不是在主站上进行检查。

我希望这可以帮助你。