从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践

argoCD是CD(持续部署)服务器,操作可以在UI界面实现,但是其不具备CI(持续集成)功能,比如我想把代码构成新镜像,这个在argoCD里是没法实现的。

Jenkins既是CI服务器又是CD服务器,但是其作为CD服务器在部署应用时需要写代码来实现,远不如argoCD来的更便捷。

所以我们完全可以整合ArgoCD + Jenkins来实现完整的CI/CD流程,这样比单一使用 Jenkins 实现CI/CD更高效、更可靠、更符合云原生最佳实践。

实验目标

练习的拓扑图如下
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
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),做如下事情:

  1. jenkins克隆新代码到本地
  2. 读取dockerfile的内容构建新的镜像
  3. 推送新镜像到harbor(上图1.b)
  4. 然后修改本地apps下的web1.yaml的内容,让其使用刚构建的镜像
  5. 提交本地代码到gitlab(上图1.c)

这样gitlab也会触发argoCD,即上图B线路(绿色)

1.jenkins设置

创建一个项目名字可以随意取,我这里起名叫做devops001
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里选择“构建一个自由风格的软件项目”,点击确定

创建一个触发器,用于当gitlab里的代码发生变化的时候,能够触发jenkins
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
根据上述信息,我这里的触发地址为 http://192.168.26.10:8080/job/devops001/build?token=123123

构建步骤1-克隆代码

从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里为了省事,每次构建之前先把已经克隆下来的项目删除,不想删除的话可以通过如下命令直接更新代码

git pull origin master

构建步骤2-推送镜像

从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里步骤的作用是把代码克隆下来之后构建出新镜像,并推送到harbor仓库。

构建步骤3-把清单文件里的镜像变更为新构建的镜像

从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里修改本地项目里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里查看相关信息
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里的URL和token等下要用

启动gitlab-runner服务并设置开机自动启动

systemctl enable gitlab-runner

注册runner
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
注册之后回到gitlab里
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践

3.编写.gitlab-ci.yml

作用是指明修改了哪些文件然后触发哪个runner,然后runner执行什么命令。

编写.gitlab-ci.yml内容如下
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里内容的意思是:

当修改项目根目录下的index.html或者Dockerfile的文件,就能够触发执行的Runner执行命令

curl -X POST "http://192.168.26.10:8080/job/devops001/build?token=123123"

这条curl命令的作用就是去触发Jenkins去构建新镜像。

修改其他文件都不会触发Jenkins。

现在项目里的内容如下
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践

4.使用argoCD部署应用

基于gitlab里 p1项目下apps文件夹里的文件创建应用。

此时argoCD里还没有任何的application
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
创建第一个应用
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践

从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
最后点击上面的CREATE,创建应用,之后我们能看到如下的界面。
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践

说明应用已经创建好并同步成功了。

5.验证

查看当前deploy的所用的镜像,这里可以看到使用的是nginx镜像
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
直接修改web1.yaml的镜像并提交,这个并不会触发jenkins。
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
此时app里已经使用了我们指定的镜像了,此时jenkins里并没有有任何构建的操作。
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
因为只要不编辑Dockerfile或者index.html都不会触发构建操作。

下面修改index.html或者Dockerfile,我这里修改index.html文件
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
此时会触发jenkins
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
查看当前deploy所用的镜像,已经是最新构建出来的镜像了。
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
同步一下本地的数据,并查看web1.yaml里所用的镜像
从代码到生产:基于 GitLab、Jenkins 与 ArgoCD 的自动化流水线实践
这里可以看到,本地代码也已经更新为最新的镜像了。

相关新闻

                                                                                                                                    RHCE9学习指南全部更新完成,点击阅读