使用 Github 和 Google Kubernetes Engine 管理环境

Manage environments with Github and Google Kubernetes Engine

我有一个 Github 存储库,上面有 2 个分支,developmain。第一个是“测试”环境,另一个是“生产”环境。我正在使用 Google Kubernetes Engine,并且我已经实现了从 Github 上的推送到 GKE 上的部署的自动化部署。所以我们的工作流程是:

  1. develop
  2. 编写代码并在本地测试
  3. 当本地一切正常时,继续推送 develop(它将自动部署到 GKE 工作负载 app_name_develop
  4. QA 测试 app_name_develop
  5. 如果 QA 测试通过,我们将创建一个拉取请求以将 develop 放入 main
  6. 在 GKE 工作负载 app_name_production 上自动部署(来自 main 分支)

容器的部署在Dockerfile中定义,Kubernetes部署在kubernetes/app.yaml中定义。这两个文件在回购协议中使用 Git 进行跟踪。

这里的问题是当我们创建一个拉取请求将 develop 放入 main 时,它还从 [=14] 中获取了两个文件 app.yamlDockerfile =] 到 main。我们最终得到了 maindevelop 的设置,它把整个事情搞得一团糟。

我无法在这些文件中定义环境变量,因为它可能会在错误的分支中结束。 我的问题是:如何从拉取请求中排除这些文件?或者有什么方法可以管理多个环境而无需在每次拉取请求后手动修改文件?

我不知道它是否可以 hlphere 是我的 Dockerfile :

FROM python:3.8

RUN apt-get update && apt-get install -y --no-install-recommends

RUN python -m pip install --upgrade pip

WORKDIR /app/

COPY requirements.txt .
RUN python -m pip install -r requirements.txt

COPY . .

EXPOSE 8080
CMD ["gunicorn", "-b", ":8080", "main:app"]

这是我要部署在 GKE 上的 YAML 文件(实际上我在创建自动部署时采用了 GKE 建议的文件):

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: app_name-api
  name: app_name-api
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app_name-api
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: app_name-api
    spec:
      containers:
        - image: gcr.io/path_to_image/github.com/company_name/app_name
          imagePullPolicy: IfNotPresent
          name: app_name-1
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  labels:
    app: app_name-api
  name: app_name-api-pod-autoscaler
  namespace: default
spec:
  maxReplicas: 3
  metrics:
    - resource:
        name: cpu
        targetAverageUtilization: 80
      type: Resource
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: app_name-api

非常感谢您提供的任何帮助!

您不能有选择地忽略拉取请求中的某些文件。但是有两个简单的解决方法:

先-
从“develop”创建一个新分支

替换 'main'

中不需要的文件

从这个新分支创建拉取请求

第二-
从 'main'

创建一个新分支

将所需文件的更改从 'develop'

从这个新分支创建拉取请求

这些方法中的任何一种都可以。哪个更容易取决于要包含/排除多少文件。

示例:
以 main 为目标,dev 为源

root 
|-- src 
| -- app.py 
|-- .gitignore 
|-- settings.py 
|-- requirements.txt

比方说,我想忽略 settings.py 文件的合并 首先移动到目标分支(要合并更改的分支)

git checkout main

然后您可以使用git checkout 命令选择性地选择您要合并的文件

git checkout dev src/

这只会合并 src/ 文件夹中更改的文件

NOTE: You can also do it selectively for each file. 

然后推送到远程仓库

git push origin main

请记住,此解决方案仅在要排除的文件较小时才有用。

注意:“有一些工具专为解决此问题而构建,例如 skaffold 和 kustomize,但在一切正常之前,它们可能需要一些时间并重组您的存储库。因此,与此同时,这是一个简单的解决方案,需要手动工作,但可以在您学习和决定哪种更高级的仪器适合时进行。"