CI/CD — это совокупность практик, инструментов и автоматизаций, которые помогают командам быстро и безопасно доставлять изменения в продукт. Аббревиатура состоит из двух частей: CI (непрерывная интеграция) и CD (непрерывная доставка/развёртывание). Главная идея — превращать частые маленькие изменения кода в надёжный, повторяемый и проверяемый поток поставки ценности пользователю.
Что такое CI (Continuous Integration)
Непрерывная интеграция (CI) — это практика частого слияния изменений в основную ветку репозитория с обязательным автоматическим запуском проверок: сборка, линтинг, тесты, анализ качества кода, проверка безопасности. Цель — обнаруживать дефекты как можно раньше, пока они малы и дешевы в исправлении.
Сборка: проверяем, что проект вообще компилируется/собирается.
Статический анализ: линтеры, типизация, SAST для поиска уязвимостей.
Артефакты: публикация собранных пакетов/образов в реестры.
Что такое CD (Continuous Delivery/Deployment)
Непрерывная доставка (Continuous Delivery) — автоматизация пути от собранного артефакта до подготовленного релиза, который можно одним действием выкатить в прод. Непрерывное развёртывание (Continuous Deployment) — следующий шаг, когда выкатывание в прод тоже автоматизировано и происходит сразу после прохождения всех проверок (может включать канареечные и blue/green стратегии).
Delivery: артефакт готов к релизу, но «кнопка» у человека.
Deployment: релиз «без кнопки» — автоматом по правилам и сигналам качества.
Преимущества CI/CD
Быстрая обратная связь: дефекты ловятся «на входе», а не «на выходе».
Повторяемость: один и тот же процесс для каждой ветки/релиза.
Снижение рисков: маленькие релизы простее откатывать и тестировать.
Прозрачность: статусы пайплайнов, артефактов и окружений видны команде.
Скорость вывода на рынок: меньше «ручных» задержек и координации.
Контейнеры и среды выполнения
CI/CD тесно связан с контейнерами (Docker) и оркестраторами (например, Kubernetes). Контейнеры обеспечивают одинаковое окружение на этапах сборки, тестирования и в проде. Это снижает «работает у меня/не работает у тебя».
# Пример минимального Dockerfile для Node.js
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY .. .
RUN npm run build
# Запускаем как non-root пользователя
USER node
EXPOSE 3000
CMD ["node", "dist/main.js"]
Пример: GitLab CI + Kubernetes + Argo CD
Частый стек: GitLab хранит код и запускает пайплайны CI; артефакты (образы) публикуются в реестр; манифесты Kubernetes хранятся как код; Argo CD следит за репозиторием манифестов и приводит кластеры в желаемое состояние (GitOps).
Argo CD отслеживает Git-репозиторий с манифестами и синхронизирует кластер с «истиной в Git». Любое изменение манифестов проходит через ревью и пайплайн, после чего Argo CD применит его в кластере.
Gitea — лёгкий self-hosted Git-сервер. Для CI можно использовать Gitea Actions (совместимы с GitHub Actions) и разворачивать сервисы через Docker Compose в небольших проектах или на edge/стендах.
Качество, безопасность и наблюдаемость в пайплайне
SAST/DAST/Dependency Scan: ищите уязвимости до релиза.
Подпись артефактов: Cosign/Sigstore — подтверждение происхождения образов.
Политики: OPA/Gatekeeper и Kyverno для валидирования манифестов.
Наблюдаемость: OTel трейсы/метрики/логи встроены в сборку и проверки.
# Пример шага Snyk Trivy в GitLab CI
security_scan:
stage: test
image: aquasec/trivy:0.55.0
script:
- trivy image --exit-code 1 --severity CRITICAL,HIGH "$IMAGE_TAG"
needs: [ "build" ]
Секреты и конфигурация
Разделяйте код и конфигурацию. Секреты храните в безопасных системах (Vault, Secrets менеджеры облаков, зашифрованные переменные CI/CD). Не коммитьте ключи в репозиторий.
Trunk-Based: короткие ветки, частые merge в main, фичи за флагами.
GitFlow: отдельные develop/release/hotfix; больше контроля, медленнее поток.
Release by tag: выпуск по аннотированным тегам и автогенерации релиз-нот.
# Фрагмент GitLab CI для публикации по тэгу
publish:
stage: release
rules:
- if: '$CI_COMMIT_TAG'
script:
- echo "Publishing version $CI_COMMIT_TAG"
- ./scripts/publish.sh "$CI_COMMIT_TAG"
Локальная разработка и воспроизводимость
Локально разработчики могут повторять части пайплайна с помощью Docker и Compose, чтобы быстрее воспроизводить ошибки. Это соответствует принципу «одинаковые окружения от ноутбука до продакшена».