← [Раздел](README.md) · [Главная](../README.md)

# CI/CD и GitOps

## Цель

Понять **непрерывную интеграцию и доставку**: этапы pipeline, стратегии выката (rolling, blue-green, canary), и **GitOps** — когда желаемое состояние кластера хранится в Git и синхронизируется контроллером.

## Предварительно

- [Kubernetes базово](kubernetes-bazovo.md)
- Опыт с GitHub Actions / GitLab CI (любой)

## Время

~80 минут

---

## CI vs CD

| | CI (Continuous Integration) | CD (Continuous Delivery/Deployment) |
|---|---------------------------|-------------------------------------|
| **Когда** | На каждый commit/PR | После успешного CI |
| **Что** | Сборка, тесты, scan образа | Деплой на staging/prod |
| **Результат** | Артефакт (image) | Работающая версия в среде |

**Continuous Deployment** — автоматический выкат в prod без ручной кнопки (редко с первого дня).

---

## Типичный pipeline

```text
1. Checkout
2. Lint + unit tests
3. Integration tests (Testcontainers)
4. Build image → push registry
5. Scan image (Trivy)
6. Update manifest (image tag) в Git
7. GitOps sync / helm upgrade
8. Smoke tests на staging
9. (Approve) → prod
```

Падение на шаге 3 **блокирует** merge.

---

## Пример фрагмента GitHub Actions

```yaml
name: ci
on: [pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-go@v5
        with:
          go-version: "1.22"
      - run: go test ./...
  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: docker build -t registry.example.com/shop-api:${{ github.sha }} .
      - run: docker push registry.example.com/shop-api:${{ github.sha }}
```

Секреты registry — в `secrets.REGISTRY_TOKEN`, не в YAML.

---

## Стратегии деплоя

| Стратегия | Суть | Риск |
|-----------|------|------|
| **Rolling** | Постепенная замена pod | Смешанные версии |
| **Blue/Green** | Два полных стека, переключение | Двойные ресурсы |
| **Canary** | 5% трафика на новую версию | Нужен mesh/gateway |

Для критичных изменений схемы БД — **миграции отдельно** от кода (expand/contract pattern).

---

## GitOps

```text
Git repo (manifests)
    ↓ watch
Argo CD / Flux
    ↓ apply
Kubernetes cluster
```

| Принцип | Описание |
|---------|----------|
| Git — источник правды | Любое изменение через PR |
| Декларативность | YAML/Helm, не `kubectl edit` |
| Автосинхронизация | Drift исправляется или алертится |

Пример структуры:

```text
infra-gitops/
  apps/shop-api/
    base/
    overlays/staging/
    overlays/production/
```

---

## Helm и Kustomize

| Инструмент | Когда |
|------------|-------|
| **Kustomize** | Патчи overlay без шаблонов |
| **Helm** | Чарты с параметрами, релизы |

Оба совместимы с GitOps. Выбор — конвенция команды.

---

## Feature flags vs branch

Долгоживущие feature-ветки ломают trunk-based flow. Выкатывайте код **выключенным** (flag), включайте после проверки — decouples deploy от release.

---

## Rollback

| Уровень | Действие |
|---------|----------|
| GitOps | Revert commit с новым тегом образа |
| Kubernetes | `kubectl rollout undo` |
| БД | Обратная миграция (если совместима) |

Храните **предыдущий** рабочий тег образа в release notes.

---

## DORA metrics (ориентир)

| Метрика | Хороший ориентир |
|---------|------------------|
| Deployment frequency | Раз в день–неделю (контекст) |
| Lead time for changes | Часы–дни |
| Change failure rate | < 15% |
| MTTR | < 1 час |

Архитектура (малые сервисы, тесты, observability) напрямую влияет на DORA.

---

## Самопроверка

1. Чем CI отличается от CD?
2. Что такое GitOps в одном предложении?
3. Когда canary лучше rolling update?
4. Зачем сканировать образ в pipeline?

---

## Дальше

→ [Terraform и IaC](terraform-iac.md)  
← [Kubernetes базово](kubernetes-bazovo.md)
