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

时间:2019-07-15 15:39:05

标签: jenkins kubernetes continuous-integration continuous-deployment

该问题与更多建议相关,因此我希望不要提出任何疑问。只是真的需要帮助:(

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

总的来说,这应该发生:

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

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

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

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

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

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

这是错误的做法吗?有没有更好/更容易的方法?

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

在Internet上搜索时,Helm这个名字出现了很多,但是我不确定它是否适用于我的用例。我会对其进行测试,然后看,但是我对时间的需求有点紧张,这就是为什么我不能

希望您能提供任何帮助。

非常感谢

3 个答案:

答案 0 :(得分:2)

有无数种方法可以做到这一点。刚开始时,立即将Helm拿出来。

如果您已经在使用Github和docker,那么我建议您将代码/更改/配置/ Dockerfile推送到Github,这将自动触发Dockerhub上的docker构建(如果您不想的话,可能是jenkins)使用dockerhub进行构建),它可以是一个多阶段的docker构建,您可以在其中构建代码,运行测试,丢弃dev environmenet,最终生成生产docker映像,一旦生成映像,它将触发一个Web钩子到您的kubernetes部署作业/清单将部署到测试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

Pipeline

链接:

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

答案 1 :(得分:1)

我了解您正在尝试实现GitOps,我的建议是阅读本文,从这里您可以开始了解有关所需组件的更多信息。

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

基本上,您需要为自定义服务实现自己的头盔图并使用助焊剂对其进行管理,我建议每个环境使用不同的存储库,并让助焊剂根据主分支的状态来管理对每个环境的部署在仓库中。

答案 2 :(得分:1)

查看大三角帆以连续交付。生成映像并将其推送到注册表后,将大三角帆中的Web钩子触发到所需kubernetes集群的部署。大三角帆与kubernetes配合良好,您绝对应该尝试一下