image
在我们之前的例子中,我们都是在执行器为 shell
的 runner
中运行的,但这不能满足我们的场景。例如我们在 ci
中需要构建镜像,然后推送到镜像仓库里面。这时候我们就要使用 docker
的执行器来工作了
我们先来注册一个 docker
执行器的 runner
# 进入到 runner 容器里面 [root@dce88 ~]# docker exec -it gitlab-runner /bin/bash # 注册 runner,executor,使用 docker # 通过 docker-image 指定一个 docker 镜像。这里使用的是 docker:latest 的镜像 # 通过 docker-volumns 挂载本地目录,挂载 docker.sock 是为了 docker:latest 镜像操控 runner 服务器的 docker 服务,要不然执行 docker 命令的时候会报错 root@c5249d1c22f7:/# gitlab-runner register -n \ > --url http://10.6.215.70/ \ > --registration-token DK3Gg2qgFr4pfntj7UxZ \ > --tag-list "docker" \ > --executor docker \ > --docker-image docker:latest \ > --docker-volumes /var/run/docker.sock:/var/run/docker.sock \ > --description "build docker images" Runtime platform arch=amd64 os=linux pid=19036 revision=6d07dd15 version=15.2.2 Running in system-mode. Registering runner... succeeded runner=DK3Gg2qg Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
注册完成之后查看 gitlab
上是否显示成功
- 默认在注册 runner 的时候需要填写一个基础的镜像,只要使用执行器为 docker 类型的 runner,后面 job 里所有的操作运行都会在容器中运行。运行完 job 之后就会删除 docker 镜像
- 如果全局指定了 images 则所有作业使用此 image 创建容器并在容器中运行 job。如果全局未指定 image,在查看 job 中是否有指定,如果 job 中有指定。则此 job 创建容器并在容器中运行 job。如果没有指定 image,则使用注册 runner 时指定的默认镜像
不指定 image
例如我们在注册时指定了一个镜像 docker,我们先不指定 image 来查看,在 .gitlab-ci.yml 里写入下面代码
stages: - build - test build: stage: build tags: - docker script: - echo "我是 build 的 job" - sleep 10 - docker # 执行 docker 命令 test: stage: test tags: - docker script: - echo "test 的 job" - docker -v # 查看 docker 版本
当流水线运行开始之后,我们在部署了 gitlab-runner
的机器上看下,新创建了一个 docker
镜像,名称为:runner-zdds-4ak-project-5-concurrent-0-fda7b19046212061-build-2,如下。我们的所有 job 都是在这个容器中运行的
[root@dce88 run]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS NAMES 5d026d5f96ae 66743f183cc1 "docker-entrypoint.s…" Less than a second ago Up Less than a second runner-zdds-4ak-project-5-concurrent-0-fda7b19046212061-build-2 c5249d1c22f7 gitlab/gitlab-runner:v15.2.2 "/usr/bin/dumb-init …" 2 days ago Up 2 days gitlab-runner
注意:job 运行完成之后就把容器删除了
接下来去看下 build job 的日志
指定全局的 image
上面我们没有使用 image,就使用的是我们注册 runner 时的镜像,接下来我们指定一个全局的 image
注意:job 的 image 会覆盖掉全局的 image,job 里的优先级高
default: # 定义默认的 tags: - docker before_script: - echo "before_script" # 定义了一个全局的 image,如果写在 default 下,就是每个 job 都加上了,就不是全局的了 image: release-ci.daocloud.io/common-ci/common-ci-builder:v0.1.21 stages: - build - test build: stage: build script: - echo "我是 build 的 job" - sleep 10 - docker test: stage: test script: - echo "test 的 job" - docker -v
在来查看 build 的日志
在来查看 test 的日志
指定 job 的 image
上面说了,job 的 image 优先级高于全局的 image,如果没有全局的 image,则有 image 的 job 使用自己的 image。没有 image 的 job,则使用创建 runner 时指定的镜像。例如下面的例子
default: # 定义默认的 tags: - docker before_script: - echo "before_script" stages: - build - test build: stage: build image: release-ci.daocloud.io/common-ci/common-ci-builder:v0.1.21 # 这个 job 使用自己的 image script: - echo "我是 build 的 job" - sleep 10 - docker test: stage: test script: - echo "test 的 job" - docker -v
查看 build 的日志
看 test 的 job
设置 runner 里 image 的拉取策略
从上面可以看到,每次都会拉取镜像
修改 runner 的 config.toml,文件,加上拉取策略
修改完后在次运行流水线,观察效果