GitLab教程(7): GitLab Runner安装与配置

GitLab Runner是执行CI/CD作业的代理程序。本文将详细介绍Runner的安装、注册和配置方法。

什么是GitLab Runner

# Runner类型

1. Shared Runner (共享Runner)
   - 所有项目都可使用
   - 由GitLab管理员配置
   - gitlab.com提供免费共享Runner

2. Group Runner (组Runner)
   - 特定组内的项目可用
   - 组管理员配置

3. Project Runner (项目Runner)
   - 仅特定项目可用
   - 项目维护者配置

# Runner执行器 (Executor)
- shell: 直接在Runner所在机器执行
- docker: 在Docker容器中执行
- docker+machine: 自动扩缩容的Docker
- kubernetes: 在K8s集群中执行
- virtualbox: 在虚拟机中执行
- ssh: 通过SSH在远程机器执行

安装Runner

Linux安装

# Ubuntu/Debian
# 添加仓库
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

# 验证安装
gitlab-runner --version

# 输出
Version:      16.8.0
Git revision: c72a09ce
Git branch:   16-8-stable
GO version:   go1.21.5
Built:        2024-01-18T20:45:24+0000
OS/Arch:      linux/amd64

Docker安装

# 拉取镜像
docker pull gitlab/gitlab-runner:latest

# 运行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

# 验证
docker exec -it gitlab-runner gitlab-runner --version

Docker Compose安装

# docker-compose.yml
version: '3.8'

services:
  gitlab-runner:
    image: gitlab/gitlab-runner:latest
    container_name: gitlab-runner
    restart: always
    volumes:
      - ./config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock

# 启动
docker-compose up -d

注册Runner

获取注册Token

# 项目Runner Token
# Project > Settings > CI/CD > Runners > Expand
# 复制注册Token: glrt-xxxxxxxxxxxxxxxxxxxx

# 组Runner Token
# Group > Settings > CI/CD > Runners

# 共享Runner Token (管理员)
# Admin Area > CI/CD > Runners

交互式注册

# 使用新版Token注册
sudo gitlab-runner register

# 交互过程
Runtime platform                                    arch=amd64 os=linux pid=12345
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.example.com/

Enter the registration token:
glrt-xxxxxxxxxxxxxxxxxxxx

Enter a description for the runner:
[hostname]: my-docker-runner

Enter tags for the runner (comma-separated):
docker,linux,build

Enter optional maintenance note for the runner:
General purpose build runner

Enter an executor: docker, shell, ssh, virtualbox, docker+machine, kubernetes:
docker

Enter the default Docker image (for example, ruby:2.7):
node:18-alpine

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

# 启动Runner
sudo gitlab-runner start

非交互式注册

# 一行命令注册 (Docker executor)
sudo gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.example.com/" \
  --token "glrt-xxxxxxxxxxxxxxxxxxxx" \
  --executor "docker" \
  --docker-image "alpine:latest" \
  --description "Docker Runner" \
  --tag-list "docker,linux" \
  --run-untagged="true" \
  --locked="false"

# Shell executor
sudo gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.example.com/" \
  --token "glrt-xxxxxxxxxxxxxxxxxxxx" \
  --executor "shell" \
  --description "Shell Runner" \
  --tag-list "shell,linux"

# Docker容器中注册
docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --url "https://gitlab.example.com/" \
  --token "glrt-xxxxxxxxxxxxxxxxxxxx" \
  --executor "docker" \
  --docker-image "alpine:latest" \
  --description "Docker Runner"

配置文件详解

# 配置文件位置: /etc/gitlab-runner/config.toml

concurrent = 4                    # 最大并发Job数
check_interval = 0                # 检查新Job的间隔
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "Docker Runner"
  url = "https://gitlab.example.com/"
  id = 12345
  token = "runner-token-here"
  token_obtained_at = 2024-01-01T00:00:00Z
  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 = "node:18-alpine"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
    shm_size = 0
    network_mtu = 0
    pull_policy = ["if-not-present"]

# 添加多个Runner
[[runners]]
  name = "Shell Runner"
  url = "https://gitlab.example.com/"
  token = "another-token"
  executor = "shell"

Docker Executor配置

# 完整的Docker配置示例

[[runners]]
  name = "Docker Runner"
  url = "https://gitlab.example.com/"
  token = "token"
  executor = "docker"
  
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    
    # Docker-in-Docker (用于构建镜像)
    privileged = true
    
    # 挂载卷
    volumes = [
      "/cache",
      "/var/run/docker.sock:/var/run/docker.sock",
      "/builds:/builds"
    ]
    
    # 拉取策略
    pull_policy = ["if-not-present", "always"]
    
    # 资源限制
    memory = "2g"
    cpus = "2"
    
    # 网络
    network_mode = "bridge"
    
    # 额外hosts
    extra_hosts = ["registry.local:192.168.1.100"]
    
    # DNS
    dns = ["8.8.8.8", "8.8.4.4"]
    
    # 允许的镜像
    allowed_images = ["node:*", "python:*", "golang:*"]
    
    # 禁用缓存
    disable_cache = false
    
    # 清理策略
    helper_image = ""
    wait_for_services_timeout = 30

