Собирали ли вы CI/CD pipeline в GitLab?

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

Ответ

Да, я неоднократно проектировал и поддерживал CI/CD пайплайны в GitLab CI/CD для микросервисных приложений. Вот пример многоэтапного пайплайна для приложения на Go, который я реализовывал:

# .gitlab-ci.yml
stages:
  - test
  - build
  - scan
  - deploy-staging
  - deploy-prod

variables:
  DOCKER_IMAGE: "$CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA"

# 1. Тестирование
unit-test:
  stage: test
  image: golang:1.19
  script:
    - go test ./... -v

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

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

# 4. Деплой в staging (Kubernetes)
deploy-to-staging:
  stage: deploy-staging
  image: bitnami/kubectl:latest
  script:
    - kubectl config use-context staging-cluster
    - sed "s|{{IMAGE}}|$DOCKER_IMAGE|g" k8s/deployment.yaml | kubectl apply -f -
    - kubectl rollout status deployment/myapp -n staging
  environment:
    name: staging
  only:
    - main

# 5. Ручной деплой в production (после approval)
deploy-to-production:
  stage: deploy-prod
  image: bitnami/kubectl:latest
  script:
    - kubectl config use-context prod-cluster
    - sed "s|{{IMAGE}}|$DOCKER_IMAGE|g" k8s/deployment.yaml | kubectl apply -f -
  environment:
    name: production
  when: manual
  only:
    - main

Ключевые практики, которые я применял: использование Docker-in-Docker для сборки, сканирование образов на уязвимости, разделение контекстов Kubernetes для разных сред и ручное подтверждение (when: manual) для деплоя в production.