我们想要的是一个可移植的 Docker 容器,它可以容纳我们的 Angular 应用程序及其服务器以及它需要的任何机器映像,我们可以在任何云提供商上启动它,我们将创建一个增量管道。 “Docker 规则”很快。本质上,它通过添加新的 Docker 层来提供工具,因此您对应用程序所做的更改是唯一通过网络发送到云主机的内容。此外,由于 Docker 镜像带有 SHA 标记,我们只重新部署更改的镜像。为了管理我们的生产部署,我们将使用 Kubernetes,其中也存在 Bazel 规则。据我所知,使用 Bazel 从 Dockerfile 构建 docker 映像是不可能的,因为
由于 Dockerfile 的非密封性质,这是设计上不允许的。(来源:
https://blog.bazel.build/2015/07/28/docker_build.html)
作为源代码的一部分所做的更改将部署在 Kubernetes 集群中,这是使用 Bazel 实现以下目标的一种方法。
-
我们必须将 Bazel 置于 watch 模式,Deploy replace 告诉 Kubernetes 集群更新应用程序的部署版本。
一个。
命令:ibazel run :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(
铬=真,
火狐=真,
)
“BUILD.bazel”文件。
• 加载已下载的模块 ng_module、项目模块等。
• 使用“default_visibility”设置默认可见性
• 如果您有任何 Jasmine 测试,请使用 ts_config 并提及其中的依赖关系。
• ng_module(此处应提及资产、来源和依赖关系)
• 如果您有任何延迟加载脚本,请将其作为捆绑包的一部分提及
• 提及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"
)
使用以下命令构建捆绑包。
bazel build :bundle
管道:通过 Jenkins
通过 Jenkins 创建管道并运行管道有几个阶段。每个 Stage 执行单独的任务,但在我们的例子中,我们使用 Stage 通过 BaZel Run 发布图像。
pipeline {
agent any
stages {
stage('Publish image') {
steps {
sh 'bazel run //src/server:push'
}
}
}
}
注意:
bazel run :dev.apply
-
Dev 将映射应用到 kubectl apply,这将创建或替换现有配置。(有关更多信息,请参阅 kubectl 文档。)这将应用已解析的模板,其中包括重新发布图像。此操作旨在成为快速迭代开发(重建/重新发布/重新部署)的主力。
-
如果你想使用 workpsace 文件拉取容器,请使用下面的标签
container_pull(
name = "debian_base",
摘要 =“sha256:**”,
注册表=“gcr.io”,
存储库 = "google-appengine/debian9",
)
如果使用GKE,则需要安装gcloud sdk,由于我们使用的是GKE(Google Contianer Enginer),可以使用以下方法进行身份验证。
gcloud container clusters get-credentials <CLUSTER NAME>
Deploymnet 对象应按以下格式提及:
load("@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"
},
)
来源: