Ответ
CI/CD пайплайн — это автоматизированная последовательность шагов, через которые проходит код от коммита до развертывания в production. Его цель — обеспечить быструю, надежную и повторяемую доставку изменений.
Типичные стадии пайплайна:
-
Сборка (Build)
- Компиляция исходного кода (если необходимо) и сборка артефактов (например, Docker-образов, JAR/WAR-файлов).
- Инструменты: Maven, Gradle, npm,
docker build. - Пример команды:
mvn clean packageилиdocker build -t my-app:latest .
-
Статический анализ кода (Code Analysis)
- Проверка кода на соответствие стандартам, поиск уязвимостей и "запахов" кода (code smells).
- Инструменты: SonarQube, ESLint, Pylint, Checkstyle.
-
Тестирование (Testing) — выполняется в несколько этапов:
- Модульные тесты (Unit Tests): Быстрые тесты отдельных компонентов.
- Интеграционные тесты (Integration Tests): Проверка взаимодействия с БД, внешними API.
- E2E-тесты (End-to-End Tests): Автоматизированное тестирование полного пользовательского сценария.
- Инструменты: JUnit, pytest, Jest, Selenium, Cypress.
-
Сборка и публикация артефакта (Artifact Publishing)
- Загрузка готового артефакта (например, Docker-образа) в реестр для последующего использования.
- Инструменты: Docker Hub, AWS ECR, Google Container Registry, Nexus.
- Пример команды:
docker push my-registry.com/my-app:${BUILD_NUMBER}
-
Развертывание (Deployment)
- Деплой в staging-окружение: Для финального ручного или автоматического тестирования.
- Деплой в production-окружение: Часто с использованием стратегий для минимизации downtime (blue-green, canary).
- Инструменты: Kubernetes (
kubectl apply), AWS CodeDeploy, Ansible, Terraform.
Пример конфигурации пайплайна в GitLab CI (.gitlab-ci.yml):
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- echo "Собираем приложение..."
- mvn clean package
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
test-job:
stage: test
script:
- echo "Запускаем тесты..."
- mvn test
- npm run test:e2e
deploy-staging:
stage: deploy
script:
- echo "Деплоим в staging..."
- kubectl set image deployment/my-app-staging app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
environment:
name: staging
only:
- main Ответ 18+ 🔞
А, вот эта ваша CI/CD хрень, ну давайте разберёмся, что это за зверь такой, а то все умные слова кидают, а на деле-то пиздец как просто, если не загоняться.
Представьте, что вы написали код. И вместо того, чтобы вручную, как последний лох, бегать по серверам, копировать файлы и молиться, чтобы всё не упало, вы настраиваете конвейер. Это такая автоматическая дорожка, по которой ваш код катится от вашего коммита прямо в продакшн, и по пути его пинают, проверяют и тестируют, чтобы он не был кривым. Цель — не обосраться при выпуске новой фичи и не разбудить админа в три ночи. Всё быстро, надёжно и по сто раз одинаково.
Итак, этапы этого аттракциона:
-
Сборка (Build) Тут ваш код, этот набор букв и цифр, превращают во что-то осязаемое. Собирают, компилируют, если надо, пакуют в Docker-образ или какой-нибудь JAR-файл. Инструменты — Maven, Gradle, ну или
docker build, куда ж без него. Примерно так:mvn clean packageилиdocker build -t my-app:latest .— и поехали. -
Статический анализ кода (Code Analysis) А вот тут начинается самое интересное. Код прогоняют через всякие сканеры, которые ищут, где вы накосячили, где уязвимости оставили или просто написали хуйню, которую потом поддерживать — пиздец. SonarQube, например, любит указывать на ваши косяки. В общем, профилактический разбор полётов.
-
Тестирование (Testing) О, ебать, вот где собака порылась! Тесты идут этапами, как обряд посвящения.
- Модульные (Unit): Быстрые, как удар током, проверяют каждую мелкую функцию. JUnit, pytest — ваши лучшие друзья на этом этапе.
- Интеграционные: Тут уже проверяют, как ваша штука общается с базой данных или другими сервисами. Чтобы не вышло, что вы всё написали, а оно с реальным миром не дружит.
- E2E (сквозные): Это уже полный пиздец, симуляция действий пользователя. Selenium или Cypress тупо кликают по интерфейсу, как обезьяна, и смотрят, не развалится ли всё. Если пройдёт — уже хорошо.
-
Публикация артефакта (Artifact Publishing) Всё, что собрали и проверили, надо куда-то сложить, чтобы потом взять и использовать. Docker-образ заливают в реестр (Docker Hub, ECR), какой-нибудь пакет — в Nexus. Команда проще некуда:
docker push my-registry.com/my-app:${BUILD_NUMBER}. Положил и забыл. -
Развертывание (Deployment) Финальный акт! Сначала обычно выкатывают на тестовое окружение (staging), чтобы ещё раз всё потрогать руками. А уж потом — в бой, в продакшн. Умные ребята делают это с хитрожопыми стратегиями вроде blue-green или canary, чтобы если что — откатиться быстро и без боли. Инструменты — Kubernetes (
kubectl apply), Ansible, Terraform — кто во что горазд.
А вот как это может выглядеть в конфиге GitLab CI (.gitlab-ci.yml). Смотрите, вроде страшно, а на деле — обычный YAML:
stages:
- build
- test
- deploy
build-job:
stage: build
script:
- echo "Собираем приложение..."
- mvn clean package
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
test-job:
stage: test
script:
- echo "Запускаем тесты..."
- mvn test
- npm run test:e2e
deploy-staging:
stage: deploy
script:
- echo "Деплоим в staging..."
- kubectl set image deployment/my-app-staging app=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
environment:
name: staging
only:
- main
Вот и вся магия. Настроил один раз эту кухню — и потом только пушишь код, а он сам бежит по этому конвейеру, как хороший солдат. Главное, чтобы тесты не начали фейлиться, а то придётся разбираться, и тут уже веселье начинается, ёпта.