我正在一个项目中,我需要能够动态添加新的构建器到buildbot。构建过程都是相同的(例如微服务),但是它们将在不同的源代码存储库上工作,并且产生的输出主要基于源代码存储库的名称而不同。
获得动态构建步骤ala travis(https://github.com/buildbot/buildbot_travis)或仅动态构建工厂非常容易:http://docs.buildbot.net/latest/manual/cfg-buildfactories.html#dynamic-build-factories
我在contrib中找到了一个脚本,该脚本可以通过发布到适当的已启用URL来帮助创建任意更改:https://github.com/buildbot/buildbot-contrib/blob/master/master/contrib/post_build_request.py
该webhook的哪个POST: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,
})
太好了,我走了那么远。当我这样做时,我在twisted.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'')
很好,一切都融合在一起! las,实际上没有触发任何操作。我的怀疑是因为我的构建器配置中没有该构建器:
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”项目而不是“ mikes_microservice”项目的构建,这使我认为我可能不了解调度程序或变更过滤器的完成方式,因为我肯定希望“ mikes_microservice”项目/构建器被触发。
然后,我在SingleBranchScheduler builderNames中添加了“ mikes_microservice”,并且能够触发“ mikes_microservice”的构建...以及“ example”的构建。
弄清楚在同一调度程序上有多个构建器会导致此问题,因此我将其拆分为一个单独的调度程序,以达到相同的效果。
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="mikes_microservice",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["mikes_microservice"]))
显然,我缺少关于如何使不同的项目或存储库以不同的方式构建的东西-至少通过webhooks-并且一旦我解决了这个问题,我也有兴趣注入新的东西[不管发生什么一切,一切都可以实现]在运行时导入buildbot,以使其选择新项目或存储库并在不重新启动的情况下进行构建。
最佳答案
嗨,谢谢你这个很好的问题。
这就是virtual_builders发挥作用的地方。
这个想法是创建一个所有构建请求都将附加到的构建器。您可以将其称为引导程序。该引导程序的工作是读取buildbot.yml,然后将配置其余的构建。
前夕正在做类似的事情https://bitbucket.org/scality/eve/src/
然后的想法是将virtual_builder_name自动设置为您的项目名称。我认为最好的办法是拥有一个自动设置virtual_builder_name的特殊AnyBranchScheduler。这不是Buildbot中内置的东西。请随时进行处理。
关于python - Buildbot:动态创建新的Builder或BuilderConfig或项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44124849/