基于 gitlab-ci 和 docker 搭建 CI/CD
概述
- 自动化测试工具对于软件开发来说显得格外重要,特别是针对开发迭代比较频繁的项目来说更有意义。由于目前我们的项目代码都是托管在公司自己搭建的
gitlab上,所以使用gitlab-ci加gitlab-runner的方式来搭建持续集成环境比较方便些。由于目前通过docker方式安装gitlab-runner具有资源隔离性好,对原有服务器的环境污染少等特点,所以推荐用docker来进行安装。 - 虽然网上已经有很多相关的文章来讲述如何完成这一项工作,但是纸上得来终觉浅,在安装过程中还是会遇到各种各样的问题,下面我会一一说明。
原理
- 当我们将最新的代码提交到
gitlab后,gitlab-ci会根据代码分支中配置的.gitlab-ci.yml文件触发对应注册的gitlab-runner来编译、构建、测试,最后将运行的结果反馈回gitlab-ci服务并呈现在gitlab上。
步骤
- 首先第一步自然是安装
gitlab-runner(这里省略了 docker 环境的安装),通过执行docker run -d --name gitlab-runner --restart always -v /var/run/docker.sock:/var/run/docker.sock -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner:latest来安装
gitlab-runner,docker run后面的参数的具体含义自行查资料,大致含义就是以gitlab/gitlab-runner:latest镜像为基础以后台守护进程方式创建名字为gitlab-runner的容器进程并映射两个相应的目录。当上述命令执行成功后,通过docker ps就可以看到相应的gitlab-runner服务了。 - 接下来是注册
gitlab-runner,通过docker exec -it gitlab-runner gitlab-ci-multi-runner register命令执行后进入交互模式,输入相应需要的参数则可以完成注册。这里有个坑就是相应的 ci 地址如果是http的就填写http的地址,刚开始填写文章中的推荐地址填写了https就会报错,然后一直在尝试解决这个错误,陷入了困境。 - 注册成功后会在
/srv/gitlab-runner/config/config.toml或者docker exec -it gitlab-runner gitlab-ci-multi-runner list中看到刚才注册的runner配置。 - 经过上述步骤后,基于
gitlab-runner和docker环境的集成测试环境就搭建好了。
疑问
- 从上述步骤中我们可以看到
gitlab-runner是用docker启动的,而每次我们提交代码后,打开gitlab-runner的界面我们又会看到docker启动了构建编译的过程,给人的感觉就是docker里面又跑了docker程序,而事实上,docker进程中再启动docker是不现实的。原因主要是两点,一个是与LSM(Linux Security Modules)有关,另一个是与docker的存储驱动有关,具体可以参考文章 - 我们看到的假象的原因在于将
linux与docker之间的socket通过-v来进行了映射,相当于在docker镜像中启动docker也就是用的外面linux的socket,也就是并行的关系了,而绝不可能是docker in docker的方式了。