选择性地部署Bazel构建的工件

选择性地部署Bazel构建的工件,bazel,Bazel,我通过bazel build生成工件。我只想在这些工件发生更改时部署它们 检测工件是否改变的最佳方法是什么 …有没有办法获取构建目标的摘要?理想情况下不需要构建它?这里的方法在很大程度上取决于所有细节 一种方法是使用构建事件协议进行设置: 这可能比您想要处理的设置更多 另一种方法是使用genrules或类似方法散列您感兴趣的所有工件(我不知道如何让bazel输出工件散列)。然后创建一个二进制文件(sh_binary,或其他文件),将您感兴趣的所有工件及其哈希值作为输入,并将这些哈希值与部署的哈

我通过
bazel build
生成工件。我只想在这些工件发生更改时部署它们

检测工件是否改变的最佳方法是什么


…有没有办法获取构建目标的摘要?理想情况下不需要构建它?

这里的方法在很大程度上取决于所有细节

一种方法是使用构建事件协议进行设置:

这可能比您想要处理的设置更多

另一种方法是使用
genrules
或类似方法散列您感兴趣的所有工件(我不知道如何让bazel输出工件散列)。然后创建一个二进制文件(
sh_binary
,或其他文件),将您感兴趣的所有工件及其哈希值作为输入,并将这些哈希值与部署的哈希值进行比较,然后部署更改的内容

另一种方法是创建一个Starlark规则,该规则为您感兴趣的每件事情注册一个“部署操作”。Bazel将仅为那些在每次运行部署目标时已更改的工件运行部署操作。可能看起来像这样:

defs.bzl

def\u deploy\u impl(ctx):
部署_结果=[]
对于ctx.attr.deployables中的可部署组件:
部署\u结果=ctx.actions.declare\u文件(
ctx.label.name+“\u”+deployable.label.name+“\u deploy\u result”)
deploy\u result.append(deploy\u result)
deploy_args=ctx.actions.args()
部署参数添加(部署结果)
部署参数添加(ctx.attr.destination)
deploy_args.add_all(deployable.files)
ctx.actions.run(
executable=ctx.attr.\u deploy\u tool.files\u to\u run,
输入=deployable.files,
输出=[deploy_result],
参数=[deploy_args],
执行要求={
“无沙箱”:“1”,
“本地”:“1”,
“无缓存”:“1”,
“无远程缓存”:“1”,
“无远程”:“1”,
})
return[DefaultInfo(files=depset(deploy_results))]
部署=规则(
实现=\u部署\u实施,
属性={
“可部署”:属性标签列表(),
“目的地”:属性字符串(必需=真),
“部署工具”:属性标签(默认=“/:部署工具”,cfg=“主机”),
}
)
部署工具sh

result_file_path=“$1”
转移
destination=“$1”
转移
echo“将$@部署到$destination”
cp-f--目标目录“$destination”$@
触摸“$result\u file\u path”
构建


加载(“:defs.bzl”,“部署”)
genrule(
name=“gen_a”,
srcs=[“a”],
outs=[“a.out”],
cmd=“cp$<$@”,
)
genrule(
name=“gen_b”,
srcs=[“b”],
outs=[“b.out”],
cmd=“cp$<$@”,
)
genrule(
name=“gen_c”,
srcs=[“c”],
outs=[“c.out”],
cmd=“cp$<$@”,
)
部署(
name=“部署”,
可部署设备=[
“:gen_a”,
“:gen_b”,
“:gen_c”,
],
destination=“/tmp”,
)
双星(
name=“部署工具”,
srcs=[“deploy_tool.sh”],
)
用法:

$ bazel build deploy
INFO: Analyzed target //:deploy (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
INFO: From Action deploy_gen_a_deploy_result:
deploying bazel-out/k8-fastbuild/bin/a.out to /tmp
INFO: From Action deploy_gen_c_deploy_result:
deploying bazel-out/k8-fastbuild/bin/c.out to /tmp
INFO: From Action deploy_gen_b_deploy_result:
deploying bazel-out/k8-fastbuild/bin/b.out to /tmp
Target //:deploy up-to-date:
  bazel-bin/deploy_gen_a_deploy_result
  bazel-bin/deploy_gen_b_deploy_result
  bazel-bin/deploy_gen_c_deploy_result
INFO: Elapsed time: 0.146s, Critical Path: 0.02s
INFO: 3 processes: 3 local.
INFO: Build completed successfully, 5 total actions
一些注意事项:

  • “部署操作”本质上是非常不封闭的,这通常被认为是不好的,但在这里它很好。特别是,查看操作的所有“执行需求”

  • Bazel将尝试并行运行所有部署操作,这可能是好的,也可能是坏的

  • 可以将
    deploy
    规则设置为可执行规则,以便与
    bazel run
    一起使用,这听起来可能更好

  • 如果您真的愿意,这个示例也可以使用宏来完成,但它会创建许多“人造”目标


  • 适当的方面可以帮助这里:感谢您的详细答复!我一个人朝着这个方向发展,你帮我省了很多研究。非常感谢。