Это оглавление и базовые понятия CI/CD. Детальные разборы — по ссылкам внизу.
CI, CD и Continuous Delivery — в чём разница
Три термина часто смешивают. Разберём строго.
Continuous Integration (CI) — практика, при которой каждый разработчик интегрирует изменения в основную ветку минимум раз в день. Каждый push запускает автоматический билд и тесты. Если сборка сломана — вся команда бросает текущее и чинит прямо сейчас. Мартин Фаулер сформулировал это ещё в 2006: CI — это не инструмент, а дисциплина (martinfowler.com/articles/continuousIntegration.html).
Ключевые практики CI по Фаулеру:
- единый репозиторий — одна ветка как источник истины (или trunk-based development);
- автоматизированный билд — ни один шаг не делается вручную;
- self-testing build — тесты часть сборки, не опция;
- быстрый билд — pipeline дольше 10 минут уже проблема.
Continuous Delivery (CDelivery) — расширение CI: каждый успешный билд является потенциально деплоябельным в production. Деплой происходит по кнопке, но решение нажать — за человеком.
Continuous Deployment (CD) — каждый успешный коммит автоматически уходит в production без ручного шага. Требует зрелого мониторинга, feature flags и немедленного rollback.
Итого: CI ⊂ CDelivery ⊂ CD. Большинство команд живут на уровне CDelivery — и это нормально.
Стадии pipeline
Типичный современный pipeline выглядит так:
[Commit] → [Lint/Static] → [Unit Tests] → [Build & Image] → [Security Scan] → [Push Artifact] → [Deploy Staging] → [E2E Tests] → [Promote Prod]
Каждая стадия — gate. Не прошёл gate — pipeline стопится, не идёт дальше.
Артефакты и неизменяемость
Иммутабельность артефакта — основа воспроизводимых деплоев.
registry.io/app:abc1234 ← иммутабельный, по commit SHA ✓
registry.io/app:latest ← изменяемый pointer ✗ в prod
registry.io/app:1.4.2 ← semver тег для релизов ✓
Почему latest запрещён в prod: два деплоя с тегом latest могут тянуть разные образы, если между ними кто-то пушнул новую сборку. Воспроизводимость теряется, откат становится угадыванием.
Image promotion — CI не собирает новый образ для каждого окружения. Собранный образ по SHA переезжает из staging в prod через обновление значения тега в GitOps-репозитории. Один образ — одна сборка.
Pipeline-as-code
Pipeline описывается в файле в репозитории, а не через UI. Это даёт версионирование, code review и аудит-трейл для самого CI.
GitHub Actions (пример):
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build and push
uses: docker/build-push-action@v5
with:
tags: registry.io/app:${{ github.sha }}
- name: Trivy scan
uses: aquasecurity/trivy-action@0.28.0 # pin version, не @master
with:
image-ref: registry.io/app:${{ github.sha }}
severity: CRITICAL,HIGH
exit-code: 1
GitLab CI (пример):
stages: [build, test, scan, push, deploy]
build:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
trivy:
stage: scan
script:
- trivy image --exit-code 1 --severity CRITICAL $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Два правила, которые нарушают чаще всего:
- Пинить версии actions —
@masterили@latestв экшнах это supply chain attack surface. Пиши SHA или точную версию. - Caching —
actions/cacheдля node_modules,.m2, pip, go mod;--cache-fromв Docker. Без кэша pipeline 5 минут превращается в 15.
Secrets management
Хранить секреты в Git нельзя ни в каком виде — ни plaintext, ни base64. Три подхода для GitOps:
ESO (external-secrets.io) — наиболее зрелый вариант для серьёзного масштаба: централизованное управление, rotation без деплоя, полный audit log.
В самом CI (GitHub Actions / GitLab) — секреты через encrypted variables платформы, никогда не в коде и не в логах.
Метрики DORA
DORA (DevOps Research and Assessment) — четыре метрики, которые статистически коррелируют с бизнес-результатами. Данные из ежегодных отчётов Google DORA (dora.dev/research/).
Первые два — метрики скорости (throughput). Последние два — метрики стабильности (stability). Elite performers улучшают обе оси одновременно — это опровергает старый миф «быстро или надёжно».
Как применять: не как KPI для давления, а как диагностику. Если Lead Time 2 недели — ищи где pipeline тормозит или где approval-loops. Если Change Failure Rate 20% — смотри на coverage, staging-окружение, процедуры review.
Trunk-based vs Feature-branch
Trunk-based — предпосылка для настоящего CI. Если ветка живёт 2 недели, это не непрерывная интеграция, это периодическая интеграция.
Связанные детальные заметки
- Deployment Strategies — Recreate, Rolling Update, Blue-Green, Canary, Shadow. Когда что выбирать, примеры с Kubernetes, Istio и Argo Rollouts.
- Argo CD GitOps delivery — Sync policy, drift detection, guardrails, rollback через
git revert, ApplicationSet, multi-cluster.
Ссылки
- Martin Fowler — Continuous Integration (2006, обновлялась)
- Google DORA — State of DevOps Research
- Argo CD Documentation
- External Secrets Operator
- Trivy — vulnerability scanner
- Kubernetes Deployment Strategies