Продолжаем тему GitLab и разбираем, что такое gitlab-runner, как его ставить и зачем он нужен.
Для чего нужен GitLab Runner
Допустим, есть программист, есть GitLab-сервер и несколько серверов для сборки и деплоя приложения: build, test, stage, prod. На каждый сервер нужно установить gitlab-runner — можно руками, можно через Ansible. При установке указываем, в какой среде runner будет работать: "Docker" или "shell", и присваиваем тег.
Например: первые два сервера делают сборку и тестирование в Docker, теги build и test. Последние два — развертывание в shell, теги stage и prod.
Pipeline и .gitlab-ci.yml
Pipeline описывается декларативно в файле .gitlab-ci.yml в корне репозитория:
stages:
- build # Сборка
- test # Тестирование
- staging # Пре-релиз
- prod # Конечный пользователь
variables:
TEST_DIR: /var/www
build-job:
stage: build
image: ubuntu:20.04
tags:
- build
script:
- echo "Compiling the code..."
- echo "Compile complete" >> index.html
artifacts:
paths:
- build/
unit-test-job:
stage: test
image: ubuntu:20.04
tags:
- test
script:
- echo "Running unit tests... This will take about 60 seconds."
- sleep 60
- echo "Code coverage is 90%"
- test -f /build/index.html
lint-test-job:
stage: test
tags:
- test
script:
- echo "Linting code... This will take about 10 seconds."
- sleep 10
- echo "No lint issues found."
staging-deploy-job:
stage: stage
tags:
- stage
script:
- mkdir build && cd build && touch index.html && sudo cp index.html $TEST_DIR/index.html && echo "stage" > $TEST_DIR/index.html
when: manual
prod-deploy-job:
stage: prod
tags:
- prod
script:
- cp /build/index.html $TEST_DIR/index.html
- test -f $TEST_DIR/index.html
when: manual

GitLab поддерживает разные executors, ознакомиться с которыми можно на официальном сайте gitlab.com.
Установка Docker Runner
На серверах Build и Test должен быть установлен Docker:
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 -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Регистрация GitLab Runner
Заходим в проект, ставим и регистрируем runner на build и test серверах:
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:latest docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \ --non-interactive \ --executor "docker" \ --url "https://gitlab.<DOMAIN>.COM/" \ --token "REDACTED"



Pipeline с sudo
Чтобы команды выполнялись с привилегиями, на удалённых серверах прописываем:
sudo echo "gitlab-runner ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
Создаём .gitlab-ci.yml и запускаем pipeline — сборка, тесты, stage. После commit можно скачать артефакты:



Shell Runner для stage и prod
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash apt -y install gitlab-runner gitlab-runner register --url https://gitlab.devopz.tech --token glrt-W1qN7x9gVxAszzSNQFTT systemctl enable gitlab-runner.service --now
Регистрация глобального Instance runner делается через "Admin Area" аналогично.
