Был ли у вас опыт настройки CI (Continuous Integration)?

«Был ли у вас опыт настройки CI (Continuous Integration)?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, я настраивал и поддерживал CI-пайплайны в GitLab CI/CD и GitHub Actions. Цель — автоматизировать сборку, тестирование и создание артефактов при каждом коммите.

Типичный пайплайн для микросервиса на Go:

# .gitlab-ci.yml
stages:
  - validate
  - test
  - build
  - security-scan

variables:
  GO_VERSION: "1.21"
  DOCKER_IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"

# 1. Валидация кода
lint:
  stage: validate
  image: golang:$GO_VERSION
  script:
    - go fmt ./...
    - go vet ./...
    - staticcheck ./...

# 2. Запуск юнит- и интеграционных тестов
test:
  stage: test
  image: golang:$GO_VERSION
  services:
    - postgres:15-alpine
  variables:
    POSTGRES_DB: test_db
  script:
    - go test -v -race ./... -coverprofile=coverage.out
  artifacts:
    reports:
      cobertura: coverage.out

# 3. Сборка Docker-образа
build:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  script:
    - docker build -t $DOCKER_IMAGE .
    - docker push $DOCKER_IMAGE
  only:
    - merge_requests
    - main

# 4. Сканирование образа на уязвимости
trivy-scan:
  stage: security-scan
  image: aquasec/trivy:latest
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $DOCKER_IMAGE

Ключевые практики, которые я применял:

  • Кэширование зависимостей (Go modules, npm packages) для ускорения сборок.
  • Параллельное выполнение независимых jobs (lint, unit tests).
  • Артефакты и отчеты: сохранение бинарников, отчетов о покрытии кода тестами (Cobertura), результатов линтинга.
  • Интеграция с внешними инструментами: отправка уведомлений о падении сборки в Slack, создание инцидентов в Grafana.