我的Monorepo设置中有越来越多的服务services。部署应用程序时,我将运行命令并重新构建every]服务,并发布最终的Docker映像。但是,随着服务数量的增加,重建所有服务所需的时间越来越长,尽管仅对其中一些服务进行了更改。
为什么我的设置会重建所有Docker映像,尽管只有少数更改了?我的目标是仅重建和发布实际上已更改
。的图像我正在使用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
文件,该文件首先从所有源文件中创建一个Typescript库,然后创建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" }, )
请注意,Typescript库也取决于某些软件包,在重新部署时也应考虑在内!
要部署,我运行bazel run :kubernetes_deployment.apply
起初,我决定选择Bazel的一个原因是,我认为它可以只处理已更改的服务本身。但是显然不是这样,或者我的设置在某种程度上有问题。
如果您需要对项目有更详细的了解,可以在这里查看:https://github.com/flolude/cents-ideas
目标我的Monorepo设置具有越来越多的服务服务。当我部署应用程序时,我运行一个命令,并且将重新构建每个服务,并且最终的Docker映像将是...
看起来像Bazel回购本身也做类似的事情: