Как заставить 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)
)
Есть ли общий способ выполнить такую проверку? Или я должен смотреть в другом направлении?
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))
Если файл не найден (или не удовлетворяет вашим ограничениям), он остановится и тесты не будут выполнены.
Важно отметить, что этот шаг будет выполняться на ведомом устройстве, то есть файл будет проверен на ведомом устройстве, а не на главном.
Я надеюсь, это поможет вам.