PAYATHON 2026

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 文档示例

备注:内容仅供参考。