Skip to content

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

Bash
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 и токен регистрации.

Bash
gitlab-runner register
# GitLab Runner
Старт as service
Bash
gitlab-runner start
Удаление
Bash
sudo rm /etc/apt/sources.list.d/runner_gitlab-runner.list
sudo apt purge gitlab-runner\*

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

Bash
# Скачивание бинарника
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>
Удаление
Bash
sudo rm -rf /usr/local/bin/gitlab-runner
sudo userdel gitlab-runner --remove

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

Bash
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, но после регистрации автоматически создастся конфиг файл и ошибка исчезнет.

Bash
docker exec -it gitlab-runner gitlab-runner register --url <URL> --token <TOKEN>

Можно и не интерактивно:

Bash
docker exec -it gitlab-runner gitlab-runner register \
  --non-interactive \
  --url <URL> \
  --token <TOKEN> \
  --executor <docker, shell и тд> \
  --tag-list <список тегов>


Troubleshoot

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

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

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

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

Решение:

Bash
sudo rm /home/gitlab-runner/.bash_logout

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

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

Ошибки

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

Text Only
*** WARNING: Service runner-dlzzq1i-project-60389966-concurrent-0-0e96434e2270020e-docker-0 probably didn't start properly.
Health check error:
service "runner-dlzzq1i-project-60389966-concurrent-0-0e96434e2270020e-docker-0-wait-for-service" timeout
Health check container logs:
<timestamp> waiting for TCP connection to 172.17.0.2 on [2375 2376]...
<timestamp> dialing 172.17.0.2:2376...
<timestamp> dialing 172.17.0.2:2375...
<timestamp> dialing 172.17.0.2:2376...
<timestamp> dialing 172.17.0.2:2376...
<timestamp> dialing 172.17.0.2:2375...
...
Service container logs:
<timestamp> Certificate request self-signature ok
<timestamp> subject=CN=docker:dind server
<timestamp> /certs/server/cert.pem: OK
<timestamp> Certificate request self-signature ok
<timestamp> subject=CN=docker:dind client
<timestamp> /certs/client/cert.pem: OK
<timestamp> cat: can't open '/proc/net/ip6_tables_names': No such file or directory
<timestamp> cat: can't open '/proc/net/arp_tables_names': No such file or directory
<timestamp> ip: can't find device 'nf_tables'
<timestamp> nf_tables 299008 353 nft_chain_nat,nft_compat
<timestamp> libcrc32c 16384 3 nf_nat,nf_conntrack,nf_tables
<timestamp> nfnetlink 20480 4 nf_conntrack_netlink,nft_compat,nf_tables
<timestamp> modprobe: can't change directory to '/lib/modules': No such file or directory
<timestamp> ip: can't find device 'ip_tables'
<timestamp> ip_tables 36864 0
<timestamp> x_tables 61440 7 xt_nat,xt_tcpudp,xt_conntrack,xt_MASQUERADE,xt_addrtype,nft_compat,ip_tables
<timestamp> modprobe: can't change directory to '/lib/modules': No such file or directory
<timestamp> ip: can't find device 'ip6_tables'
<timestamp> modprobe: can't change directory to '/lib/modules': No such file or directory
<timestamp> iptables v1.8.10 (nf_tables)
<timestamp> mount: permission denied (are you root?)
<timestamp> Could not mount /sys/kernel/security.
<timestamp> AppArmor detection and --privileged mode might break.
<timestamp> mount: permission denied (are you root?)
*********
Text Only
*** WARNING: Service runner-dlzzq1i-project-60389966-concurrent-0-f94373ace9b76534-docker-0 probably didn't start properly.
Health check error:
start service container: Error response from daemon: Cannot link to a non running container: /runner-dlzzq1i-project-60389966-concurrent-0-f94373ace9b76534-docker-0 AS /runner-dlzzq1i-project-60389966-concurrent-0-f94373ace9b76534-docker-0-wait-for-service/service (services.go:215:1s)
Service container logs:
<timestamp> cat: can't open '/proc/net/ip6_tables_names': No such file or directory
<timestamp> cat: can't open '/proc/net/arp_tables_names': No such file or directory
<timestamp> ip: can't find device 'nf_tables'
<timestamp> nf_tables             299008 353 nft_chain_nat,nft_compat
<timestamp> libcrc32c              16384  3 nf_nat,nf_conntrack,nf_tables
<timestamp> nfnetlink              20480  4 nf_conntrack_netlink,nft_compat,nf_tables
<timestamp> modprobe: can't change directory to '/lib/modules': No such file or directory
<timestamp> ip: can't find device 'ip_tables'
<timestamp> ip_tables              36864  0 
<timestamp> x_tables               61440  7 xt_nat,xt_tcpudp,xt_conntrack,xt_MASQUERADE,xt_addrtype,nft_compat,ip_tables
<timestamp> modprobe: can't change directory to '/lib/modules': No such file or directory
<timestamp> ip: can't find device 'ip6_tables'
<timestamp> modprobe: can't change directory to '/lib/modules': No such file or directory
<timestamp> iptables v1.8.10 (nf_tables)
<timestamp> mount: permission denied (are you root?)
<timestamp> Could not mount /sys/kernel/security.
<timestamp> AppArmor detection and --privileged mode might break.
<timestamp> mount: permission denied (are you root?)
*********
Text Only
$ docker build .
Cannot connect to the Docker daemon at tcp://docker:2375. Is the docker daemon running?
Text Only
$ docker build .
error during connect: Post [http://docker:2375/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=a9k64d0d59cdxanh7l68utofq&shmsize=0&target=&ulimits=null&version=1](http://docker:2375/v1.40/build?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=a9k64d0d59cdxanh7l68utofq&shmsize=0&target=&ulimits=null&version=1): read tcp 172.17.0.3:35994->172.17.0.2:2375: read: connection reset by peer
Text Only
$ docker build .
time="<timestamp>" 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?buildargs=%7B%7D&cachefrom=%5B%5D&cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&labels=%7B%7D&memory=0&memswap=0&networkmode=default&rm=1&session=od6uge3j996j8w0vmgbtnrre8&shmsize=0&target=&ulimits=null&version=1: context canceled
Нуб-решение

Проверить, чтобы в настройках runner-а (/etc/gitlab-runner/config.toml) у executerdocker был включен привелигированный (privileged) режим, ибо docker:dind без этого не работает; и чтобы образ был не latest версии - юзай docker:stable:

TOML
[[runners]]
  executor = "docker"
  [runners.docker]
    image = "docker:stable"
    privileged = true

Use rootless Docker-in-Docker with restricted privileged mode

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

Проверить, чтобы был отключен TLS для docker:dind с помощью переменной в .gitlab-ci.yml:

Text Only
variables:
    DOCKER_TLS_CERTDIR: "" # disabling TLS for Docker-in-Docker

И подозреваю, что в каких-то случаях в variables, возможно, понадобятся еще две переменных (но я лично не нуждался пока в этом):

Text Only
variables:
    DOCKER_HOST: tcp://docker:2375
    # DOCKER_DRIVER: overlay2

(Про DOCKER_DRIVER читай блок warning ниже.)

Лучшее решение

Но всё можно настроить в одном месте (/etc/gitlab-runner/config.toml) и один раз, чтобы в .gitlab-ci.yml для каждого пайплайна не писать:

TOML
[[runners]]
  executor = "docker"
  environment = ["DOCKER_TLS_CERTDIR="]
  pre_build_script = "export DOCKER_HOST=tcp://docker:2375"
  [runners.docker]
    image = "docker:stable"
    privileged = true

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

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

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


gitlab #gitlab-runner #tool #CI/CD #devops