Runner管理命令

# 服务管理
sudo gitlab-runner status
sudo gitlab-runner start
sudo gitlab-runner stop
sudo gitlab-runner restart

# 状态输出
Runtime platform                                    arch=amd64 os=linux pid=12345
gitlab-runner: Service is running

# 列出注册的Runner
sudo gitlab-runner list

# 输出
Listing configured runners                          ConfigFile=/etc/gitlab-runner/config.toml
Docker Runner                                       Executor=docker Token=glrt-xxx URL=https://gitlab.example.com/
Shell Runner                                        Executor=shell Token=glrt-yyy URL=https://gitlab.example.com/

# 验证Runner
sudo gitlab-runner verify

# 输出
Verifying runner... is valid                        runner=xxxx
Verifying runner... is valid                        runner=yyyy

# 删除Runner
sudo gitlab-runner unregister --name "Docker Runner"
# 或
sudo gitlab-runner unregister --all-runners

# 手动运行单个Job (调试用)
sudo gitlab-runner run-single \
  --url "https://gitlab.example.com/" \
  --token "runner-token" \
  --executor "shell"

Runner标签和限制

# 使用标签指定Runner
# .gitlab-ci.yml

build-docker:
  tags:
    - docker
    - linux
  script:
    - docker build -t myapp .

build-windows:
  tags:
    - windows
    - shell
  script:
    - build.bat

build-gpu:
  tags:
    - gpu
    - cuda
  script:
    - python train.py

# Web界面配置Runner标签
# Project > Settings > CI/CD > Runners
# 点击Runner旁边的编辑图标

# 配置选项:
# - Run untagged jobs: 是否运行无标签Job
# - Lock to current projects: 锁定到当前项目
# - Maximum job timeout: 最大超时时间

缓存配置

# 本地缓存
[[runners]]
  [runners.cache]
    Type = "local"
    Path = "/cache"

# S3缓存
[[runners]]
  [runners.cache]
    Type = "s3"
    Shared = true
    [runners.cache.s3]
      ServerAddress = "s3.amazonaws.com"
      AccessKey = "your-access-key"
      SecretKey = "your-secret-key"
      BucketName = "gitlab-runner-cache"
      BucketLocation = "us-east-1"

# GCS缓存
[[runners]]
  [runners.cache]
    Type = "gcs"
    [runners.cache.gcs]
      BucketName = "gitlab-runner-cache"
      CredentialsFile = "/path/to/credentials.json"

# MinIO缓存 (自托管S3兼容)
[[runners]]
  [runners.cache]
    Type = "s3"
    [runners.cache.s3]
      ServerAddress = "minio.example.com:9000"
      AccessKey = "minio-access-key"
      SecretKey = "minio-secret-key"
      BucketName = "runner-cache"
      Insecure = true

监控Runner

# 查看Runner日志
sudo journalctl -u gitlab-runner -f

# Docker Runner日志
docker logs -f gitlab-runner

# Prometheus指标
# 配置 /etc/gitlab-runner/config.toml
listen_address = ":9252"

# 访问指标
curl http://localhost:9252/metrics

# 输出示例
# HELP gitlab_runner_jobs Number of jobs
# TYPE gitlab_runner_jobs counter
gitlab_runner_jobs{state="success"} 150
gitlab_runner_jobs{state="failed"} 10

# HELP gitlab_runner_concurrent Number of concurrent jobs
gitlab_runner_concurrent 4

# 在GitLab查看Runner状态
# Project > Settings > CI/CD > Runners
# 绿色 = 在线
# 灰色 = 离线

常见问题

# 问题1: Runner离线
# 检查服务状态
sudo gitlab-runner status
sudo systemctl status gitlab-runner

# 重启服务
sudo gitlab-runner restart

# 问题2: Docker权限问题
# 将用户添加到docker组
sudo usermod -aG docker gitlab-runner
sudo gitlab-runner restart

# 问题3: 证书问题
# 添加CA证书
sudo gitlab-runner register \
  --tls-ca-file=/path/to/ca.crt ...

# 或跳过验证 (不推荐)
[runners.docker]
  tls_verify = false

# 问题4: Job卡住
# 检查并发数
concurrent = 4  # 增加并发

# 检查Job超时
# Project > Settings > CI/CD > General pipelines > Timeout

总结

本文介绍了GitLab Runner的安装、注册和配置方法,包括不同执行器的使用场景和配置选项。正确配置Runner是保证CI/CD顺利运行的关键。

下一篇我们将学习GitLab CI/CD的高级特性。

发表回复

后才能评论