Перейти к содержанию

GitLab Runner

Описание

GitLab Runner - отдельный сервис на системе, который принимает pipeline и выполняет их у себя.


Основы

GitLab Runner использует конфигурауционный файл TOML формата.

Когда runner запущен от root sudo gitlab-runner run , файл лежит по пути:

/etc/gitlab-runner/config.toml
Если runner запущен не от root gitlab-runner run, то файл находится тут:
~/.gitlab-runner/config.toml

В других системах (non Unix) файл находится:

./config.toml


Использование в pipeline

Для использования определенного gitlab runner в каждом pipeline нужно использовать ключевое слово tag и название runner (а точнее его tag)

tags: 
 - shell

А что если не указать tag в piipeline

В таком случае runner будет выбран самостоятельно из shared (общедоступных)


Сигналы

Команда Сигнал Описание
register SIGINT Отменить регистрацию Runner. Если Runner уже успел зарегистрироваться, удалить его регистрацию.
run, run-single SIGINT, SIGTERM Прервать все запущенные сборки и завершнить работу раннера
run, run-single SIGQUIT Перестать принимать новый сборки и завершить работу раннера после завершения всех запущенных сборок
run SIGHUP Принудително перечитать конфигурационный файл

Пример использования сигналов

SIGINT - срочно остановить Runner

gitlab-runner run
...
...
в другом терминале
kill -SIGINT $(PIDOF gitlb-runner)
или 
Ctrl+C

когда нужно

  • случайно запустил runner
  • нужно немедленно его выключить
  • не важно, что происходит с pipeline

SIGTERM - остановка через systemd

sudo systemctl stop gitlab-runner

systemctl делает

kill -SIGTERM <PID Runner>

кто делает

  • systemctl
  • Docker
  • Kubernetes
  • Другие менеджеры процессов.

SIGQUIT - обновление Runner без потери Job

Нужно бновить Runner. Делать stop плохо, сломаются Job

Поэтому:

klill -SIGQUIT $(pidof gitlab-runner)

После этого Runner не берет новые задачи, а запущенные Job продолжают работать и как только они закончатся Runner сам завершит свою работу.


SIGHUP - изменить настройки без перезапуска

ты изменил настройки config.toml и хочешь начать их использовать

kill -SIGHUP $(pidof gitlab-runner)

Runner открывает заново файл, читает новые настройки и продолжает работать, Job не прерываются.

Это быстрее чем остановить Runner и заново запустить.


Управление Runner

Команда Описание
gitlab-runner run запустить сервис от текущего пользователя
sudo gitlab-runner run запустить сервси от root
gitlab-runner run --config (-c) "/home/test/config.toml" запустить сервис с использованием другого config.toml (не по умолчанию)

Устройство docker in docker

Для использования executor docker есть множество вариантов, один из них docker in docker

Пример pipeline с использованием docker in docker (dind):

build_image:
 image: docker:cli
 services:
  - docker:dind
 variables:
  DOCKER_HOST: tcp://docker:2375
  DOCKER_TLS_CERTDIR: ""
 stage: build
 script:
  - docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
  - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
  - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
 tags:
  - docker_test
архитектура docker in docker
архитектура docker in docker

Как это работает:

1) на Runner (с тегом docker_test) поднимается контейнер с образом docker:cli и сервис контейнер с образом docker:dind (этот образ в себе содержит как cli так и docker engine)

2) Gitlab автоматически создает сеть между cli и dind (job и service) и дает сервису DNS-имя (docker)

3) это имя (docker) используется в переменной DOCKER_HOST = tcp://docker:2375

4) когда docker cli выполняет команду docker build, на самом деле cli делает:

  • читает команду
  • архивирует контекст
  • отправляет его по сети на tcp://docker:2375

5) docker daemon получает запрос и контекст и выполняет требуемые команды у себя.


Ошибки на executor shell

Ошибка: Job failed: prepare environment: exit status 1

то это ошибка shell скрипта, и нужно закоментировать все что есть в файле sudo nano /home/gitlab-runner/.bash_logout

# if [ "$SHLVL" = 1 ]; then

#     [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q

# fi

затем перезапустить runner:

gitlab-runner restart

Ошибка: permission denied while trying to connect to the docker API at unix:///var/run/docker.sock

это означает что пользователь gitlab-runner не может использовать сокет docker

Нужно включить пользователя gitlab-runner в группу Docker

sudo usermod -aG docker gitlab-runner

Ошибка: ERROR: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?

Также выше может быть следующая запись

2026-09-15T12:37:58.719775773Z AppArmor detection and --privileged mode might break.
Это означает что runner не имеет требуемый уровень privilege.

предупреждение

mkНо DinD обычно требует privileged у Docker executor GitLab Runner.

Нужно посмотреть конфигурационный файл и изменить False на True.

sudo nano /etc/gitlab-runner/config.toml
[[runners]]
  executor = "docker"

  [runners.docker]
    privileged = false -> true

перезапускаем gitlab-runner

sudo systemctl restart gitlab-runner

проверяем:

sudo gitlab-runner verify