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
[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
[[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
, но у меня он вызывает крайнюю ошибку из перечня ошибок выше.