直接回答:GitLab CI 的基本单元是一个装好 Docker 的 runner 容器:先把它注册到项目拿到 token,再用 .gitlab-ci.yml 描述构建、打包、推送镜像的步骤,之后每次 push 都会自动跑。
Docker部署gitlab-runner并使用Docker命令构建Docker镜像
努力,奋斗
关注
3 人赞同了该文章
这篇文章更详细的内容请参考官网:Use Docker to build Docker images | GitLab
前面的文章已经介绍了如何以docker的方式运行gitlab,gitlab的CI/CD功能需要通过gitlab-runner来完成,接下来,我们部署gitlab-runner。
需要说明的是,我们的所有服务都进行了容器化,所以,我们的gitlab-runner也是用docker容器来运行的。
总的来说想要在CI/CD中使用Docker命令,你可以通过如下三种方式进行:
**第一种,**通过shell execotor可以不必将你的gitlab-runner以docker的方式运行,同时,需要你将gitlab-runner加入到docker组,这样gitlab-runner就可以执行docker的命令了。
第二种,Docker in Docker的方式需要docker container获取privilege的权限。他的含义是①executor的类型是docker②runner通过docker提供的镜像来执行docker命令。dockers镜像需要拥有所有的docker工具,并且以privilege的模式在镜像的上下文中执行docker命令。
在这种模式下官方推荐需要使用TLS,查看:GitLab.com shared runners.
第三种,可以不用priviledge的方式,就是Docker socket binding的方式。这种方式是通过将宿主机/var/run/docker.sock挂载到容器的/var/run/docker.sock上,这样,gitlab-runner中执行的docker命令最终会在宿主机上的docker daemon中执行。
我们这篇文章也主要是介绍这种方式。
首先,我们通过gitlab-runner的docker镜像运行gitlab-runner:
1 | docker run -itd --restart=always --name gitlab-runner -v $HOME/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest |
在上面的命令中, 我们进行了两处挂载:
-v $HOME/gitlab-runner/config:/etc/gitlab-runner:这个挂载是将gitlab-runner的配置文件挂载到宿主机上,这样我们可以通过修改宿主机上的这个配置文件对gitlab-runner进行配置
-v /var/run/docker.sock:/var/run/docker.sock:这个挂载是将宿主机上的docker socket挂载到了容器内,这样容器内执行的docker命令会被宿主机docker daemon最终执行。
当容器运行后,我们需要将这个runner注册到gitlab的ci/cd上,runner有几种类型,我们这里选择针对单个项目的runner,在gitlab页面选择相关的项目,左侧菜单栏选择settings->CI/CD,进入页面,点击Runners的Expand按钮,进入到如下页面:

左侧的Specific runners下面有俩个重要的信息,一个是URL,就是gitlab的url,另一个是token,我们获取到这两个信息后,通过如下命令进入到要注册的runner的容器内部:
1 | #gitlab-runner是运行的容器的名称 |
在容器内部,我们执行如下命令:
1 | gitlab-runner register |
这个命令会进入一个流程,让你相继输入如下信息:
- URL:gitlab给你的url,从前面那一步获取的
- token:gitlab给你的token,从前面那一步获取的
- executor的类型:这里选择输入docker
- image:一个包含了docker工具命令的镜像,runner会利用这个镜像执行docker命令,这里我填写的是docker:20.10.20
- tags:这个信息很重要,是gitlab pipeline job选择runner的标志。
此外还要填写描述信息等,这些根据情况随意填写就行了。
操作完成后,在你的gitlab项目中就会出现这个runner了:

这个画面还是在前面我们获取url和token的那个页面中的
这个时候,我们需要注意两个配置的地方:
gitlab-runner的config.toml
这个文件已经通过挂载的方式出现在我们宿主机上的挂载目录中,比如我的gitlab-runner的挂载目录就是$HOME/gitlab-runner/config(前面我们运行gitlab-runner的时候指定的)。我们可以在宿主机上的编辑这个目录下的config.toml,然后重启gitlab-runner服务就行,基本上,我们执行gitlab-runner register执行注册之后,还是需要编辑一下这个文件的,目前我的这个文件的结构如下:
1 | concurrent = 1 |
上面需要添加/编辑的内容已经上面用#号标出
gitlab的.gitlab-ci.yml
这个文件的产物就是一个pipeline。pipeline描述了gitlab上某个项目的CI/Cd流程,pipeline会在代码提交、代码合并之后触发运行(当然你也可以手动触发它)。他涵盖的概念也很多,基本结构是:
1、stages,这个字段标志了这个pipeline包含几个阶段。每个stage可以包含多个job,同一个stage的job可以并行执行。
2、job,job的名字可以自定义,每个job里面可以包含多个执行脚本。
下面来看一下我的这个文件的结构:
1 | stages: |
那基本上到这一步,你的一个初步的gitlab的CI/CD就完成了。
这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

