从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
argoCD是CD(持续部署)服务器,操作可以在UI界面实现,但是其不具备CI(持续集成)功能,比如我想把代码构成新镜像,这个在argoCD里是没法实现的。
Jenkins既是CI服务器又是CD服务器,但是其作为CD服务器在部署应用时需要写代码来实现,远不如argoCD来的更便捷。
所以我们完全可以整合ArgoCD + Jenkins来实现完整的CI/CD流程,这样比单一使用 Jenkins 实现CI/CD更高效、更可靠、更符合云原生最佳实践。
实验目标
练习的拓扑图如下
argoCD部署的是p1项目里apps下的内容,所以只有apps里的内容发生变化了,才会触发argoCD。
当修改了apps下的文件(图里的web1.yaml)的时候,提交到gitlab之后,会触发argoCD。即上图的A线路(红色部分)
当修改dockerfile或者index.html之后提交到gitlab,因为apps里的内容没变,不会触发argoCD
我们可以通过配置一个runner,修改了dockerfile或者index.html并提交到gitlab后,同时会触发jenkins(上图1.a),做如下事情:
- jenkins克隆新代码到本地
- 读取dockerfile的内容构建新的镜像
- 推送新镜像到harbor(上图1.b)
- 然后修改本地apps下的web1.yaml的内容,让其使用刚构建的镜像
- 提交本地代码到gitlab(上图1.c)
这样gitlab也会触发argoCD,即上图B线路(绿色)
1.jenkins设置
创建一个项目名字可以随意取,我这里起名叫做devops001
这里选择“构建一个自由风格的软件项目”,点击确定
创建一个触发器,用于当gitlab里的代码发生变化的时候,能够触发jenkins
根据上述信息,我这里的触发地址为 http://192.168.26.10:8080/job/devops001/build?token=123123
构建步骤1-克隆代码
这里为了省事,每次构建之前先把已经克隆下来的项目删除,不想删除的话可以通过如下命令直接更新代码
git pull origin master
构建步骤2-推送镜像
这里步骤的作用是把代码克隆下来之后构建出新镜像,并推送到harbor仓库。
构建步骤3-把清单文件里的镜像变更为新构建的镜像
这里修改本地项目里apps里web1.yaml的镜像为最新的镜像,然后提交到gitlab
最后保存。
2.配置runner
配置runner的作用是,当修改dockerfile或者index.html文件的时候才会触发Runner,执行特定的命令然后触发Jenkins。
runner下载地址
https://packages.gitlab.com/runner/gitlab-runner
本地安装runner
root@vms10:~# ls gitlab-runner* -1
gitlab-runner_18.1.3-1_amd64.deb
gitlab-runner-helper-images_18.1.3-1_all.deb
root@vms10:~#
root@vms10:~# dpkg -i gitlab-runner*
root@vms10:~#
在gitlab里查看相关信息
这里的URL和token等下要用
启动gitlab-runner服务并设置开机自动启动
systemctl enable gitlab-runner
3.编写.gitlab-ci.yml
作用是指明修改了哪些文件然后触发哪个runner,然后runner执行什么命令。
当修改项目根目录下的index.html或者Dockerfile的文件,就能够触发执行的Runner执行命令
curl -X POST "http://192.168.26.10:8080/job/devops001/build?token=123123"
这条curl命令的作用就是去触发Jenkins去构建新镜像。
修改其他文件都不会触发Jenkins。
4.使用argoCD部署应用
基于gitlab里 p1项目下apps文件夹里的文件创建应用。
此时argoCD里还没有任何的application
创建第一个应用
最后点击上面的CREATE,创建应用,之后我们能看到如下的界面。
说明应用已经创建好并同步成功了。
5.验证
查看当前deploy的所用的镜像,这里可以看到使用的是nginx镜像
直接修改web1.yaml的镜像并提交,这个并不会触发jenkins。
此时app里已经使用了我们指定的镜像了,此时jenkins里并没有有任何构建的操作。
因为只要不编辑Dockerfile或者index.html都不会触发构建操作。
下面修改index.html或者Dockerfile,我这里修改index.html文件
此时会触发jenkins
查看当前deploy所用的镜像,已经是最新构建出来的镜像了。
同步一下本地的数据,并查看web1.yaml里所用的镜像
这里可以看到,本地代码也已经更新为最新的镜像了。