gitlab-runner

  • Имеет доступ к репозиторию проекта
  • Запускает описанные сценарии действий с кодом.gitlab-ci.yml) после срабатывания триггера (например, git push)
  • Умеет работать со всеми функциями GitLab (например, GitLab Pages, Issues, Docker Registry)
  • Может работать с разными системами (Linux, MacOS и т.д.) и интерпретаторами команд (shell, docker, ssh, k8s, parallels, vbox или кастомный бинарник)

Установка

Установка с apt репозиторием

Sauce: https://docs.gitlab.com/runner/install/linux-repository.html#installing-gitlab-runner

curl -sL 'https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh' | sudo bash
sudo apt install gitlab-runner -y

Регистрация

В Settings CI/CD Runners будут данные для авторизации: URL и токен регистрации.

gitlab-runner register
# GitLab Runner

Старт as service

gitlab-runner start

Удаление

sudo rm /etc/apt/sources.list.d/runner_gitlab-runner.list
sudo apt purge gitlab-runner\*

Установка бинарника

# Скачивание бинарника
sudo curl -L --output /usr/local/bin/gitlab-runner "https://s3.dualstack.us-east-1.amazonaws.com/gitlab-runner-downloads/latest/binaries/gitlab-runner-linux-amd64" && sudo chmod +x /usr/local/bin/gitlab-runner
 
# Создание юзера
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
 
# хз)
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
 
# Старт as service
sudo gitlab-runner start
 
# Register
sudo gitlab-runner register --url <URL> --token <TOKEN>

Удаление

sudo rm -rf /usr/local/bin/gitlab-runner
sudo userdel gitlab-runner --remove

Установка в docker контейнере

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:alpine

Регистрация

До регистрации могут быть ошибки в логах контейнера

До регистрации не существует конфиг файла - на это и будет ругаться gitlab-runner, но после регистрации автоматически создастся конфиг файл и ошибка исчезнет.

docker exec -it gitlab-runner gitlab-runner register

Пример команды для неинтерактивный регистрации:

docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --url 'https://gitlab.com/' \
  --registration-token "$GITLAB_RUNNER_REGISTRATION_TOKEN" \
  --name 'yc-skillbox-docker' \
  --run-untagged='true' \
  --executor docker \
  --docker-image 'docker:stable' \
  --docker-volumes '/cache' \
  --docker-volumes '/var/www:/var/www:rw' \
  --docker-privileged \
  --env 'DOCKER_TLS_CERTDIR=' \
  --pre-build-script 'export DOCKER_HOST=tcp://docker:2375'

Нейминг экземпляров gitlab-runner

Именовать раннеры при регистрации стоит так, чтобы сразу было понятно по названию - что это за раннер, где находится, для чего нужен.
Например, раннер с executor-ом shell на моем домашнем сервере Intel Nuc (😭) я назвал nuc-shell. Раннеры под какие-то отдельные проекты аналогично - nuc-<project>-docker.

Добавление volumes

/srv/gitlab-runner/config/config.toml
[runners.docker]
  volumes = ["/cache", "/var/www:/www:rw"]

При регистрации:

docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --docker-volumes '/cache' \
  --docker-volumes '/var/www:/var/www:rw' \

Troubleshoot

В траблах общего назначения проверь конфиг (в случае с запуском в контейнере это /srv/gitlab-runner/config/config.toml) на наличие дублирующихся блоков кода.

Время отлова задачи зависит от сервера, на котором стоит раннер

Сервера с белыми IP ловят задачи за секунды, а сервера с серыми IP могут ловить задачу (то есть, когда простаивает в pending state) целую минуту, а то и больше.

Не запускается gitlab-runner (бинарник) при event

При запуске пайплайна в GitLab WebUI не запускался job с такой ошибкой:

ERROR: Job failed: prepare environment: exit status 1. Check https://docs.gitlab.com/runner/shells/index.html#shell-profile-loading for more information

Решение:

sudo rm /home/gitlab-runner/.bash_logout

Sauce:
Ответ на SO
Этот ответ тоже полезен для выявления проблемы

Траблы с docker:dind и permissions

Ошибки

Возникновение одного или несколько ошибок в job-ах из следующего перечня:

*** WARNING: Service runner-<something>-docker-0 probably didn't start properly.
Health check error:
service "runner-<something>-docker-0-wait-for-service" timeout
Health check container logs:
waiting for TCP connection to 172.17.0.2 on [2375 2376]...
dialing 172.17.0.2:2376...
dialing 172.17.0.2:2375...
...
Service container logs:
cat: can't open '/proc/net/ip6_tables_names': No such file or directory
cat: can't open '/proc/net/arp_tables_names': No such file or directory
modprobe: can't change directory to '/lib/modules': No such file or directory
ip: can't find device 'nf_tables'
ip: can't find device 'ip_tables'
ip: can't find device 'ip6_tables'
mount: permission denied (are you root?)
Could not mount /sys/kernel/security.
AppArmor detection and --privileged mode might break.
*********
start service container: Error response from daemon: Cannot link to a non running container: /runner-<something>-docker-0 AS /runner-<something>-docker-0-wait-for-service/service (services.go:215:1s)
$ docker build .
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
$ docker build .
error during connect: Post [http://docker:2375/v1.40/build?<URL shi>](http://docker:2375/v1.40/build?<URL shi>): read tcp 172.17.0.3:35994->172.17.0.2:2375: read: connection reset by peer
$ docker build .
level=error msg="failed to dial gRPC: cannot connect to the Docker daemon. Is 'docker daemon' running on this host?: dial tcp: lookup docker on 192.168.1.1:53: no such host"
error during connect: Post http://docker:2375/v1.40/build?<URL shi>: context canceled

Решение

  • docker:dind не работает без привелигированного режима.
  • Нужно отключить TLS для docker:dind
  • Нужно указать DOCKER_HOST
config.toml
[[runners]]
  executor = "docker"
  environment = ["DOCKER_TLS_CERTDIR="]
  pre_build_script = "export DOCKER_HOST=tcp://docker:2375"
  [runners.docker]
    privileged = true

Можно сделать то же самое при регистрации:

docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --docker-privileged \
  --env 'DOCKER_TLS_CERTDIR=' \
  --pre-build-script 'export DOCKER_HOST=tcp://docker:2375'

DOCKER_DRIVER может мешать

Я не использую environment = ["DOCKER_DRIVER=overlay2", "DOCKER_TLS_CERTDIR="], ибо при определении переменной DOCKER_DRIVER (не важно где) возникает такая ошибка:

error during connect: Post http://docker:2375/v1.40/auth: dial tcp: lookup docker on 192.168.1.1:53: no such host

Вообще, есть способ юзать ограниченный привелигированный режим c docker:dind-rootless, но у меня он вызывает крайнюю ошибку из перечня ошибок выше.