如何在 bazel 中获取工作区状态



我想对带有 CI 内部版本号的构建工件进行版本控制,并通过 workspace_status_command 传递给 bazel。有时我想在工件的名称中包含内部版本号。

有没有办法在编写宏时访问ctx(因为我试图使用ctx.info_file(?到目前为止,在创建新规则时,我似乎能够在新规则中访问此类信息,在这种情况下有点尴尬。

我想拥有内部版本号或类似信息是非常常见的用例,所以我想知道 thre 是否是一种更简单的访问此类信息的方法。

不,您确实需要定义一个自定义规则,以便能够使用从workspace_status_command传递到info_fileversion_file文件的信息,即使这样,您也不能仅从 Starlark 访问它的值,您可以将文件传递给您的工具(包装器(并在那里处理输入。毕竟,(构建(规则不会执行任何内容,它们会发出要在稍后阶段执行的操作。

但要小心,因为如果您依赖于info_file(STABLE_*条目(,则对文件的更改会使目标失效。对于像 CI 内部版本号这样的东西,它通常不是你想要的,version_file更有可能是你想要的。您可能想要记录 id,但通常不希望仅仅因为构建 ID 已更改(这是新的 CI 运行(而重新生成内容。但是,如果您希望结果完全可重现,则即使简单地包含 ID 也可能被视为有问题。

拥有可变的工件名称是一个全新的问题,有充分的理由不这样做。但一般来说,由于按照建议,名称将在执行操作期间决定(在工具中读取version_file(,因此您已经过了分析阶段来决定操作的结果。我目前知道的唯一方法(即对于变量输入的树外源,您当然可以随时定义一个 Starlark 变量并从您的BUILD文件中load它(能够做到这一点是使用树工件(在您的规则中使用declare_directory

您无法在加载或分析时(例如在宏中(访问该值。

可以在执行时访问它。

def _my_rule_impl(ctx):
output = ctx.actions.declare_file("%s.txt" % ctx.attr.name)

ctx.actions.run_shell(
args = [ctx.info_file.path, output.path],
command = 'grep -oP "(?<=STABLE_BUILD_NUMBER=).*" "$1" > "$2"',
inputs = [ctx.info_file],
outputs = [output]
)
return [DefaultInfo(files = depset([output]))]
my_rule = rule(
implementation = _my_rule_impl,
)

STABLE_BUILD_EMBED_LABEL开头的工作空间状态变量ctx.info_file并包含在缓存键中。其他的在ctx.version_file中,它被排除在缓存键之外。


如果要在分析时访问它,可以使用生成设置。

如果你想在加载时访问它,你可以写一个 Starlark 文件。

BUILD_NUMBER = ""
echo BUILD_NUMBER="$BUILD_NUMBER" > vars.bzl

最新更新