Bazel Monorepo-如何仅重建和发布更改的Docker映像?

问题描述 投票:3回答:1

目的

我的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映像将是...

docker kubernetes google-kubernetes-engine bazel monorepo
1个回答
0
投票

看起来像Bazel回购本身也做类似的事情:

© www.soinside.com 2019 - 2024. All rights reserved.