Рассмотрим как можно подключить несколько раннеров, все с docker executor к gitlab. Один будет шаренный раннер и доступен из любого проекта, другой будет использоваться только под проект.
В качестве раннера я буду использовать ВМ со следующей конфигурацией.
Vagrant.configure("2") do |config|
config.vm.provider "virtualbox" do |vb|
vb.gui = false
vb.memory = 1024
vb.cpus = 1
vb.check_guest_additions = false
config.vm.box_check_update = false
config.vm.box = "bento/ubuntu-22.04"
end
config.vm.define "runner" do |node|
node.vm.hostname = "runner"
node.vm.network "public_network", ip: "192.168.10.20", bridge: "wlo1"
end
end
Запускаем VM:
vagrant up
Ставим докер:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Далее, прежде чем запустить раннер, его нужно зарегистрировать. Это также можно сделать через docker, но перед этим, чтобы не было проблем с x509, так как в прошлой статье про установку gitlab я использовал само подписанные сертификаты, нужно этот самый сертификат добавить в раннер. Я создам директорию /etc/gitlab-runner/certs на раннере и положу содержимое файла /etc/gitlab/ssl/gitlab.crt с сервера гитлаба в /etc/gitlab-runner/certs/gitlab.dev.local.crt.
Сначала подключим «шаренный» раннер, он будет доступен в любом проекте. Для этого нужно получить в веб-интерфейсе гитлаба, регистрационный токен. У меня это путь «https://gitlab.dev.local/admin/runners».
Также конкретно в моей тестовой инсталяции не будет доступен адрес gitlab.dev.local с машины раннера, нужно либо добавить его в hosts, либо отключить systemd-resolved и прописать namespacer 192.168.10.100 (в моем случае) в resolv.conf. Ну либо настроить системный резолвер, но быстрее будет так, как я описал выше.
Создадим скрипт запуска регистрации раннера:
#!/bin/bash
docker run --rm -v /etc/gitlab-runner/config:/etc/gitlab-runner -v /etc/gitlab-runner/certs:/etc/gitlab-runner/certs:ro \
gitlab/gitlab-runner register \
--non-interactive \
--url "https://gitlab.dev.local" \
--registration-token "<registration_token>" \
--executor "docker" \
--docker-image alpine:latest \
--description "docker-runner" \
--tag-list "docker-runner"
Подход с регистрацией раннера с помощью registration-token объявлен как deprecated. В конце статьи я покажу как можно зарегистрировать раннер по новому флоу.
Теперь можно запустить сам раннер командой:
#!/bin/bash
docker run -d --name gitlab-runner --restart always \
-v /etc/gitlab-runner/config:/etc/gitlab-runner \
-v /etc/gitlab-runner/certs:/etc/gitlab-runner/certs:ro \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
В гитлабе должны увидеть, что он стал онлайн.
Напишем простой pipeline для проверки работы раннера.
Я завел репозиторий devops-ci, теперь его нужно склонировать. Перед этим нужно добавить ssh ключ в настройки аккаунта в gitlab.
export GIT_SSH_COMMAND='ssh -i ~/.ssh/private_key'
git clone git@gitlab.dev.local:root/devops-ci.git
В корне проекта создаем .gitlab-ci.yml следующего содержимого:
default:
tags: [ docker-runner ]
stages:
- test
test-runner:
stage: test
script:
- echo "It's work!"
Делаем комит и проверяем:
git add .
git commit -m "Add test ci"
git push origin main
Регистрация проектного раннера
Выше мы сделали шаренный раннер, давайте теперь сделаем раннер, доступный только в конкретном проекте.
В настройках CI/CD проекта, в разделе runners, нужно получить регистрационный токен.
Пропишем его в созданный ранее регистрационный скрипт, изменим значение ключа —tag-list на docker-runner-devops-ci и выполним. В наш конфиг будет записан еще один раннер, который сразу же станет доступен в gitlab. Запускаться он будет в том же основном контейнере, что и раннер, который мы подключили первым, но в разных докер контейнерах внутри, так как мы используем docker executor. Если нужно запускать это в разных «управляющих контейнерах», то можно делать разные пути для конфиг файлов, использовать разные ВМ и так далее, тут уже управление ложиться на слой администрирования и того, что требуется в вашем проекте.
Поменяем тег раннера и проверим, запустив тот же пайплайн.
tags: [ docker-runner-devops-ci ]
Видим, что пайплайн выполнился на другом раннере.
Регистрация раннера без использования registration-token
Для этого нужно в админ панели создать раннер.
В https://gitlab.dev.local/admin/runners выбираем «new instance runner»
Далее заполняем предложенные поля.
И нажимаем «Create runner». На следующей странице увидим инструкцию и токен. Полученный токен нужно вставить в скрипт заменив ключ —registration-token на —token.