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. Пожалуйста, не стесняйтесь работать над этим.

Другие вопросы по тегам