Runner基础 #

一、什么是GitLab Runner? #

GitLab Runner是执行GitLab CI/CD作业的应用程序,它从GitLab获取作业并在指定环境中执行。

text
┌─────────────────────────────────────────────────────────────┐
│                    GitLab CI/CD 架构                         │
├─────────────────────────────────────────────────────────────┤
│                                                              │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              GitLab Server                           │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐             │   │
│  │  │ 代码仓库 │  │ CI/CD   │  │  作业   │             │   │
│  │  │         │  │ 配置    │  │  队列   │             │   │
│  │  └─────────┘  └─────────┘  └─────────┘             │   │
│  └─────────────────────────────────────────────────────┘   │
│                            │                                │
│                            │ 分配作业                        │
│                            ▼                                │
│  ┌─────────────────────────────────────────────────────┐   │
│  │              GitLab Runner                           │   │
│  │  ┌─────────┐  ┌─────────┐  ┌─────────┐             │   │
│  │  │ Executor│  │ Executor│  │ Executor│             │   │
│  │  │ (Shell) │  │(Docker) │  │  (K8s)  │             │   │
│  │  └─────────┘  └─────────┘  └─────────┘             │   │
│  └─────────────────────────────────────────────────────┘   │
│                                                              │
└─────────────────────────────────────────────────────────────┘

二、Runner类型 #

1. Shared Runner(共享Runner) #

  • 所有项目都可以使用
  • 由GitLab管理员配置
  • 适合公共构建环境

2. Group Runner(组Runner) #

  • 组内所有项目可用
  • 由组管理员配置
  • 适合团队共享环境

3. Specific Runner(特定Runner) #

  • 只为特定项目服务
  • 由项目管理员配置
  • 适合特殊构建需求

Runner类型对比 #

类型 可用范围 管理者 适用场景
Shared 所有项目 系统管理员 公共构建环境
Group 组内项目 组管理员 团队共享环境
Specific 特定项目 项目管理员 特殊构建需求

三、Executor类型 #

1. Shell Executor #

直接在Runner主机上执行命令:

yaml
job_name:
  tags:
    - shell
  script:
    - npm test

优点:

  • 配置简单
  • 性能高
  • 无需容器知识

缺点:

  • 环境隔离差
  • 需要手动管理依赖
  • 安全风险较高

2. Docker Executor #

在Docker容器中执行:

yaml
job_name:
  image: node:18
  tags:
    - docker
  script:
    - npm test

优点:

  • 环境隔离好
  • 可重现构建
  • 易于管理依赖

缺点:

  • 需要Docker知识
  • 性能略有损耗
  • 需要管理镜像

3. Docker Machine Executor #

自动创建Docker虚拟机:

优点:

  • 自动扩缩容
  • 弹性资源
  • 支持多云平台

缺点:

  • 配置复杂
  • 需要云平台支持

4. Kubernetes Executor #

在Kubernetes集群中执行:

yaml
job_name:
  image: node:18
  tags:
    - kubernetes
  script:
    - npm test

优点:

  • 自动扩缩容
  • 资源利用率高
  • 适合大规模部署

缺点:

  • 需要K8s知识
  • 配置复杂

5. VirtualBox/Parallels Executor #

在虚拟机中执行:

优点:

  • 完全隔离
  • 安全性高

缺点:

  • 性能损耗大
  • 管理复杂

Executor对比 #

Executor 隔离性 性能 复杂度 适用场景
Shell 简单构建
Docker 标准构建
Docker Machine 弹性构建
Kubernetes 大规模部署
VirtualBox 安全构建

四、安装Runner #

Linux安装 #

bash
# Debian/Ubuntu
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner

# CentOS/RHEL
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
sudo yum install gitlab-runner

macOS安装 #

bash
# 使用Homebrew
brew install gitlab-runner

# 启动服务
brew services start gitlab-runner

Windows安装 #

powershell
# 下载安装包
# https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-windows-amd64.exe

# 安装服务
.\gitlab-runner-windows-amd64.exe install
.\gitlab-runner-windows-amd64.exe start

Docker安装 #

bash
# 创建配置目录
mkdir -p /srv/gitlab-runner/config

# 启动Runner容器
docker run -d --name gitlab-runner --restart always \
  -v /srv/gitlab-runner/config:/etc/gitlab-runner \
  -v /var/run/docker.sock:/var/run/docker.sock \
  gitlab/gitlab-runner:latest

Kubernetes安装 #

bash
# 添加Helm仓库
helm repo add gitlab https://charts.gitlab.io

# 安装Runner
helm install --namespace gitlab-runner gitlab-runner gitlab/gitlab-runner \
  --set gitlabUrl=https://gitlab.example.com \
  --set runnerRegistrationToken=YOUR_TOKEN

五、注册Runner #

