Buildbot 如何读取 NestedParameter 的单个嵌套属性?
结论
可以读取 artifacts 字典中的 tools.linux。不过,不能把 renderer 函数名写成 Interpolate 的 selector。Interpolate 中的 %(...)s 用于属性等内置 selector;renderer 是可渲染对象,应作为值传给步骤。Buildbot 文档建议先用 SetProperty 取出嵌套字段并保存为扁平属性,再通过 Interpolate 引用该属性。Buildbot NestedParameter 文档;Buildbot renderer 文档
提取嵌套字段并保存
from buildbot.plugins import steps, util
def create_nested_property_renderer(property_name: str, *keys: str):
if not keys:
raise ValueError('At least one nested key is required')
@util.renderer
def render_nested_property(props):
value = props.getProperty(property_name)
for key in keys:
if not isinstance(value, dict):
raise TypeError(f'{property_name} is not a dict at {key!r}')
value = value[key]
# BooleanParameter 产生 bool;转为小写文本适合常见的 --option=true/false 参数。
if isinstance(value, bool):
return str(value).lower()
return value
return render_nested_property
factory.addStep(
steps.SetProperty(
property='artifacts_tools_linux',
value=create_nested_property_renderer('artifacts', 'tools', 'linux'),
)
)
在后续步骤中引用这个新属性:
cmd = './.venv/bin/python ci/buildbot/release.py --linux=%(prop:artifacts_tools_linux)s'
util.ShellArg(command=util.Interpolate(cmd))
这里的 factory 是配置构建步骤时使用的步骤工厂对象。请将 SetProperty 放在需要该值的步骤之前。上面的转换会把 Python 的 True、False 转成命令行参数中的 true、false。如果 release.py 要求其他格式,请相应调整转换。
原尝试中的问题
%(nested_property_renderer:artifacts,tools,linux)s 会被解析为 Interpolate selector。Buildbot 不会因此调用名为 nested_property_renderer 的 Python 函数,所以会报 invalid Interpolate selector。
示例函数中还有一个拼写错误:props.etProperty(...) 应改为 props.getProperty(...)。renderer 接收到 props 后,可以通过 getProperty 获取完整字典,再逐层访问其中的键。官方文档也提供了类似的 renderer 工厂函数,并展示了如何用 SetProperty 将提取结果保存为新属性,以供后续步骤插值使用。NestedParameter 文档示例
备注:内容仅供参考。
