# CI/CD pipeline

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

## Цель

Понять **непрерывную интеграцию и доставку**: триггеры, stages, jobs, artifacts, environments — и **куда** вставляются security checks.

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

- [Kubernetes — введение](kubernetes-vvedenie.md)

## Время

**8–10 часов**

---

## CI vs CD

| | CI (Continuous Integration) | CD (Continuous Delivery/Deployment) |
|---|------------------------------|-------------------------------------|
| Фокус | Сборка + тесты на каждый commit | Доставка в окружения |
| Вопрос | «Код работает?» | «Код в prod?» |
| Частота | Каждый push/MR | По merge / manual gate |

**Pipeline** — автоматизированная **цепочка шагов**.

---

## Триггеры

| Триггер | Когда |
|---------|-------|
| push to branch | dev feature work |
| merge request | review + CI |
| tag `v1.2.3` | release |
| schedule (cron) | nightly scans |
| manual | deploy prod |

---

## Типичные stages

```
lint → unit test → build → image scan → deploy staging → DAST → deploy prod
  ↑                      ↑         ↑                           ↑
 eslint               docker    Trivy                      approval
```

| Stage | SecOps пример |
|-------|---------------|
| lint | Semgrep SAST |
| test | Security unit tests |
| build | SBOM generation |
| scan | SCA, secret scan |
| deploy | Signed image only |

---

## Пример GitLab CI (фрагмент)

```yaml
stages:
  - test
  - build
  - scan
  - deploy

variables:
  IMAGE: registry.example.com/app:$CI_COMMIT_SHA

unit_tests:
  stage: test
  script:
    - npm ci
    - npm test

build_image:
  stage: build
  script:
    - docker build -t $IMAGE .
    - docker push $IMAGE

trivy_scan:
  stage: scan
  script:
    - trivy image --exit-code 1 --severity HIGH,CRITICAL $IMAGE

deploy_staging:
  stage: deploy
  environment:
    name: staging
  script:
    - kubectl set image deployment/app app=$IMAGE -n staging
  only:
    - main
```

---

## Artifacts и cache

| | Artifacts | Cache |
|---|-----------|-------|
| Назначение | Передать между jobs (reports, binaries) | Ускорить повторные builds |
| SecOps | SAST report, SBOM JSON | Не кэшировать secrets |

**JUnit / SARIF** — форматы отчётов для UI и gates.

---

## Quality gates

**Gate** — шаг, который **блокирует** merge/deploy при нарушении:

```yaml
sast:
  script:
    - semgrep ci --error
  allow_failure: false
```

| Политика | Tradeoff |
|----------|----------|
| Block on Critical | Строго, возможны false positives |
| Warn only | Быстрее, риск пропуска |
| Exception process | CVE с waiver + expiry date |

---

## Environments и secrets в CI

```yaml
deploy_prod:
  environment: production
  script:
    - echo "$KUBECONFIG_DATA" | base64 -d > kubeconfig
  rules:
    - if: $CI_COMMIT_TAG
  when: manual
```

| Практика | Зачем |
|----------|-------|
| Masked variables | Не в логах |
| Protected branches | Только maintainers deploy prod |
| OIDC to cloud | Без long-lived cloud keys |
| Separate runners | Prod isolation |

---

## Shift-left в pipeline

Чем **раньше** fail — тем **дешевле**:

| Этап | Стоимость fix |
|------|---------------|
| IDE / pre-commit | Минуты |
| MR CI | Часы |
| Staging | Дни |
| Prod incident | $$$ + reputation |

---

## Типичные ошибки

1. Secrets в `.gitlab-ci.yml` plain text
2. `allow_failure: true` на security scan «чтобы не мешало»
3. Один pipeline без разделения dev/prod credentials
4. Deploy из fork MR без isolation

---

## Практика

1. Добавьте в учебный repo job `shell: echo ok`.
2. Добавьте stage `test` с lint (shellcheck / eslint).
3. Симулируйте fail: `exit 1` — посмотрите blocked MR.
4. (Опционально) docker build job на runner.

---

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

1. Чем CI отличается от CD?
2. Когда запускать image scan — до или после push?
3. Что такое quality gate?
4. Зачем masked CI variables?

---

## Дальше

→ [Terraform и GitOps](terraform-i-gitops.md)
