Install Gitlab Runner
本文记录 GitLab Runner 常见的三种执行模式对比,以及使用 Docker 安装并注册到 GitLab 的最小步骤。
GitLab Runner 的三种执行模式
在开始安装前,先明确 CI Job 实际运行时采用哪种模式。常见有三种:
| 模式 | 核心做法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
docker executor + host docker (via docker.sock) | Runner 使用 docker executor,Job 通过挂载 /var/run/docker.sock 调用宿主机 Docker | 单机部署、需要复用宿主机镜像缓存和网络环境 | 配置简单,构建速度快,缓存复用好 | Job 实际可控制宿主机 Docker,隔离性最弱 |
docker executor + docker-in-docker (dind) | Runner 使用 docker executor,Job 连接独立的 docker:dind 服务 | 需要 Docker 能力,但希望与宿主机 Docker 隔离 | 与宿主机隔离更好,环境更独立 | 配置更复杂,缓存和网络调优成本更高 |
shell executor | Runner 使用 shell executor,直接在宿主机 Shell 中执行脚本 | 自建机、物理机、需要直接操作宿主机工具链 | 性能直接,环境最少一层封装 | 环境污染风险高,依赖宿主机一致性和清理机制 |
前置条件
开始前请确认以下公共条件已经满足:
- GitLab 服务地址可从 Runner 所在机器访问
- 已提前获取
RUNNER_REGISTRATION_TOKEN - 已根据目标模式确认使用
dockerexecutor 还是shellexecutor - 文中的 URL、Token、路径均为示例,请替换为自己的值
RUNNER_REGISTRATION_TOKEN 可在 GitLab 的 Runner 管理页面获取:
- 实例级 Runner:
Admin > CI/CD > Runners - 组级或项目级 Runner:进入对应 Group / Project 的
Settings > CI/CD > Runners
docker executor + host docker (via docker.sock)
挂载
/var/run/docker.sock后,CI Job 可直接控制宿主机 Docker,请仅在可信环境中使用
启动 GitLab Runner
docker run -d --name gitlab-runner-01 --restart always \
-v /data01/runner/gitlab-runner-01/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /bin/docker:/bin/docker \
-v /data01/runner/gitlab-runner-01/m2:/root/.m2 \
-v /data01/runner/gitlab-runner-01/m2/bin/mvn:/bin/mvn \
gitlab/gitlab-runner:v13.6.0
/data01/runner/gitlab-runner-01/config:GitLab Runner 配置目录,必须挂载到容器的/etc/gitlab-runner,否则注册后 Runner 无法保存配置,重启后会丢失注册状态。/var/run/docker.sock和/bin/docker:让 Runner 容器内的 Job 能直接调用宿主机 Docker,执行构建、推送等操作。/data01/runner/gitlab-runner-01/m2:Maven 本地缓存目录,挂载到容器内的/root/.m2,让 Job 内部执行 Maven 构建时能复用缓存,加速构建过程。/data01/runner/gitlab-runner-01/m2/bin/mvn:如果宿主机上的 Maven 可执行文件不在 PATH 中,或者需要特定版本,也可以直接挂载到容器内的/bin/mvn,让 Job 内部直接调用。
注册 GitLab Runner 到 GitLab 实例
docker exec -it gitlab-runner-01 gitlab-runner register \
--non-interactive \
--url "http://gitlab.example.com:8081/" \
--registration-token "<RUNNER_REGISTRATION_TOKEN>" \
--executor "docker" \
--docker-image alpine:latest \
--description "group-prod-runner-01" \
--tag-list "group,prod,runner-01,docker,maven" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /data01/runner/gitlab-runner-01/m2:/root/.m2 \
--docker-volumes /data01/runner/gitlab-runner-01/m2/bin/mvn:/bin/mvn
url参数指定 GitLab 实例地址,确保 Runner 所在机器能访问该地址。registration-token参数使用之前获取的注册 token。executor参数指定使用dockerexecutor。docker-image参数指定 Job 内部默认使用的基础镜像,这里以alpine:latest为例,实际可根据需要选择。description和tag-list参数用于标识 Runner,建议包含组织、环境和节点信息,便于在 GitLab 页面识别和调度。docker-volumes参数重复挂载了之前启动 Runner 时指定的卷,确保 Job 内部能访问 Docker 和 Maven 缓存。
注销 GitLab Runner
docker exec -it gitlab-runner-01 gitlab-runner unregister \
--non-interactive \
--url "http://gitlab.example.com:8081/" \
--token "<RUNNER_TOKEN>"
token参数使用的是注册完成后生成的RUNNER_TOKEN,不是RUNNER_REGISTRATION_TOKEN。RUNNER_TOKEN会在 Runner 注册成功后自动生成,可从 Runner 所在机器的config.toml中查看。- 注销完成后,如不再使用该 Runner,可继续停止并删除对应容器。
验证 GitLab Runner
docker ps | grep gitlab-runner-01
docker exec -it gitlab-runner-01 gitlab-runner verify
docker exec -it gitlab-runner-01 gitlab-runner list
如果 Runner 已在 GitLab 页面显示为在线,并且能成功执行一个最小 CI Job,则说明安装完成。
docker executor + docker-in-docker (dind)
启动 GitLab Runner
docker run -d --name gitlab-runner-01 --restart always \
--link gitlab-runner-01:docker \
-v /data01/runner/gitlab-runner-01/config:/etc/gitlab-runner \
gitlab/gitlab-runner:v13.6.0
/data01/runner/gitlab-runner-01/config:GitLab Runner 配置目录,必须挂载到容器的/etc/gitlab-runner,否则注册后 Runner 无法保存配置,重启后会丢失注册状态。--link gitlab-runner-01:docker:让 Runner 容器内可以通过主机名docker访问 DinD 服务容器,后续 Job 中可直接使用tcp://docker:2375。- 如果不希望使用
--link,也可以改为自定义 Docker Network,让 Runner 容器通过服务名访问 DinD 容器。
注册 GitLab Runner 到 GitLab 实例
docker exec -it gitlab-runner-01 gitlab-runner register \
--non-interactive \
--url "http://gitlab.example.com:8081/" \
--registration-token "<RUNNER_REGISTRATION_TOKEN>" \
--executor "docker" \
--docker-image docker:20.10 \
--description "group-prod-runner-01-dind" \
--tag-list "group,prod,runner-01,docker,dind" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected" \
--docker-privileged="true" \
--docker-volumes /cache
url参数指定 GitLab 实例地址,确保 Runner 所在机器能访问该地址。registration-token参数使用之前获取的注册 token。executor参数指定使用dockerexecutor。docker-image参数指定 Job 内部默认使用的基础镜像,这里使用docker:20.10,让 Job 内部具备 Docker CLI。description和tag-list参数用于标识 Runner,建议包含组织、环境和节点信息,便于在 GitLab 页面识别和调度。docker-privileged="true":允许 Job 容器以特权模式运行,否则无法正常访问 DinD 服务。docker-volumes /cache:给 Job 提供默认缓存目录,减少重复拉取和构建的开销。
如果 CI Job 直接连接外部 DinD 容器,通常还需要设置 DOCKER_HOST=tcp://docker:2375,让 Job 内部 Docker CLI 能正确连接到名为 docker 的服务。
注销 GitLab Runner
docker exec -it gitlab-runner-01 gitlab-runner unregister \
--non-interactive \
--url "http://gitlab.example.com:8081/" \
--token "<RUNNER_TOKEN>"
token参数使用的是注册完成后生成的RUNNER_TOKEN,不是RUNNER_REGISTRATION_TOKEN。RUNNER_TOKEN会在 Runner 注册成功后自动生成,可从 Runner 所在机器的config.toml中查看。- 如果同时部署了独立的 DinD 服务容器,确认不再使用后也应一并停止和删除。
验证 GitLab Runner
docker ps | grep gitlab-runner-01
docker exec -it gitlab-runner-01 gitlab-runner verify
docker exec -it gitlab-runner-01 gitlab-runner list
如果 Runner 已在 GitLab 页面显示为在线,并且能成功执行一个最小 CI Job,则说明安装完成。
shell executor
不建议在同一宿主机上启动多个
shell executor。这种模式下多个 Runner 共享同一套宿主机环境,容易发生工具链、缓存、临时文件和端口冲突,排查成本也更高。
启动 GitLab Runner
这种模式下,gitlab-runner 直接安装在宿主机上,CI Job 也直接在宿主机 Shell 中执行,因此宿主机本身就是运行环境。
gitlab-runner start
gitlab-runner start:启动本机已经安装的 Runner 服务。- 如果宿主机使用
systemd管理服务,也可以使用systemctl start gitlab-runner。 - 这种模式不需要额外挂载 Docker Socket、缓存目录或辅助服务容器,但要求宿主机已提前安装好 CI 所需工具链。
注册 GitLab Runner 到 GitLab 实例
gitlab-runner register \
--non-interactive \
--url "http://gitlab.example.com:8081/" \
--registration-token "<RUNNER_REGISTRATION_TOKEN>" \
--executor "shell" \
--description "group-prod-runner-01-shell" \
--tag-list "group,prod,runner-01,shell" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
url参数指定 GitLab 实例地址,确保宿主机能访问该地址。registration-token参数使用之前获取的注册 token。executor参数指定使用shellexecutor。description和tag-list参数用于标识 Runner,建议包含组织、环境和节点信息,便于在 GitLab 页面识别和调度。- 这种模式下,CI Job 会直接使用宿主机上的 Shell、Docker、Maven、Node.js 等工具链,因此需要自行保证宿主机环境一致性。
注销 GitLab Runner
gitlab-runner unregister \
--non-interactive \
--url "http://gitlab.example.com:8081/" \
--token "<RUNNER_TOKEN>"
token参数使用的是注册完成后生成的RUNNER_TOKEN,不是RUNNER_REGISTRATION_TOKEN。RUNNER_TOKEN会在 Runner 注册成功后自动生成,可从 Runner 所在机器的config.toml中查看。- 注销后,如不再使用该 Runner,可继续停止宿主机上的 Runner 服务。
验证 GitLab Runner
gitlab-runner verify
gitlab-runner list
如果 Runner 已在 GitLab 页面显示为在线,并且能成功执行一个最小 CI Job,则说明安装完成。
在项目中指定使用某个 GitLab Runner
如果希望项目中的 Job 只在指定的 GitLab Runner 上执行,最常见的做法是在 .gitlab-ci.yml 中添加与 Runner tag-list 对应的 tags。
例如,上文注册 Runner 时使用了 group,prod,runner-01,docker,maven 这样的标签,那么项目中的 Job 可以这样写:
build:
stage: build
tags:
- group
- prod
- docker
- maven
script:
- mvn clean package
如果希望整个项目默认都使用同一组 Runner,也可以在 .gitlab-ci.yml 顶层统一声明:
default:
tags:
- group
- prod
- docker
build:
stage: build
script:
- mvn clean package
只要 Job 中声明的 tags 能被某个 Runner 的 tag-list 覆盖,GitLab 就会优先把这个 Job 调度到对应的 Runner 上执行。
