直接回答:GitLab CI 的基本单元是一个装好 Docker 的 runner 容器:先把它注册到项目拿到 token,再用 .gitlab-ci.yml 描述构建、打包、推送镜像的步骤,之后每次 push 都会自动跑。

Docker部署gitlab-runner并使用Docker命令构建Docker镜像

瓦力

瓦力img

努力,奋斗

关注

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按钮,进入到如下页面:

img

左侧的Specific runners下面有俩个重要的信息,一个是URL,就是gitlab的url,另一个是token,我们获取到这两个信息后,通过如下命令进入到要注册的runner的容器内部:

1
2
#gitlab-runner是运行的容器的名称
docker exec -it gitlab-runner bash

在容器内部,我们执行如下命令:

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了:

img

这个画面还是在前面我们获取url和token的那个页面中的

这个时候,我们需要注意两个配置的地方:

gitlab-runner的config.toml

这个文件已经通过挂载的方式出现在我们宿主机上的挂载目录中,比如我的gitlab-runner的挂载目录就是$HOME/gitlab-runner/config(前面我们运行gitlab-runner的时候指定的)。我们可以在宿主机上的编辑这个目录下的config.toml,然后重启gitlab-runner服务就行,基本上,我们执行gitlab-runner register执行注册之后,还是需要编辑一下这个文件的,目前我的这个文件的结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "docker run"
url = "http://xxxx.xxxx.xxxx.xxxx:9080/"
clone_url = "http://xxxx.xxxx.xxxx.xxxx:9080/" #添加了这行
id = 10
token = "替换成你自己的 runner token"
token_obtained_at = 2023-01-07T05:41:02Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:20.10.20"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
allowed_pull_policies = ["if-not-present"] #添加了这行
pull_policy = ["if-not-present"] #添加了这行
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"] #编辑了这行
shm_size = 0

上面需要添加/编辑的内容已经上面用#号标出

gitlab的.gitlab-ci.yml

这个文件的产物就是一个pipeline。pipeline描述了gitlab上某个项目的CI/Cd流程,pipeline会在代码提交、代码合并之后触发运行(当然你也可以手动触发它)。他涵盖的概念也很多,基本结构是:

1、stages,这个字段标志了这个pipeline包含几个阶段。每个stage可以包含多个job,同一个stage的job可以并行执行。

2、job,job的名字可以自定义,每个job里面可以包含多个执行脚本。

下面来看一下我的这个文件的结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
stages:
- docker_image
- deploy

build-job: # This job runs in the build stage, which runs first.
stage: docker_image
tags:
- image_builder
- docker_image
script:
- cd Bt.Financing
- docker build -t xxx.xxx.xxx:9050/wallee/financing:latest .
- docker push xxx.xxx.xxx:9050/wallee/financing:latest
- docker rmi xxx.xxx.xxx:9050/wallee/financing:latest

deploy-job: # This job runs in the deploy stage.
stage: deploy # It only runs when *both* jobs in the test stage complete successfully.
tags:
- docker_runner
script:
- docker stop financing
- docker rm financing
- docker rmi xxx.xxx.xxx:9050/wallee/financing:latest
- docker pull xxx.xxx.xxx:9050/wallee/financing:latest
- docker run -d -p 5008:5008 --name financing -v $HOME/Logs/financing:/app/Logs xxx.xxx.xxx:9050/wallee/financing:latest

那基本上到这一步,你的一个初步的gitlab的CI/CD就完成了。

这篇笔记整理自我自己的实践记录,如果做法有出入,或者你踩过别的坑,欢迎到留言板一起聊聊。

站内搜索

没有找到内容!