DevOps & CI/CD

GitLab

Платформа для Git-репозиториев со встроенным CI/CD, registry и возможностью развернуть всё на своём сервере.

Что такое GitLab

GitLab (гитлаб) — платформа для хостинга Git-репозиториев с полным циклом разработки в одном продукте: репозитории, merge request'ы, CI/CD, Docker Registry, задачи, вики, мониторинг безопасности.

Главное отличие от GitHub — бесплатная self-hosted-версия Community Edition. GitLab ставится на свой сервер и работает полностью внутри контура: код, образы и пайплайны не покидают вашу инфраструктуру. Для компаний с требованиями к хранению данных это часто решающий аргумент.

GitLab CI и .gitlab-ci.yml

CI встроен в платформу: достаточно положить .gitlab-ci.yml в корень репозитория, и пайплайн запустится на следующий push.

stages: [test, build, deploy]

variables:
  IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

test:
  stage: test
  image: python:3.12
  cache:
    key: $CI_COMMIT_REF_SLUG
    paths: [.cache/pip]
  script:
    - pip install -r requirements.txt
    - pytest -q

build:
  stage: build
  image: docker:27
  services: [docker:27-dind]
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE .
    - docker push $IMAGE
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

deploy:
  stage: deploy
  script:
    - kubectl set image deploy/api api=$IMAGE
  environment: production
  when: manual

Переменные CI_REGISTRY, CI_COMMIT_SHORT_SHA, CI_PIPELINE_ID GitLab подставляет сам — встроенный registry не требует настройки учётных данных.

Что такое GitLab Runner

GitLab Runner (gitlab-runner) — отдельный агент, который и выполняет задачи пайплайна. Сам GitLab только раздаёт задания; вся работа идёт на runner'ах. Их можно поставить где угодно: на VPS, в Kubernetes, на GPU-машине.

Установка и регистрация:

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt install gitlab-runner

sudo gitlab-runner register \
  --url https://gitlab.example.com/ \
  --token <RUNNER_TOKEN> \
  --executor docker \
  --docker-image alpine:latest \
  --tag-list "docker,linux"

sudo gitlab-runner status
sudo gitlab-runner list

Executor'ы

Executor Как выполняет job Когда выбирать
shell Прямо в шелле хоста Просто, но грязнит машину
docker Каждая job в свежем контейнере Стандартный выбор
docker+machine Поднимает VM под нагрузку Автомасштабирование сборок
kubernetes Job как под в кластере Когда кластер уже есть

Runner с GPU

Для сборки CUDA-образов и тестов инференса регистрируют runner на машине с картой и NVIDIA Container Toolkit:

sudo gitlab-runner register --executor docker \
  --docker-image nvidia/cuda:12.4.0-base-ubuntu22.04 \
  --docker-gpus all --tag-list "gpu"
bench:
  tags: [gpu]          # job уедет только на runner с этим тегом
  script: [nvidia-smi, python bench.py]

Merge request

Аналог pull request'а в GitHub, но интегрированный с пайплайном: MR показывает статус сборки, покрытие тестами, найденные уязвимости и позволяет включить merge-when-pipeline-succeeds. Правило «нельзя влить красный пайплайн» настраивается в защите ветки и, по сути, реализует CI как обязательный процесс, а не как рекомендацию.

Развёртывание своего GitLab

Omnibus-пакет ставит всё сразу — веб, PostgreSQL, Redis, Nginx. Требования ощутимые: под небольшую команду закладывают 4 CPU и 8 ГБ RAM, диск — под репозитории и слои образов в registry. Не забудьте про резервное копирование: весь код компании оказывается в одном месте.

Связанные термины

  • Git — система контроля версий в основе GitLab
  • GitHub — главный конкурент
  • CI/CD — практика, встроенная в GitLab «из коробки»
  • CI/CD pipeline — что описывает .gitlab-ci.yml
  • Docker Registry — встроенное хранилище образов
  • Bitbucket — ещё одна альтернатива

Готовы запустить GPU-задачу?

Запустить GPU-сервер