GitLab-Runner. Создание CI/CD Pipeline

15 February 2025

Продолжаем тему 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" аналогично.

Leave a comment

Popular Posts

Advertisement

Headlines