使用 GitHub/Jenkins/Kubernetes 实施 CI/CD 管道时的最佳实践
Best practices when implementing CI/CD pipeline using GitHub/Jenkins/Kubernetes
这个问题更多的是与建议相关,所以我希望它没有被标记为任何东西。真的需要帮助:(
尝试使用 GitHub/Jenkins/Kubernetes 实现 CI/CD。
在高层次上,这是应该发生的事情:
- 基于詹金斯
- 推送到容器注册表
- 在 Kubernetes 开发集群上部署构建的镜像
- 在开发集群上完成测试后,将其部署到客户端
测试集群,最后是生产集群
到目前为止,这就是我在 Jenkins 上创建的作业,它将使用 Github 挂钩触发。
该工作负责以下事情:
- 从 GitHub
结帐
- 运行 单元测试/调用 REST API 并发送单元测试结果
- 使用 Maven 构建工件/调用 REST API 并在构建时通知
成功或失败
- 构建docker图像
- 将 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
查看 spinnaker 以实现持续交付。构建镜像并将其推送到注册表后,让 spinnaker 中的 Web 挂钩触发部署到所需的 kubernetes 集群。 Spinnaker 与 kubernetes 配合良好,您绝对应该尝试一下
这个问题更多的是与建议相关,所以我希望它没有被标记为任何东西。真的需要帮助:(
尝试使用 GitHub/Jenkins/Kubernetes 实现 CI/CD。
在高层次上,这是应该发生的事情:
- 基于詹金斯
- 推送到容器注册表
- 在 Kubernetes 开发集群上部署构建的镜像
- 在开发集群上完成测试后,将其部署到客户端 测试集群,最后是生产集群
到目前为止,这就是我在 Jenkins 上创建的作业,它将使用 Github 挂钩触发。 该工作负责以下事情:
- 从 GitHub 结帐
- 运行 单元测试/调用 REST API 并发送单元测试结果
- 使用 Maven 构建工件/调用 REST API 并在构建时通知 成功或失败
- 构建docker图像
- 将 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
查看 spinnaker 以实现持续交付。构建镜像并将其推送到注册表后,让 spinnaker 中的 Web 挂钩触发部署到所需的 kubernetes 集群。 Spinnaker 与 kubernetes 配合良好,您绝对应该尝试一下