首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何重建和发布更改后的码头形象?

如何重建和发布更改后的码头形象?
EN

Stack Overflow用户
提问于 2020-02-18 11:17:24
回答 1查看 1.6K关注 0票数 6

目标

我有一个monorepo设置,有越来越多的服务。当我部署应用程序时,我运行一个命令,每个服务都将被重建,最终的Docker映像将被发布。但是,随着服务数量的增加,重建所需的时间越来越长,尽管只对其中的几个进行了更改。

为什么我的安装程序要重建所有的Docker映像,尽管只有少数几个已经改变了?我的目标是重建并只发布实际具有changed. 的映像。

详细信息

我正在使用Bazel构建我的Docker映像,因此在我的项目根目录中有一个BUILD文件,它包含了我想要部署时运行的目标。它只是一个k8s_objects的集合,其中包含了所有服务:

代码语言:javascript
运行
复制
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对象:

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-04-20 11:23:34

看起来Bazel回购公司自己也做了类似的事情:

https://github.com/bazelbuild/bazel/blob/ef0f8e61b5d3a139016c53bf04361a8e9a09e9ab/scripts/ci/ci.sh

粗略的步骤是:

file2.txt)

  • build/test
  • 计算已更改
  • 的文件列表,使用文件列表并查找它们的受抚养人(例如,bazel查询kind(.*_binary, rdeps(//..., set(file1.txt file2.txt)))将查找与file1.txt

的依赖关系的所有二进制目标,目标列表)

您将需要根据您的需要修改这个脚本(例如,确保它找到停靠者图像目标)

要找出目标的类型,可以使用bazel query //... --output label_kind

编辑:任何想进入这个兔子洞的人(特别是如果你绝对不想错过CI测试的话):

你需要考虑:

删除的文件/生成文件(依赖它们的人) anymore!

  • 删除的文件/编译文件(依赖它们)移动文件的
    • 注释==已删除+添加的文件也不能查询不存在的文件/生成的反向deps

  • 修改了构建文件(为了安全起见,确保构建中所有目标的所有反向deps都已构建)

我认为沿着这条路线走(如果可能的话)会有大量的复杂性。通过使用远程缓存和--subcommands来计算需要执行哪些副作用,依赖Bazel本身来判断变化的可能性可能更小。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60279671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档