目标
我有一个monorepo设置,有越来越多的服务。当我部署应用程序时,我运行一个命令,每个服务都将被重建,最终的Docker映像将被发布。但是,随着服务数量的增加,重建所需的时间越来越长,尽管只对其中的几个进行了更改。
为什么我的安装程序要重建所有的Docker映像,尽管只有少数几个已经改变了?我的目标是重建并只发布实际具有changed. 的映像。
详细信息
我正在使用Bazel构建我的Docker映像,因此在我的项目根目录中有一个BUILD文件,它包含了我想要部署时运行的目标。它只是一个k8s_objects的集合,其中包含了所有服务:
load("@io_bazel_rules_k8s//k8s:objects.bzl", "k8s_objects")
k8s_objects(
name = "kubernetes_deployment",
objects = [
"//services/service1",
"//services/service2",
"//services/service3",
"//services/service4",
# ...
]
)同样,每个服务都有一个BUILD文件,它首先从所有源文件创建类型记录库,然后创建Node.Js映像,最后将图像传递给Kubernetes对象:
load("@npm_bazel_typescript//:index.bzl", "ts_library")
ts_library(
name = "lib",
srcs = glob(
include = ["**/*.ts"],
exclude = ["**/*.spec.ts"]
),
deps = [
"//packages/package1",
"//packages/package2",
"//packages/package3",
],
)
load("@io_bazel_rules_docker//nodejs:image.bzl", "nodejs_image")
nodejs_image(
name = "image",
data = [":lib", "//:package.json"],
entry_point = ":index.ts",
)
load("@k8s_deploy//:defaults.bzl", "k8s_deploy")
k8s_object(
name = "service",
template = ":service.yaml",
kind = "deployment",
cluster = "my-cluster"
images = {
"gcr.io/project/service:latest": ":image"
},
)注意,类型记录库也依赖于一些包,在重新部署时也应该考虑到这些包!
要部署,我运行bazel run :kubernetes_deployment.apply
最初,我决定选择Bazel的原因之一是因为我认为它只处理构建,只处理更改后的服务本身。但很明显,这不是事实,就是我的设置在某种程度上是错误的。
如果您需要对项目有更详细的了解,可以在这里查看:https://github.com/flolude/cents-ideas
发布于 2020-04-20 11:23:34
看起来Bazel回购公司自己也做了类似的事情:
https://github.com/bazelbuild/bazel/blob/ef0f8e61b5d3a139016c53bf04361a8e9a09e9ab/scripts/ci/ci.sh
粗略的步骤是:
file2.txt)
kind(.*_binary, rdeps(//..., set(file1.txt file2.txt)))将查找与file1.txt或的依赖关系的所有二进制目标,目标列表)
您将需要根据您的需要修改这个脚本(例如,确保它找到停靠者图像目标)
要找出目标的类型,可以使用bazel query //... --output label_kind
编辑:任何想进入这个兔子洞的人(特别是如果你绝对不想错过CI测试的话):
你需要考虑:
删除的文件/生成文件(依赖它们的人) anymore!
我认为沿着这条路线走(如果可能的话)会有大量的复杂性。通过使用远程缓存和--subcommands来计算需要执行哪些副作用,依赖Bazel本身来判断变化的可能性可能更小。
https://stackoverflow.com/questions/60279671
复制相似问题