使用 GitHub/Jenkins/Kubernetes 实施 CI/CD 管道时的最佳实践

Best practices when implementing CI/CD pipeline using GitHub/Jenkins/Kubernetes

这个问题更多的是与建议相关,所以我希望它没有被标记为任何东西。真的需要帮助:(

尝试使用 GitHub/Jenkins/Kubernetes 实现 CI/CD。

在高层次上,这是应该发生的事情:

  1. 基于詹金斯
  2. 推送到容器注册表
  3. 在 Kubernetes 开发集群上部署构建的镜像
  4. 在开发集群上完成测试后,将其部署到客户端 测试集群,最后是生产集群

到目前为止,这就是我在 Jenkins 上创建的作业,它将使用 Github 挂钩触发。 该工作负责以下事情:

  1. 从 GitHub
  2. 结帐
  3. 运行 单元测试/调用 REST API 并发送单元测试结果
  4. 使用 Maven 构建工件/调用 REST API 并在构建时通知 成功或失败
  5. 构建docker图像
  6. 将 docker 映像推送到容器注册表(docker 映像将具有 与 BUILD_NUMBER 环境变量匹配的递增版本)

上述任务或多或少已经完成,我不需要太多帮助(除非有人认为上述步骤不是最佳实践)

我在部署到 Kubernetes 集群的部分确实需要帮助。

对于本地测试,我已经使用 Vagrant boxes 设置了一个本地集群并且它可以工作。为了在开发集群上部署构建的镜像,我正在考虑这样做: 点 Jenkins 构建服务器到 Kubernetes 开发集群 使用 deployment.yml 和 service.yml 进行部署(在我的仓库中可用) 这部分我需要帮助...

这是错误的做法吗?有better/easier的方法吗?

还有集群间迁移的方法吗?例如:开发集群到客户端测试集群和客户端测试集群到生产集群等

在互联网上搜索时,Helm 这个名字出现了很多次,但我不确定它是否适用于我的用例。我会测试一下看看,但我有点时间紧迫,这就是为什么我不能

非常感谢你们提供的任何帮助。

非常感谢

我知道您正在尝试实施 GitOps,我的建议是查看这篇文章,您可以从中开始更多地了解您需要的组件。

https://www.weave.works/blog/managing-helm-releases-the-gitops-way

基本上,您需要为您的自定义服务实施自己的 Helm Chart 并使用 Flux 对其进行管理,我建议每个环境使用不同的存储库,并让 Flux 根据状态管理对每个环境的部署回购上的主分支。

有无数种方法可以做到这一点。暂时把 Helm 拿出来,因为你才刚刚开始。

如果您已经在使用 Github 和 docker ,那么我建议您将 code/changes/config/Dockerfile 推到 Github ,这将自动触发 docker 在 Dockerhub 上构建(如果你不想使用 dockerhub 进行构建,在你的情况下可能是 jenkins ),它可以是一个 multi-stage docker 构建,你可以在其中构建代码,运行 测试,扔掉开发环境,最后生成一个生产 docker 图像,一旦图像被生成,它将触发一个网络挂钩到你的 kubernetes 部署 job/manifests 部署到测试 evironmenet,随后是手动 triiger 以部署到生产环境。

可以根据 Github/Git 中提交的 SHA 标记 docker 图像,以便您可以根据提交进行部署和回滚。

参考:https://cloud.google.com/kubernetes-engine/docs/tutorials/gitops-cloud-build

这是我的 Gtips 工作流程的 Gitlab 实现:

# Author , IjazAhmad

image: docker:latest

stages:
  - build
  - test
  - deploy

services:
  - docker:dind

variables:
  CI_REGISTRY: dockerhub.example.com
  CI_REGISTRY_IMAGE: $CI_REGISTRY/$CI_PROJECT_PATH
  DOCKER_DRIVER: overlay2

before_script:
  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $CI_REGISTRY  

docker-build:
  stage: build
  script:
     - docker pull $CI_REGISTRY_IMAGE:latest || true
     - docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .

docker-push:
  stage: build
  script:
     - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
     - docker push $CI_REGISTRY_IMAGE:latest

unit-tests:
  stage: test
  script:
    - echo "running unit testson the image"
    - echo "running security testing on the image"
    - echo "pushing the results to build/test pipeline dashboard"


sast:
  stage: test
  script:
    - echo "running security testing on the image"
    - echo "pushing the results to build/test pipeline dashboard"


dast:
  stage: test
  script:
    - echo "running security testing on the image"
    - echo "pushing the results to build/test pipeline dashboard"


testing:
  stage: deploy
  script:
     - sed -i "s|CI_IMAGE|$CI_REGISTRY_IMAGE|g" k8s-configs/deployment.yaml
     - sed -i "s|TAG|$CI_COMMIT_SHA|g" k8s-configs/deployment.yaml
     - kubectl apply --namespace webproduction-test -f k8s-configs/
  environment:
    name: testing
    url: https://testing.example.com

  only:
    - branches


staging:
  stage: deploy
  script:
     - sed -i "s|CI_IMAGE|$CI_REGISTRY_IMAGE|g" k8s-configs/deployment.yaml
     - sed -i "s|TAG|$CI_COMMIT_SHA|g" k8s-configs/deployment.yaml
     - kubectl apply --namespace webproduction-stage -f k8s-configs/
  environment:
    name: staging
    url: https://staging.example.com
  only:
    - master



production:
  stage: deploy
  script:
     - sed -i "s|CI_IMAGE|$CI_REGISTRY_IMAGE|g" k8s-configs/deployment.yaml
     - sed -i "s|TAG|$CI_COMMIT_SHA|g" k8s-configs/deployment.yaml
     - kubectl apply --namespace webproduction-prod -f k8s-configs/    
  environment:
    name: production
    url: https://production.example.com
  when: manual
  only:
    - master

链接:

Trigger Jenkins builds by pushing to Github

Triggering a Jenkins build from a push to Github

Jenkins: Kick off a CI Build with GitHub Push Notifications

查看 spinnaker 以实现持续交付。构建镜像并将其推送到注册表后,让 spinnaker 中的 Web 挂钩触发部署到所需的 kubernetes 集群。 Spinnaker 与 kubernetes 配合良好,您绝对应该尝试一下