Минимальный CI/CD: каждый merge в main → артефакт → staging → manual/auto prod. Без этого «деploy вручную по SSH» неизбежно ломает прод.

Stages
- lint + typecheck
- unit/integration tests
- build docker images
- deploy (ssh/k8s/swarm)
- smoke test
Secrets
CI variables, не в repo. Rotate keys quarterly.
Environments
- PR → preview optional
- main → staging
- tag → production

Чеклист
- Failed deploy alerts
- Rollback = previous image tag
- DB migrate job separate step
Минимальный pipeline
MR: lint + unit. main: + integration + docker build + deploy staging. tag v*: deploy prod + smoke script.
Артеfact — immutable image digest, не «latest» на prod.
Deploy audit trail
Каждый prod deploy привязан к git tag, образу и человеку/боту, нажавшему approve. Без этого post-mortem «кто выкатил» занимает часы вместо минут.
GitLab CI vs GitHub Actions
GitLab: stages в .gitlab-ci.yml, registry встроен, deploy через SSH или K8s agent. GitHub: reusable workflows, environments с protection rules на prod.
Общее: cache node_modules/pnpm store, parallel lint+test, docker buildx с layer cache. Smoke после deploy — curl health + 2–3 critical URL; без smoke «зелёный pipeline» не значит рабочий prod.
Rollback и migrate job
Deploy prod = pull previous image tag + run down-only migrations только если contract-safe. Миграции БД — отдельный manual/approved job, не в том же step что swap контейнера без review.
Храните последние 5 image digest в release notes — rollback за 2 минуты, не за 2 часа сборки.
С чего начать автоматизацию
- Шаг 1: lint + test на каждый PR
- Шаг 2: docker build на main
- Шаг 3: deploy staging по merge
- Шаг 4: prod по tag + smoke script