Писал ли сам CI/CD pipeline?

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

Ответ

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

Пример сложного пайплайна в GitLab CI для приложения с инфраструктурой на Terraform:

# .gitlab-ci.yml
variables:
  TF_STATE_BUCKET: "my-terraform-state"

stages:
  - validate
  - test
  - build
  - deploy-infra
  - deploy-app

# 1. Валидация кода и конфигураций
validate-terraform:
  stage: validate
  image: hashicorp/terraform:latest
  script:
    - terraform init -backend=false
    - terraform validate
    - terraform fmt -check

# 2. Запуск юнит-тестов приложения
test-unit:
  stage: test
  image: node:18
  script:
    - npm ci
    - npm run test:unit
  artifacts:
    reports:
      junit: report.xml

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

# 4. Планирование и применение инфраструктуры (только для main)
deploy-infra-staging:
  stage: deploy-infra
  image: hashicorp/terraform:latest
  script:
    - terraform init -backend-config="bucket=$TF_STATE_BUCKET"
    - terraform plan -var="environment=staging" -out=planfile
    - terraform apply -auto-approve planfile
  environment:
    name: staging
  only:
    - main

# 5. Деплой приложения в Kubernetes
helm-deploy-staging:
  stage: deploy-app
  image: alpine/helm:latest
  script:
    - helm upgrade --install my-app ./k8s/chart --namespace staging --set image.tag=$CI_COMMIT_SHA
  environment:
    name: staging
  only:
    - main

В своих пайплайнах я активно использую кеширование зависимостей (cache), артефакты, динамическое создание окружений для feature-веток, а также интеграцию с инструментами безопасности (SAST, DAST) и уведомлениями в Slack.