Buildbot:动态创建新的Builder或BuilderConfig或项目



我正在做一个项目,我需要能够动态地向构建机器人添加新的构建器。 构建过程都是相同的(想想微服务),但它们将在不同的源代码存储库上工作,并生成主要基于源代码存储库名称不同的输出。

很容易获得动态构建步骤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

哪些帖子发布到这个网络钩子:https://github.com/buildbot/buildbot/blob/master/master/buildbot/www/hooks/base.py

这必须在主控中这样启用.cfg

c['www'] = dict(port=8010,
plugins=dict(waterfall_view={}, console_view={}),
change_hook_dialects={
'base': True,
})

太好了,我做到了那么远。 当我这样做时,我扭曲地看着.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

当我这样做时,我得到了"示例"项目的构建,而不是"mikes_microservice"项目,这让我认为我可能不理解调度程序或更改过滤器的完成方式,因为我绝对期望"mikes_microservice"项目/构建器被触发。

然后,我将"mikes_microservice"添加到SingleBranchScheduler builderNames中,并且我能够触发"mikes_microservice"的构建...以及"示例"的构建。

考虑到在同一调度器上有多个构建器导致了问题,我像这样将其拆分为单独的调度程序,以达到相同的效果。

c['schedulers'].append(schedulers.SingleBranchScheduler(
name="mikes_microservice",
change_filter=util.ChangeFilter(branch='master'),
treeStableTimer=None,
builderNames=["mikes_microservice"]))

显然,我错过了一些关于如何让不同的项目或存储库以不同的方式构建的东西——至少通过 webhook ——一旦我解决了这个问题,我也有兴趣在运行时将新的 [无论实现这一目标所需的一切] 注入 buildbot,以便让它选择新的项目或存储库并在不重新启动的情况下构建它们。

嗨,感谢您提出这个出色的问题。 这就是virtual_builders进入戏剧的地方。

这个想法是创建一个构建器,所有构建请求都将附加到其中。你可以称之为引导程序。此引导程序的工作是读取 buildbot.yml,然后它将配置构建的其余部分。

夏娃也在做类似的事情 https://bitbucket.org/scality/eve/src/

然后,我们的想法是将virtual_builder_name自动设置为项目的名称。我认为最好的办法是有一个特殊的AnyBranchScheduler来自动设置virtual_builder_name。这不是Buildbot中内置的东西。请随时为此工作。

最新更新