文章目录
部署项目介绍
项目结构介绍
回顾《6.云原生之DevOps和CICD》中使用的项目,先看项目结构,在Jenkins 实现CICD过程中部署文件deploy.yaml是耦合在业务项目中的。Jenkins CI是通过webhook实现,CD通过流水线文件Jenkinsfile来实现。实际有时候代码修改后我们并不想发布,而是通过手动触发实现,kubesphere中使用Jenkins可创建流水线项目来实现(实际原理就是在Jenkins中创建,只是可视化展示了)。
回顾《19.云原生CICD之ArgoCD入门》部署项目,我们使用到了 《argocd测试项目》中kustomize-guestbook目录下资源清单,这些清单其实是部署的k8s资源清单
改造《6.云原生之DevOps和CICD》中项目,将kustomize资源清单加上,目录结构如下:
上述项目结构其实是存在问题的,业务源码和部署清单还在耦合一个项目中,职能不够清晰,如何处理?
- 需剥离分为两个仓库
剥离带来新的问题,就是业务源码修改发布新版本,开发人员手动打包镜像,通知运维人员更新配置清单中版本,最后发布。如何处理?上述问题其实是解决开发人员和运维人员协作问题,及CI问题
- CI如何处理?通过gitlab的ci来实现
注意:若想测试自行将项目拆分,将kustomize拆分为单独的代码仓库,代码仓库如下:
https://github.com/zhouwei1996/argocd-in-action
https://github.com/zhouwei1996/flask-demo
https://github.com/zhouwei1996/flask-demo-kustomize
GitLab CI/CD
GitLab CI/CD(持续集成/持续交付)是 GitLab 提供的一套集成开发工具,用于自动化构建、测试和部署应用程序。它提供了一个强大的持续集成和持续交付平台,可以帮助开发团队更高效地管理和交付软件。
- 持续集成(Continuous Integration,CI):
持续集成是指将开发人员的代码频繁地集成到共享的主干代码库中。在持续集成中,开发人员会将代码提交到版本控制系统(如 GitLab),然后自动触发构建、测试和代码质量检查等任务。这样可以快速发现和解决代码集成问题,确保团队的代码始终保持可工作状态。GitLab CI 提供了强大的持续集成功能,可以根据您定义的规则和流程自动运行构建和测试作业。 - 持续交付/持续部署(Continuous Delivery/Continuous Deployment,CD):
持续交付和持续部署是在持续集成的基础上进一步推进的概念。它们旨在自动化和简化软件交付过程,以便更频繁地将经过测试和验证的代码部署到生产环境中。持续交付是指在经过测试的代码通过各种环境(如开发、测试、预生产)后,准备好进行部署的过程。持续部署则更进一步,指的是将经过测试的代码自动部署到生产环境,实现快速、可靠的软件交付。GitLab CI/CD 提供了强大的持续交付和持续部署功能,您可以配置自动化的部署流程,并将代码快速部署到目标环境中。
GitLab CI/CD主要特点和功能
- 自动化构建和测试:GitLab CI/CD 允许您在代码提交到 GitLab 仓库时自动运行构建和测试作业。您可以定义多个作业,并在每个作业中编写自定义的构建和测试脚本。
- 并行执行:GitLab CI/CD 支持并行执行作业,从而加快构建和测试的速度。您可以根据需要在不同的作业中并行执行任务,提高整体的开发效率。
- 多阶段流水线:GitLab CI/CD 使用阶段(stages)来组织作业的执行顺序。您可以定义多个阶段,并在每个阶段中运行一系列的作业。这使得您可以按照特定的流程对代码进行构建、测试和部署。
- 集成容器技术:GitLab CI/CD 集成了容器技术,如 Docker,使得构建和测试环境的配置更加灵活和可重复。您可以使用 Docker 容器来创建一致的开发和测试环境,确保代码在不同的环境中具有一致的行为。
- 持续交付和部署:GitLab CI/CD 支持持续交付和部署。您可以配置自动化的部署流程,将经过测试的代码自动部署到生产环境或其他目标环境中,从而实现快速、可靠的软件交付。
- 可视化界面和报告:GitLab CI/CD 提供了直观的用户界面,用于监视和管理构建和部署流水线。您可以查看作业的执行状态、日志输出以及生成的报告,以便更好地了解整个 CI/CD 流程的状态和结果。
- 可扩展性和定制性:GitLab CI/CD 是高度可扩展和可定制的。您可以根据项目的需求配置各种不同的构建、测试和部署策略。它还支持与其他工具和服务的集成,如监控系统、通知系统等。
GitLab CI/CD 的灵活性和功能丰富性使得开发团队能够更好地管理和交付软件,提高开发效率和质量。它是一个强大的工具,适用于各种规模和类型的项目。
手动触发CD过程
- 添加kustomize项目代码仓库
kustomize项目介绍
其中deployment.yaml中使用镜像为CI构建的镜像
- 查看不部署流水线
- 查看部署情况
CICD工作流实战
CI过程:
- 拉取代码
- maven打包
- 构建镜像并推送
CD过程:
- 推送kustomize项目修改代码
- Argo CD创建应用后会轮训检查git仓库,发现有修改会自动同步
kustomize项目结构设计
- 运维清单项目结构设计如下
base下为基本资源一般不动,build下为构建后的资源,overlay下为补丁资源。
kustomize参考:kustomization官网 | github上案例
CD过程gitlab-ci.yaml脚本
- CI过程参考22.云原生之GitLab CICD实战及解析【干货】,这儿小编不在过多介绍。此处主要介绍CD过程。触发argocd cd过程方式:
1、手动触发:argocd创建应用时指定手动触发
2、自动触发:argocd创建应用时指定自动触发,当代码提交后argocd会轮训自动触发
3、自动触发:push 镜像后,基于Argo CD Image Updater自动触发
4、自动触发:提交代码后,在gitlab-ci中通过api触发argocd同步
deploy:
stage: deploy
image: argoproj/argocd-cli:v2.1.3
script:
- argocd login <argocd-server> --username <username> --password <password>
- argocd app create <app-name> --repo <git-repo-url> --path <path-to-app> --dest-server <argocd-server> --dest-namespace <namespace> --revision <git-revision> --sync-policy <sync-policy>
- argocd app sync <app-name>
- 本篇主要讲述提交代码后触发方式,gitlab-ci.yaml脚本如下:
deploy:
stage: deploy
image: cnych/kustomize:v1.0
before_script:
- git remote set-url origin http://root:zhouwei1996@192.168.31.3:83/root/kustomize.git
- git config --global user.email "gitlab@git.k8s.local"
- git config --global user.name "GitLab CI/CD"
script:
# 进入保存构建后的项目目录
- cd /builds/project-target
# 删除kustomize项目,以便后续git拉取
- rm -rf ./kustomize
# 拉取kustomize项目
- git clone http://git账号:git密码@192.168.31.3:83/root/kustomize.git
# 进入dev补丁目录
- cd ./kustomize/kustomize-devops-web/overlay/dev
# 修改镜像
- kustomize edit set image harbor域名/library/devops-web:$CI_COMMIT_BEFORE_SHA
# build生成新的完整部署资源,并输出到build.yaml
- kustomize build > ../../build/build.yaml
# 提交代码
- git add /builds/project-target/kustomize/kustomize-devops-web/
- git commit -am "image update"
- git push -u origin main
git账号密码建议gitlab中定义全局变量,基本中引用
测试CICD过程
- 在CICD测试前需先AcgoCD创建应用
核心配置:配置gitlab中kustomize项目和路径。其他配置参考本章《手动触发CD过程》
- 提交代码,登录gitlab查看流水线
- 主要查看deploy过程日志
验证部署是否使用最新镜像
验证镜像tag是否为上述b1b464712fc4ca335d8dec5b837d711c33f1b606
- 登录gitlab查看build.yaml
- 查看harbor中镜像
- 查看部署情况,及部署资源使用的image