2014-09-19 9 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)) 

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^