获取注册信息 #

  1. 进入项目Settings → CI/CD → Runners
  2. 展开"Specific runners"部分
  3. 复制注册令牌

交互式注册 #

bash
sudo gitlab-runner register

# 输入GitLab URL
Enter the GitLab instance URL:
https://gitlab.example.com

# 输入注册令牌
Enter the registration token:
YOUR_REGISTRATION_TOKEN

# 输入描述
Enter a description for the runner:
my-runner

# 输入标签
Enter tags for the runner (comma-separated):
docker,linux

# 选择执行器
Enter an executor:
docker

# 输入默认镜像
Enter the default Docker image:
node:18

非交互式注册 #

bash
sudo gitlab-runner register \
  --non-interactive \
  --url https://gitlab.example.com \
  --registration-token YOUR_REGISTRATION_TOKEN \
  --executor docker \
  --docker-image node:18 \
  --description "my-runner" \
  --tag-list "docker,linux" \
  --run-untagged="true"

Docker容器注册 #

bash
docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --url https://gitlab.example.com \
  --registration-token YOUR_REGISTRATION_TOKEN \
  --executor docker \
  --docker-image node:18 \
  --description "docker-runner"

六、Runner命令 #

基本命令 #

bash
# 检查状态
sudo gitlab-runner status

# 启动Runner
sudo gitlab-runner start

# 停止Runner
sudo gitlab-runner stop

# 重启Runner
sudo gitlab-runner restart

# 查看版本
sudo gitlab-runner --version

管理命令 #

bash
# 列出所有Runner
sudo gitlab-runner list

# 验证配置
sudo gitlab-runner verify

# 注销Runner
sudo gitlab-runner unregister --name my-runner

# 注销所有Runner
sudo gitlab-runner unregister --all-runners

调试命令 #

bash
# 检查配置
sudo gitlab-runner check

# 以调试模式运行
sudo gitlab-runner --debug run

七、Runner标签 #

标签作用 #

标签用于将作业分配给特定的Runner:

yaml
job_name:
  tags:
    - docker
    - linux
  script:
    - npm test

配置标签 #

bash
sudo gitlab-runner register \
  --tag-list "docker,linux,production"

运行无标签作业 #

Runner可以配置为运行没有标签的作业:

bash
sudo gitlab-runner register \
  --run-untagged="true"

八、Runner配置文件 #

配置文件位置 #

  • Linux: /etc/gitlab-runner/config.toml
  • macOS: /usr/local/etc/gitlab-runner/config.toml
  • Windows: C:\ProgramData\gitlab-runner\config.toml

基本配置 #

toml
concurrent = 4

[[runners]]
  name = "my-runner"
  url = "https://gitlab.example.com"
  token = "YOUR_TOKEN"
  executor = "docker"
  [runners.docker]
    image = "node:18"
    privileged = false
    disable_cache = false
    volumes = ["/cache"]

Docker Executor配置 #

toml
[[runners]]
  name = "docker-runner"
  executor = "docker"
  [runners.docker]
    image = "node:18"
    privileged = true
    disable_cache = false
    volumes = [
      "/var/run/docker.sock:/var/run/docker.sock",
      "/cache:/cache"
    ]
    pull_policy = ["if-not-present"]
    allowed_images = ["node:*", "python:*"]

Kubernetes Executor配置 #

toml
[[runners]]
  name = "kubernetes-runner"
  executor = "kubernetes"
  [runners.kubernetes]
    namespace = "gitlab-runner"
    image = "node:18"
    privileged = true

九、最佳实践 #

1. 选择合适的Executor #

text
简单构建 → Shell Executor
标准构建 → Docker Executor
大规模部署 → Kubernetes Executor

2. 使用标签管理 #

yaml
# 生产环境Runner
tags:
  - production
  - docker

# 测试环境Runner
tags:
  - staging
  - docker

3. 配置并发限制 #

toml
concurrent = 4

[[runners]]
  limit = 2

4. 使用缓存 #

toml
[[runners]]
  [runners.docker]
    disable_cache = false
    volumes = ["/cache:/cache"]

5. 安全配置 #

toml
[[runners]]
  [runners.docker]
    allowed_images = ["node:*", "python:*"]
    allowed_services = ["postgres:*", "redis:*"]
    pull_policy = ["always"]

十、常见问题 #

1. Runner无法连接GitLab #

检查:

  • 网络连接
  • URL是否正确
  • 防火墙设置

2. Job一直pending #

检查:

  • Runner是否在线
  • 标签是否匹配
  • 并发限制

3. Docker权限问题 #

toml
[[runners]]
  [runners.docker]
    privileged = true
    volumes = ["/var/run/docker.sock:/var/run/docker.sock"]

下一步 #

现在你已经了解了Runner基础,接下来让我们学习 Runner配置

最后更新:2026-03-28