Buildbot: создание нового Builder или BuilderConfig или проектов динамически
Я работаю над проектом, где мне нужно иметь возможность добавлять новых сборщиков для динамической сборки. Все процессы сборки будут одинаковыми (например, на микросервисах), но они будут работать в разных репозиториях исходного кода и создавать выходные данные, которые отличаются в основном в зависимости от имени репозитория исходного кода.
Довольно просто получить этапы динамической сборки ala travis ( https://github.com/buildbot/buildbot_travis) или просто фабрики динамической сборки: http://docs.buildbot.net/latest/manual/cfg-buildfactories.html
Я нашел скрипт в contrib, который поможет создать произвольные изменения, разместив соответствующий URL-адрес: https://github.com/buildbot/buildbot-contrib/blob/master/master/contrib/post_build_request.py
Как разместить этот веб-крючок: https://github.com/buildbot/buildbot/blob/master/master/buildbot/www/hooks/base.py
Который должен быть включен как в master.cfg
c['www'] = dict(port=8010,
plugins=dict(waterfall_view={}, console_view={}),
change_hook_dialects={
'base': True,
})
Отлично, я так далеко. И когда я это сделал, я смотрю в twistd.log и вижу это:
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] Attempting to load module buildbot.www.hooks.base
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] Got the following changes [{'category': 'release', 'codebase': None, 'repository': 'mikes_microservice', 'author': 'sandford', 'when': None, 'comments': u'post_build_request submission', 'project': 'mike_basic_stats', 'branch': None, 'revlink': None, 'properties': {}, 'files': [], 'revision': None}]
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] Payload: {'category': ['release'], 'project': ['mikes_microservice'], 'repository': ['mikes_microservice'], 'comments': ['post_build_request submission'], 'author': ['sandford']}
2017-05-22 20:43:29-0500 [_GenericHTTPChannelProtocol,17,127.0.0.1] WARNING: change source is using deprecated self.master.addChange method; this method will disappear in Buildbot-1.0.0
2017-05-22 20:43:29-0500 [-] added change with revision None to database
2017-05-22 20:43:29-0500 [-] injected change Change(revision=None, who=u'sandford', branch=None, comments=u'post_build_request submission', when=1495503809, category=u'release', project=u'mikes_microservice', repository=u'mikes_microservice', codebase=u'')
Хорошо, все идет вместе! Увы, на самом деле ничего не сработало. Я подозреваю, что это потому, что у меня нет этого строителя в моей конфигурации строителей:
c['builders'] = []
c['builders'].append(
util.BuilderConfig(name="example",
workernames=["example-worker"],
factory=factory))
Так в этом и заключается хитрость. Я понимаю, что мог бы создать этот список динамически при запуске, но мы постоянно создаем новые микросервисы, и я немного нервничаю по поводу необходимости постоянно перезапускать.
Просто чтобы посмотреть, как далеко я смог получить, я добавил BuilderConfig (и запись планировщика) и попытался снова:
c['builders'].append(
util.BuilderConfig(name="mikes_microservice",
workernames=["example-worker"],
factory=factory))
И планировщик:
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="all",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["example",]))
c['schedulers'].append(schedulers.ForceScheduler(
name="force",
builderNames=["example", "mikes_microservice", ]))
Затем я снова попытался запустить скрипт:
python post_build_request.py -P mikes_microservice -r mikes_microservice --branch master
Когда я это сделал, я получил сборку по проекту "example", а не по проекту "mike s_microservice", из-за которого я думаю, что я не понимаю, как работают планировщики или фильтры изменений, поскольку я определенно ожидал проект / сборщик проекта "mike s_microservice". быть вызванным.
Затем я добавил "mike s_microservice" в SingleBranchScheduler builderNames и смог запустить сборку "mike s_microservice"... и сборку "example".
Поняв, что наличие нескольких сборщиков в одном и том же планировщике вызывает проблему, я разделил его на отдельный планировщик примерно так же, с тем же эффектом.
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="mikes_microservice",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["mikes_microservice"]))
Понятно, что я что-то упускаю из-за того, как заставить разные проекты или репозитории создавать по-разному - по крайней мере, через веб-крючки - и как только я решу эту проблему, я также заинтересован в добавлении новых [всего, что требуется, чтобы это произошло] в buildbot во время выполнения, чтобы он мог подбирать новые проекты или репозитории и собирать их без перезапуска.
1 ответ
Привет, спасибо за этот отличный вопрос. Это где Virtual_builders вступают в игру.
Идея состоит в том, чтобы создать одного сборщика, к которому будут прикреплены все запросы сборки. Вы можете назвать это бутстрапом. Задача этого загрузчика - прочитать buildbot.yml, который затем настроит остальную часть сборки.
Ева делает подобные вещи https://bitbucket.org/scality/eve/src/
Тогда идея состоит в том, чтобы в качестве virtual_builder_name было автоматически установлено имя вашего проекта. Я думаю, что лучше всего было бы иметь специальный AnyBranchScheduler, который автоматически устанавливает virtual_builder_name. Это не то, что встроено в Buildbot. Пожалуйста, не стесняйтесь работать над этим.