选择性地部署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
一些注意事项:
deploy
规则设置为可执行规则,以便与bazel run
一起使用,这听起来可能更好适当的方面可以帮助这里:感谢您的详细答复!我一个人朝着这个方向发展,你帮我省了很多研究。非常感谢。