GitLab CI/CD (Непрерывная интеграция и доставка в GitLab)

⌘K

GitLab CI/CD (Непрерывная интеграция и доставка в GitLab)

GitLab CI/CD — это встроенная система автоматизации в платформу GitLab, обеспечивающая полный контроль над жизненным циклом разработки: от коммита и тестирования до сборки, деплоя и мониторинга. Конфигурация происходит через файл .gitlab-ci.yml, который хранится в репозитории и определяет поведение пайплайна как код.


Что делает GitLab CI/CD

  • Запускает тесты и сборки при каждом пуше или pull/merge request;
  • Выполняет деплой на staging и production автоматически или по триггеру;
  • Контролирует состояние пайплайна в реальном времени — с логами, статусами, графами;
  • Интегрируется с внешними сервисами и инструментами: Docker, Kubernetes, Helm, Terraform, Slack, Prometheus, Sentry и др.;
  • Поддерживает DevSecOps — встроенные сканеры SAST, DAST, Dependency Scanning, Container Scanning, License Compliance;
  • Автоматически генерирует пайплайн в проектах с поддерживаемыми языками (Node.js, Python, Java и др.).

Основные компоненты GitLab CI

КомпонентОписание
StagesПоследовательные этапы: build, test, deploy, review, cleanup
JobsКонкретные задачи в рамках этапа (например, run unit tests)
RunnersИсполнители задач (shared или custom, docker, shell, Kubernetes)
TriggersМеханизмы запуска пайплайна вручную, по расписанию или через API
ArtifactsФайлы, передающиеся между задачами или сохраняемые для загрузки
EnvironmentsПеременные среды и управление rollout’ами на stage/prod

Пример базового .gitlab-ci.yml

stages:
  - test
  - build
  - deploy

test:
  stage: test
  image: node:20
  script:
    - npm ci
    - npm run test

build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t registry.gitlab.com/mygroup/app:$CI_COMMIT_SHORT_SHA .
    - docker push registry.gitlab.com/mygroup/app:$CI_COMMIT_SHORT_SHA

deploy:
  stage: deploy
  script:
    - helm upgrade --install app ./helm \
        --set image.tag=$CI_COMMIT_SHORT_SHA \
        --namespace production
  only:
    - main

📌 Этот пайплайн: запускает тесты, билдит Docker-образ и деплоит через Helm.


Преимущества GitLab CI/CD

  • Единая платформа: код, ревью, CI/CD, безопасность — всё в одном месте;
  • Pipeline-as-Code: вся логика хранится и версионируется рядом с кодом проекта;
  • Универсальность: от простых скриптов до сложных многоконтурных пайплайнов;
  • Безопасность по умолчанию: встроенные инструменты DevSecOps без необходимости настройки с нуля;
  • Гибкая кастомизация: условия запуска (rules, only/except), переменные, матричные сборки, dynamic child pipelines и многое другое.

Поддержка DevOps/DevSecOps

  • SAST, DAST, Container Scanning, License Compliance — включаются одной строкой;
  • Scan results → MR Widget — предупреждения отображаются прямо в merge request;
  • Security Dashboard — сводная аналитика уязвимостей по всем проектам;
  • Policies и approvals — настраиваются для продакшн-окружений и безопасности кода.

GitLab CI/CD — это не просто CI-инструмент, а интегрированная DevOps-платформа, которая позволяет командам автоматизировать и стандартизировать процессы от разработки до доставки и безопасности.


Вот практическое продолжение — готовые шаблоны и конфигурации для GitLab CI/CD, которые можно адаптировать под любой проект:

Пример: .gitlab-ci.yml с multi-stage pipeline, Docker, Helm, и SAST

stages:
  - lint
  - test
  - build
  - security
  - deploy

variables:
  IMAGE_TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

lint:
  stage: lint
  image: node:20
  script:
    - npm ci
    - npm run lint

test:
  stage: test
  image: node:20
  script:
    - npm run test:ci

build:
  stage: build
  image: docker:20
  services:
    - docker:dind
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build -t $IMAGE_TAG .
    - docker push $IMAGE_TAG

security-sast:
  stage: security
  image: docker:20
  allow_failure: true
  script:
    - docker run --rm -v $(pwd):/src returntocorp/semgrep --config=auto
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'

deploy-prod:
  stage: deploy
  image: alpine/k8s:1.27.4
  script:
    - helm upgrade --install app ./helm \
        --namespace production \
        --set image.repository=$CI_REGISTRY_IMAGE \
        --set image.tag=$CI_COMMIT_SHORT_SHA
  only:
    - main

Пример для dynamic review apps (merge requests)

review:
  stage: deploy
  environment:
    name: review/$CI_COMMIT_REF_NAME
    url: https://$CI_COMMIT_REF_SLUG.example.com
  script:
    - helm upgrade --install app-$CI_COMMIT_REF_SLUG ./helm \
        --namespace review \
        --set image.tag=$CI_COMMIT_SHORT_SHA \
        --set ingress.host=$CI_COMMIT_REF_SLUG.example.com
  only:
    - merge_requests

📌 Это создаёт временное окружение на каждый merge request.


GitLab Runner: запуск в Docker (standalone)

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 exec -it gitlab-runner gitlab-runner register