【发布时间】:2018-09-03 21:51:33
【问题描述】:
我们有一个项目,其中包含 20 多个小型服务,这些服务都驻留在同一个存储库中,并使用 bazel 构建。
为了减少管理开销,我们希望自动生成尽可能多的内容,包括我们的图像和 k8s 部署。 所以问题是:
有没有办法避免通过规则或函数在k8s_deploy步骤中设置image key?
我们已经有了一个规则,该规则将清单中的图像模板化为基于标签的图像名称(和 k8s 对象名称):
_TEMPLATE = "//k8s:deploy.yaml"
def _template_manifest_impl(ctx):
name = '{}'.format(ctx.label).replace("//cmd/", "").replace("/", "-").replace(":manifest", "")
ctx.actions.expand_template(
template = ctx.file._template,
output = ctx.outputs.source_file,
substitutions = {
"{NAME}": name,
},
)
template_manifest = rule(
implementation = _template_manifest_impl,
attrs = {
"_template": attr.label(
default = Label(_TEMPLATE),
allow_single_file = True,
),
},
outputs = {"source_file": "%{name}.yaml"},
)
这样//cmd/endpoints/customer/log 下的服务将生成图像eu.gcr.io/project/endpoints-customer-log。
虽然到目前为止这工作正常,但我们仍然必须手动设置 images 字典为 k8s_deploy 像这样:
k8s_deploy(
name = "dev",
images = {
"eu.gcr.io/project/endpoints-customer-log:dev": ":image",
},
template = ":manifest",
)
摆脱它会很棒,但我还没有找到方法。 使用规则不起作用,因为图像不带标签,使用函数不起作用,因为我发现无法访问其中的上下文。
我错过了什么吗?
【问题讨论】:
标签: kubernetes bazel