GitLab Runner
Описание
GitLab Runner - отдельный сервис на системе, который принимает pipeline и выполняет их у себя.
Основы
GitLab Runner использует конфигурауционный файл TOML формата.
Когда runner запущен от root sudo gitlab-runner run , файл лежит по пути:
Если runner запущен не от root gitlab-runner run, то файл находится тут:В других системах (non Unix) файл находится:
Использование в pipeline
Для использования определенного gitlab runner в каждом pipeline нужно использовать ключевое слово tag и название runner (а точнее его tag)
А что если не указать tag в piipeline
В таком случае runner будет выбран самостоятельно из shared (общедоступных)
Сигналы
| Команда | Сигнал | Описание |
|---|---|---|
register |
SIGINT | Отменить регистрацию Runner. Если Runner уже успел зарегистрироваться, удалить его регистрацию. |
run, run-single |
SIGINT, SIGTERM | Прервать все запущенные сборки и завершнить работу раннера |
run, run-single |
SIGQUIT | Перестать принимать новый сборки и завершить работу раннера после завершения всех запущенных сборок |
run |
SIGHUP | Принудително перечитать конфигурационный файл |
Пример использования сигналов
SIGINT - срочно остановить Runner
когда нужно
- случайно запустил runner
- нужно немедленно его выключить
- не важно, что происходит с pipeline
SIGTERM - остановка через systemd
кто делает
- systemctl
- Docker
- Kubernetes
- Другие менеджеры процессов.
SIGQUIT - обновление Runner без потери Job
Нужно бновить Runner. Делать stop плохо, сломаются Job
Поэтому:
После этого Runner не берет новые задачи, а запущенные Job продолжают работать и как только они закончатся Runner сам завершит свою работу.
SIGHUP - изменить настройки без перезапуска
ты изменил настройки config.toml и хочешь начать их использовать
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
Как это работает:
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
затем перезапустить runner:
Ошибка: permission denied while trying to connect to the docker API at unix:///var/run/docker.sock
это означает что пользователь gitlab-runner не может использовать сокет docker
Нужно включить пользователя gitlab-runner в группу Docker
Ошибка: ERROR: Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
Также выше может быть следующая запись
Это означает что runner не имеет требуемый уровень privilege.предупреждение
mkНо DinD обычно требует privileged у Docker executor GitLab Runner.
Нужно посмотреть конфигурационный файл и изменить False на True.
перезапускаем gitlab-runner
проверяем: