我正在一个项目中,我需要能够动态添加新的构建器到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/

10-10 12:27