Bazel -在Monorepo内构建、推送、部署Docker容器到Kubernetes

gg58donl  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(3)|浏览(192)

我 有 一 个 带有 一些 后端 ( Node.js ) 和 前端 ( Angular ) 服务 的 monorepo 。
1.检查 测试 是否 通过
1.为 我 的 服务 构建 Docker 映像
1.将 Docker 映像 推送 到 容器 注册 表
1.使用 kubectl 将 更改 应用 到 Kubernetes 集群 ( GKE
我 的 目标 是 在 BazelCloud Build 的 帮助 下 自动 化 所有 这些 步骤 。
要 使 它 工作 , 我 可能 需要 添加 一 个 WORKSPACE 文件 与 我 的 外部 依赖 项 和 多 个 BUILD 文件 为 我 自己 的 包/服务 ? * 我 需要 帮助 与 实际 的 实现 : *
1.如何 使用 Bazel 构建 我 的 Dockerfiles ?
1.如何 将 这些 图像 推送 到 注册 表 中 ( 最 好 是 GCR ) ?
1.如何 自动 将 更改 应用 到 Google Kubernetes 引擎 ?
1.如何 将 此 工具 链 与 Google Cloud Build 集成 ?

# 有关 项目 的 更多 信息

我 整理 了 一 个 小 的 sample monorepo 来 展示 我 的 用例
结构

├── kubernetes
├── packages
│   ├── enums
│   ├── utils
└── services
    ├── gateway

中 的 每 一 个

# # # 常规

  • Gateway 服务 依赖 于 enumsutils
  • 一切 都 是 用 打字 稿 写 的
  • 每个 服务/程序 包 都 是 一 个 节点 模块
  • gateway 文件 夹 中 有 一 个 Dockerfile , 我 想 构建 它
  • Kubernetes 配置 位于 kubernetes 文件 夹 中 。
  • 注意 , 我 不 想 发布 任何 npm 包 !
drkbr07n

drkbr07n1#

我们想要的是一个便携式Docker容器,它可以容纳我们的Angular应用程序及其服务器和所需的任何机器映像,我们可以在任何云提供商上提供。我们将创建一个增量的完整管道。“Docker规则”非常快。本质上,它通过添加新的Docker层提供工具。这样,您对应用程序所做的更改将成为唯一通过网络发送到云主机的内容。此外,由于Docker映像使用SHA进行标记,因此我们仅重新部署发生更改的映像。为了管理我们的生产部署,我们将使用Kubernetes,Bazel规则也存在。使用Bazel从Dockerfile构建一个Docker映像是不可能的,因为它的设计是不允许的,由于Dockerfile的非密封性质。(来源:(第10页)
作为源代码的一部分所做的更改将部署在Kubernetes集群中,这是使用Bazel实现以下操作的一种方法。
1.我们必须将Bazel置于监视模式,Deploy replace命令Kubernetes集群更新应用的已部署版本。a.
命令:ibazel运行:部署.替换
1.如果有任何源代码更改,请在Angular 中进行更改。

  1. Bazel增量地重建构建图中依赖于更改文件的部分,在本例中,这包括更改的ng_module、包含该模块的Angular应用程序以及保存服务器的Docker nodejs_image。构建完成后,它会将新的Docker容器推送到GoogleContainerRegistry,KubernetesEngine示例开始为它提供服务。Bazel理解构建图,它只重建更改的内容。
    这里有一些片段级别的提示,实际上可以帮助。

工作区文件:

创建一个Bazel工作区文件,WORKSPACE文件告诉Bazel这个目录是一个“工作区”,类似于一个项目根目录。在Bazel工作区中要做的事情如下所列。·工作区的名称应该与我们发布的npm包相匹配。这样这些导入在引用发布的包时也有意义。·使用“http_archive”提及Bazel工作区中的所有规则,当我们使用Angular 和节点时,应提及rxjs、angular、angular_material、io_bazel_rules_sass、Angular 版本、build_bazel_rules_typescript、build_bazel_rules_nodejs的规则。· -接下来,我们必须使用“load”加载依赖项。sass_repository、ts_setup_workspace、angular_material_setup_workspace、ng_setup_workspace、·同时加载Docker基础映像。在我们的例子中,它是“@io_bazel_rules_docker//nodejs:image.bzl”,·不要忘记提到浏览器和web测试库web_test_repositories()浏览器_repositories(chrome = True,firefox = True,)

“构建.bazel”文件。

·加载已下载的模块ng_module,项目模块等·使用“default_visibility”设置默认可见性·如果您有任何Jasmine测试,请使用ts_config并提及其中的依赖关系。· ng_module(资产、此处应提及源和依赖项)·如果您有任何延迟加载脚本,请将其作为捆绑包的一部分提及·提及web_中的根目录·最后提到数据和欢迎页面/默认页面。
示例代码段:

load("@angular//:index.bzl", "ng_module")
ng_module(
    name = "src",
    srcs = glob(["*.ts"]),
    tsconfig = ":tsconfig.json",
    deps = ["//src/hello-world"],
)
load("@build_bazel_rules_nodejs//:future.bzl", "rollup_bundle")
rollup_bundle(
  name = "bundle",
  deps = [":src"]
  entry_point = "angular_bazel_example/src/main.js"
)

使用Below命令构建束。

bazel build :bundle

管道:通过Jenkins

通过Jenkins创建管道并运行管道需要几个阶段。每个阶段执行单独的任务,但在我们的示例中,我们使用BaZel Run通过阶段发布图像。

pipeline {
  agent any
  stages {
    stage('Publish image') {
      steps {
        sh 'bazel run //src/server:push'
      }
    }
  }
}

注意事项:

bazel run :dev.apply
  1. Dev Apply maps to kubectl apply,这将创建或替换现有的配置。(更多信息请参见kubectl文档。)这将应用解析的模板,包括重新发布映像。此操作旨在成为快速迭代开发(重建/重新发布/重新部署)的主力。
    1.如果要使用工作空间文件提取容器,请使用以下标记
    容器_pull(名称=“debian_base”,摘要=“sha 256:**",注册表=“gcr.io“,储存库=“google-appengine/debian 9”,)
    如果使用GKE,则需要安装gcloud sdk,因为我们使用的是GKE(Google Contianer Enginer),它可以使用以下方法进行身份验证。
gcloud container clusters get-credentials <CLUSTER NAME>

Deploymnet对象应采用以下格式:
加载(“@io_bazel_rules_k8s//k8s:对象.bzl”,“k8s_对象”)

k8s_object(
  name = "dev",
  kind = "deployment",
  template = ":deployment.yaml",
  images = {
    "gcr.io/rules_k8s/server:dev": "//server:image"
  },
)

来源:

atmip9wb

atmip9wb2#

几个月后,我在整个过程中已经走得相当远了。在这里发布每一个细节都太多了!
下面是一个开源项目,它实现了大多数需求:https://github.com/flolu/fullstack-bazel
有具体问题请随时联系我!:)
祝你好运

v2g6jxz6

v2g6jxz63#

Flo,您是否考虑过使用terraform和makefile来自动构建集群?
在我最近的项目中,我用make & terraform端到端地自动化基础设施。基本上,这种方法用一个命令在3 - 5分钟内构建整个集群,构建和部署整个项目。这取决于gcp在给定的一天有多快。
有一个google示例项目展示了这个想法,尽管terraform配置已经过时,需要用符合当前0.13 / 0/14语法的配置替换。
https://github.com/GoogleCloudPlatform/gke-bazel-demo#build--deploy-with-bazel
启用单命令端到端自动化的makefile:
https://github.com/GoogleCloudPlatform/gke-bazel-demo/blob/master/Makefile
同样,替换或自定义项目的脚本;我实际上写了两个脚本,一个用于检查/安装客户端的需求,例如git / kubctl & gcloud,另一个用于检查或配置& authentication gcloud,以防它还没有配置和验证。从那里,terraform脚本接管并构建整个集群,一旦完成,通常的自动部署就开始了。
我发现分层的想法,使超过terraform和bazel的端到端自动化只是辉煌的。

相关问题