我们有一个项目,其中包含20多个小服务,这些小服务全部驻留在同一存储库中,并使用bazel构建。
为了减少管理开销,我们希望自动生成尽可能多的内容,包括映像和k8s部署。 所以问题是:
有没有办法避免通过规则或功能在k8s_deploy步骤中设置图像键?
我们已经有了一条规则,可以在清单中对图像进行模板处理,使其具有基于标签的图像名称(和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",
)
摆脱这个问题将是很棒的,但是我还没有找到办法。 使用规则不起作用,因为图像没有标签,而使用函数不起作用,因为我发现那里没有访问上下文的方法。
我想念什么吗?
答案 0 :(得分:0)
我发现从构建步骤中删除容器注册表名称的解决方案是使用bazel进行构建,使用skaffold进行部署。这两个步骤都在同一CI管道中执行。
我的skaffold.yaml非常简单,并提供了bazel目标到gcr名称的映射。
apiVersion: skaffold/v2alpha4
kind: Config
metadata:
name: my_services
build:
tagPolicy:
gitCommit:
variant: AbbrevCommitSha
artifacts:
- image: gcr.io/jumemo-dev/service1
bazel:
target: //server1/src/main/java/server1:server1.tar
- image: gcr.io/jumemo-dev/service2
bazel:
target: //server2/src/main/java/server2:server2.tar
使用以下命令调用
$ skaffold build