我 有 一 个 带有 一些 后端 ( Node.js ) 和 前端 ( Angular ) 服务 的 monorepo 。
1.检查 测试 是否 通过
1.为 我 的 服务 构建 Docker 映像
1.将 Docker 映像 推送 到 容器 注册 表
1.使用 kubectl 将 更改 应用 到 Kubernetes 集群 ( GKE )
我 的 目标 是 在 Bazel 和 Cloud Build 的 帮助 下 自动 化 所有 这些 步骤 。
要 使 它 工作 , 我 可能 需要 添加 一 个 WORKSPACE
文件 与 我 的 外部 依赖 项 和 多 个 BUILD
文件 为 我 自己 的 包/服务 ? * 我 需要 帮助 与 实际 的 实现 : *
1.如何 使用 Bazel 构建 我 的 Dockerfiles ?
1.如何 将 这些 图像 推送 到 注册 表 中 ( 最 好 是 GCR ) ?
1.如何 自动 将 更改 应用 到 Google Kubernetes 引擎 ?
1.如何 将 此 工具 链 与 Google Cloud Build 集成 ?
# 有关 项目 的 更多 信息
我 整理 了 一 个 小 的 sample monorepo 来 展示 我 的 用例
结构
├── kubernetes
├── packages
│ ├── enums
│ ├── utils
└── services
├── gateway
中 的 每 一 个
# # # 常规
Gateway
服务 依赖 于enums
和utils
- 一切 都 是 用 打字 稿 写 的
- 每个 服务/程序 包 都 是 一 个 节点 模块
- 在
gateway
文件 夹 中 有 一 个Dockerfile
, 我 想 构建 它 - Kubernetes 配置 位于
kubernetes
文件 夹 中 。 - 注意 , 我 不 想 发布 任何
npm
包 !
3条答案
按热度按时间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 中进行更改。
这里有一些片段级别的提示,实际上可以帮助。
工作区文件:
创建一个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_中的根目录·最后提到数据和欢迎页面/默认页面。
示例代码段:
使用Below命令构建束。
管道:通过Jenkins
通过Jenkins创建管道并运行管道需要几个阶段。每个阶段执行单独的任务,但在我们的示例中,我们使用BaZel Run通过阶段发布图像。
注意事项:
1.如果要使用工作空间文件提取容器,请使用以下标记
容器_pull(名称=“debian_base”,摘要=“sha 256:**",注册表=“gcr.io“,储存库=“google-appengine/debian 9”,)
如果使用GKE,则需要安装gcloud sdk,因为我们使用的是GKE(Google Contianer Enginer),它可以使用以下方法进行身份验证。
Deploymnet对象应采用以下格式:
加载(“@io_bazel_rules_k8s//k8s:对象.bzl”,“k8s_对象”)
来源:
atmip9wb2#
几个月后,我在整个过程中已经走得相当远了。在这里发布每一个细节都太多了!
下面是一个开源项目,它实现了大多数需求:https://github.com/flolu/fullstack-bazel
有具体问题请随时联系我!:)
祝你好运
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的端到端自动化只是辉煌的。