使用 Container Builder 和 Kubernetes Engine 完成 NodeJS 持续部署
要了解如何使用此存储库的所有详细信息,请参阅dev.to上的相应区块帖子
您想将应用部署到 Kubernetes 集群,而无需任何手动步骤吗?
我已经帮您搞定了,使用 Google Cloud 创建持续部署流水线非常简单。
为了便于理解,我选择了 NodeJS Express 应用程序,但它也适用于 React、PHP 或任何其他应用层。
让我们开始吧:
首先,我们需要授予容器构建器访问我们 Kubernetes API 的权限。请记住,这不会授予对特定集群的访问权限。它只是允许 Cloudbuilder 服务帐户访问我们的 Kubernetes 集群。因此,请跳转到IAM 设置页面并查找 Cloudbuild 服务帐户。如果该帐户不存在,您可能需要启用Cloudbuild API。
我们需要添加访问我们集群的 Kubernetes API 的权限,因此请点击笔并查找以下内容。
我不会详细介绍如何设置 Express 应用程序并对其进行测试。
我创建了一个包含示例应用程序的仓库,我们可以使用它。
要了解如何使用此存储库的所有详细信息,请参阅dev.to上的相应区块帖子
为了方便您了解,我们有一个基本的 Express 应用,其中包含两个后端路由,分别用于检索用户或通过 ID 检索用户。
此外,我们还提供了一个测试文件夹,其中包含针对这两个路由的测试。这些测试是在 chai 和 mocha 的帮助下编写的。
如果您下载了代码库,可以执行以下操作来检查测试是否正常运行。
npm install
npm test
在应用程序运行之前,我们需要在 Kubernetes 集群中部署服务和应用。因此,让我们快速创建一个服务和一个部署。所有文件都可以在代码库中找到。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: server-production
labels:
app: YOUR-PROJECT-ID
spec:
replicas: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: server
spec:
containers:
- name: server
image: gcr.io/PROJECT_ID/REPOSITORY:master
imagePullPolicy: Always
ports:
- containerPort: 3000
env:
- name: NODE_ENV
value: "production"
这里唯一重要的部分是将项目 ID 和存储库更改为存储库将具有的路径。
之后,我们只需要一个服务来将我们的应用暴露到互联网上。所以赶紧申请服务吧。
kind: Service
apiVersion: v1
metadata:
name: server
spec:
selector:
app: server
ports:
- name: server
protocol: TCP
port: 80
targetPort: 3000
type: LoadBalancer
现在我们需要进入整个设置过程中最重要的部分——cloudbuild.yaml。我们将在这里定义持续部署步骤所需的所有内容。
第一个令人惊奇的部分是,可以将所有重要数据放入构建中定义的环境变量中,因此您可以将云构建用于不同的设置。
首先,我们安装所有节点依赖项并运行测试。
- name: 'gcr.io/cloud-builders/npm'
args: ['install']
- name: 'gcr.io/cloud-builders/npm'
args: ['run', 'test']
之后,我们会构建一个包含所有仓库文件和正确定义环境的 Docker 镜像,以便您可以轻松地进行临时部署,甚至分支部署。最后,我们会将其推送到 Google 镜像仓库。
- name: 'gcr.io/cloud-builders/docker'
args:
- build
- '--build-arg'
- 'buildtime_variable=$_NODE_ENV'
- '-t'
- gcr.io/$PROJECT_ID/$REPO_NAME:$BUILD_ID
- '.'
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/$REPO_NAME:$BUILD_ID']
同样重要的是要注意,我们用唯一的构建 ID 标记图像以利用 kubernetes 的应用能力,因此图像实际上发生了改变。
- name: 'gcr.io/cloud-builders/kubectl'
args:
- set
- image
- deployment
- $_DEPLOYMENT
- $_DEPLOYMENT=gcr.io/$PROJECT_ID/$REPO_NAME:$BUILD_ID
env:
- 'CLOUDSDK_COMPUTE_ZONE=$_CLUSTER_ZONE'
- 'CLOUDSDK_CONTAINER_CLUSTER=$_CLUSTER_NAME'
最后,我们将镜像设置到 Kubernetes 集群中。砰!提交钩子,自动化测试,如果成功,则自动部署,无需停机。
现在我们打开容器构建器触发器并选择我们的代码所在的位置。
在最后一个触发步骤中,我们现在可以添加自定义变量。这是我们实际定义集群的第一个步骤。这样,所有内容都聚合在一个地方,随时可用。
现在我们只需要提交给主服务器,然后触发器就会启动。
YIHA 现在我们有了持续部署,无需设置任何额外的服务,例如 jenkins、ant 或 chef。真是太棒了
我正在考虑创建一个从零开始到云端大师的教程系列,你有兴趣吗?给我留言吧!
链接:https://dev.to/mfahlandt/nodejs-continuous-deployment-done-with-container-builder-and-kubernetes-engine-in-google-cloud-570p