Jenkins:管理多个环境配置和部署

时间:2019-06-27 09:01:53

标签: jenkins deployment kubernetes devops

我正在开发一个拥有3个开发团队的产品。
1用于UI和
2用于后端。

每个团队都需要一个完整的环境来进行自己的测试。有10多个后端服务以及更多其他组件和4个UI组件。我们有以下环境:
3每个团队一个开发环境
1开发集成
2用于质量检查(自动和手动取笑)

所有环境都使用Kubernetes,所有服务都部署为容器。每个环境都有自己的数据库服务器。
在单个K8s集群上部署了3个开发环境和1个int环境,在另一个集群上部署了
2个QA环境。

每个环境在所有模块(CI和CD)上都有自己的一套詹金斯作业。因此,在不同的jenkins文件夹中,我们共有6份所有作业的副本(每个环境1个)。他们都使用来自devops回购的通用svc和dpl文件(作为模板存储)在相应的kubernetes env上部署服务。和CD作业具有用于相应环境的模板文件所需的所有必需变量和值。

现在,当任何模块进行了与部署相关的更改时,我们必须在dpl和svc文件中进行常规更改,但是任何新的配置变量或现有配置参数的更改都需要在每个env作业中进行。借助多版本产品支持,我预计每个版本将维护更多套完整的jenkins作业副本。

我有一些减少重复工作的想法,但想知道减少重复复制和维护这么多作业的最佳选择是什么。请协助,如果需要更多详细信息,请告诉我。

谢谢!发脾气

1 个答案:

答案 0 :(得分:0)

这太长了。 TL; DR:使用helm and flux

长版:

我认为这会将您的CI / CD管道过多放入Jenkins。这样可以很好地工作,但是当您将CI职责分配给Jenkins并使用专用的CD服务时,它会干净很多。我建议使用Helm进行部署,并使用Weave Flux进行管理。

Helm是Kuberentes的软件包管理器。本质上,这只是参数化Kubernetes模板并使用一些默认值和一些替代安装它们的一种方法。单独使用头盔可能会对您有很大帮助。

Flux是一种部署掌舵图和docker映像的方法。它实际上是CI / CD中的CD。 Flux网站上的此图显示了Flux如何监视Jenkins创建的新工件的映像存储库,以及用于更新部署配置的配置存储库(您的头盔图表)。

CI/CD Pipeline

现在,您已经让Jenkins构建您的应用程序,Helm能够部署您的Kubernetes配置,Flux能够监视更改,您如何使用一些常见的和一些自定义的配置值来创建多个环境?您可以将值放在3(或更多位置)中。 1)您的values.yaml,它定义了Helm图表使用的所有值,2)env-shared-values.yaml,它将具有在多个环境之间共享的值,3)service-env-values.yaml,这是用于以下操作的特定值服务的实例。

文件夹结构可能看起来像这样

  • HelmChartRepo
    • 图表
      • values.yaml
      • 模板
        • 此处所有k8s模板
    • EnvValues
      • dev-values.yaml
      • qa-values.yaml
    • 发布
      • dev1-svc1.yaml
      • dev1.svc2.yaml
      • dev2-svc1.yaml
      • dev2-svc2.yaml
      • qa1-svc1.yaml

胶水在此处的Release文件夹中。每个文件都是一个HelmRelease,这是flux用于管理发行版的内容。这是我使用的示例。注意几件事。 1)它正在寻找一个图表更改的github回购。 2)它正在寻找docker存储库,以查找带有包含特定前缀的标签的图像。这是您可以控制不同环境的方式。只要让Jenkins适当标记该构建,flux就会部署新版本。

---
apiVersion: flux.weave.works/v1beta1
kind: HelmRelease
metadata:
  name: dev1-svc1
  namespace: dev1
  annotations:
    flux.weave.works/automated: "true"
    flux.weave.works/tag.chart-image: glob:dev1-*
spec:
  releaseName: dev1-svc1
  chart:
    git: git@github.com:[your-user]/[your-chart-repo]
    path: [path in git to your chart]
    ref: master
  values: (release specific values here)

    image:
      repository: [mydockerhubrepo/myimagename]
      tag: dev1-versiontags
  valuesFrom:
  - chartFileRef:
      path: EnvValues/dev-values.yaml
      optional: false