我有一个带有一些后端(Node.js)和前端(Angular)服务的monorepo。目前,我的部署过程如下所示:

  • 检查测试是否通过
  • 为我的服务生成docker镜像
  • 将Docker镜像推送到容器注册表
  • 使用GKE将更改应用于Kubernetes集群(kubectl)

  • 我的目标是在BazelCloud Build的帮助下自动化所有这些步骤。但我真的很难开始使用Bazel:

    为了使其正常工作,我可能需要为自己的软件包/服务添加一个带有外部依赖项的WORKSPACE文件和多个BUILD文件?我需要实际实现的帮助:
  • 如何使用Bazel构建我的Dockerfile?
  • 如何将这些图像推送到注册表中(最好是GCR)?
  • 如何自动将更改应用于Google Kubernetes Engine?
  • 如何将此工具链与Google Cloud Build集成?

  • 有关项目的更多信息



    结构体
    ├── kubernetes
    ├── packages
    │   ├── enums
    │   ├── utils
    └── services
        ├── gateway
    

    一般
  • Gateway服务取决于enumsutils
  • 一切都用 typescript
  • 编写
  • 每个服务/程序包都是一个节点模块
  • Dockerfile文件夹中有一个gateway,我想将其构建为
  • Kubernetes配置位于kubernetes文件夹中。
  • 注意,我不想发布任何npm包!
  • 最佳答案

    我们想要的是一个可移植的Docker容器,该容器可容纳我们的Angular应用及其服务器以及所需的任何计算机镜像,以便可以在任何Cloud提供程序上运行,我们将创建一个完整的增量管道。 “Docker规则”很快。本质上,它通过添加新的Docker层来提供工具性,因此您对应用程序所做的更改是唯一通过电线发送到云主机的内容。另外,由于Docker镜像使用SHA标记,因此我们仅重新部署已更改的镜像。为了管理生产部署,我们将使用Kuzelnetes,Bazel规则也存在。据我所知,无法使用Bazel从Dockerfile构建Docker镜像,因为
    由于Dockerfile的非封闭性质,因此在设计上不允许这样做。
    https://blog.bazel.build/2015/07/28/docker_build.html)

    作为源代码的一部分所做的更改将被部署在Kubernetes Cluster中,这是使用Bazel实现以下目标的一种方法。

  • 我们必须将Bazel置于监视模式,Deploy replace告诉Kubernetes集群更新应用程序的部署版本。
    一种。

    命令:ibazel运行:deploy.replace
  • 如果有任何源代码更改,请按 Angular 进行操作。
  • Bazel仅依赖于已更改的文件逐步重新构建构建图的部分,在本例中,该部分包括已更改的ng_module,包含该模块的Angular应用程序以及保存服务器的Docker nodejs_image。当我们要求更新部署时,在构建完成后,它将新的Docker容器推送到Google Container Registry,而Kubernetes Engine实例开始为其提供服务。 Bazel理解构建图,它仅重新构建所做的更改。

  • 以下是一些摘录级别的提示,它们实际上可以提供帮助。

    工作空间文件:

    创建一个Bazel工作区文件,WORKSPACE文件告诉Bazel这个目录是一个“工作区”,就像一个项目根目录。下面列出了在Bazel工作区中要执行的操作。
    •工作空间的名称应与我们在其中发布的npm软件包相匹配,以便这些导入在引用已发布的软件包时也很有意义。
    •使用“http_archive”提及Bazel工作区中的所有规则,当我们使用angular和node时,应该为rxjs,angular,angular_material,io_bazel_rules_sass,angular-version,build_bazel_rules_typescript,build_bazel_rules_nodejs提及这些规则。
    •-接下来,我们必须使用“load”加载依赖项。 sass_repositories,ts_setup_workspace,angular_material_setup_workspace,ng_setup_workspace,
    •还加载Docker基本镜像,在本例中为“@ io_bazel_rules_docker // nodejs:image.bzl”,
    •不要忘记提及浏览器和Web测试存储库
    web_test_repositories()
    browser_repositories(
    Chrome =真,
    firefox =正确,
    )

    “BUILD.bazel”文件。

    •加载已下载的模块ng_module,项目模块等。
    •使用“default_visibility”设置默认可见性
    •如果您有任何Jasmine测试,请使用ts_config并提及其中的依赖关系。
    •ng_module(此处应提及 Assets ,来源和代理)
    •如果您有任何延迟加载脚本,请在 bundle 软件中提及它
    •在web_package中提及根目录。
    •最后,提及数据和欢迎页面/默认页面。

    样本片段:
    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"
    )
    

    使用以下命令构建 bundle 包。
    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
    
  • Dev Apply映射到kubectl apply,这将创建或替换现有配置。(有关更多信息,请参见kubectl文档。)这将应用已解析的模板,其中包括重新发布图像。此操作旨在成为快速迭代开发(重建/重新发布/重新部署)的主力军。
  • 如果要使用workpsace文件提取容器,请使用以下标记

    container_pull(
    名称=“debian_base”,
    摘要=“sha256:**”,
    注册表=“gcr.io”,
    repository =“google-appengine / debian9”,
    )

  • 如果使用GKE,则需要安装gcloud sdk,并且当我们使用GKE(Google Contianer Enginer)时,可以使用以下方法进行身份验证。
    gcloud container clusters get-credentials <CLUSTER NAME>
    

    应该以以下格式提及Deploymnet对象:

    加载(“@ io_bazel_rules_k8s // k8s:object.bzl”,“k8s_object”)
    k8s_object(
      name = "dev",
      kind = "deployment",
      template = ":deployment.yaml",
      images = {
        "gcr.io/rules_k8s/server:dev": "//server:image"
      },
    )
    
    Sources :
    •    https://docs.bazel.build/versions/0.19.1/be/workspace.html
    •    https://github.com/thelgevold/angular-bazel-example
    •    https://medium.com/@Jakeherringbone/deploying-an-angular-app-to-kubernetes-using-bazel-preview-91432b8690b5
    •    https://github.com/bazelbuild/rules_docker
    •    https://github.com/GoogleCloudPlatform/gke-bazel-demo
    •    https://github.com/bazelbuild/rules_k8s#update
    •    https://codefresh.io/howtos/local-k8s-draft-skaffold-garden/
    •    https://github.com/bazelbuild/rules_k8s
    

    关于docker - Bazel-在Monorepo内将Docker容器构建,推送,部署到Kubernetes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58779568/

    10-12 23:06