Ответ
Типичный жизненный цикл задачи в современном CI/CD-пайплайне:
-
Планирование и анализ:
- Задача создаётся в трекере (Jira, YouTrack).
- Проводится анализ требований, оценка сложности, проектирование (при необходимости).
-
Разработка:
- Создаётся ветка в Git (например,
feature/TASK-123). - Пишется код с соблюдением code style и best practices.
- Написанный код покрывается модульными (JUnit, TestNG) и, при необходимости, интеграционными тестами.
- Создаётся ветка в Git (например,
-
Ревью кода (Code Review):
- Разработчик создаёт Merge/Pull Request (MR/PR) в GitLab/GitHub/Bitbucket.
- Коллеги проверяют код на корректность, читаемость, безопасность и производительность.
- Вносятся правки по замечаниям.
-
Сборка и непрерывная интеграция (CI):
- При пуше в ветку или создании MR автоматически запускается пайплайн CI (Jenkins, GitLab CI, GitHub Actions).
- Этапы CI:
- Сборка проекта (Maven:
mvn clean compile, Gradle:gradle build). - Запуск всех тестов.
- Статический анализ кода (SonarQube).
- Создание артефакта (Docker-образ, JAR/WAR-файл).
- Сборка проекта (Maven:
-
Тестирование на стендах:
- Артефакт автоматически разворачивается на тестовом/стейджинг-окружении (с помощью Ansible, Kubernetes, Docker Compose).
- Выполняются ручные и автоматические интеграционные, регрессионные и нагрузочные тесты.
-
Деплой на продакшн (CD):
- После успешного тестирования и аппрува MR код мержится в основную ветку (
main,master). - Запускается пайплайн непрерывной доставки/развёртывания (CD).
- Стратегии деплоя: синий-зелёный (blue-green), канареечный (canary), rolling update — для минимизации downtime.
- Развёртывание выполняется инструментами оркестрации (Kubernetes
kubectl apply, Terraform) или конфигурационными менеджерами (Ansible).
- После успешного тестирования и аппрува MR код мержится в основную ветку (
-
Пост-релизный мониторинг:
- Мониторинг логов (ELK Stack, Loki), метрик (Prometheus/Grafana) и трассировки (Jaeger, Zipkin).
- Настройка алертов для быстрого реагирования на инциденты.
Пример минимального .gitlab-ci.yml:
stages:
- build
- test
- deploy-stage
- deploy-prod
build-job:
stage: build
script:
- mvn clean package
artifacts:
paths:
- target/*.jar
test-job:
stage: test
script:
- mvn test
deploy-to-stage:
stage: deploy-stage
script:
- kubectl apply -f k8s/deployment-stage.yaml
only:
- main
deploy-to-prod:
stage: deploy-prod
script:
- kubectl apply -f k8s/deployment-prod.yaml
when: manual # Требует ручного подтверждения
only:
- main Ответ 18+ 🔞
Давай я тебе расскажу, как сейчас, в наше время, любая простая задача превращается в целый ебаный эпос с кучей этапов. Сидишь такой, думаешь: "О, кнопку поправить". А в итоге — мартышлюшка на неделю, блядь.
1. Планирование и разбор полётов. Сначала тебе в Jira прилетает таска. Ты её читаешь, и у тебя волнение ебать: "Чё они тут написали, в рот меня чих-пых?". Надо оценить, спроектировать. Иногда кажется, что проще самому всё переписать, чем вникнуть в их "хотелки".
2. Кодинг, он же разработка.
Ну тут вроде всё ясно. Отпочковываешь от главной ветки свою — feature/TASK-777. И начинаешь писать. Главное — не забыть тесты наклепать, а то потом на ревью прилетит: "А где покрытие, пидарас шерстяной?".
3. Ревью кода, или "убейте меня". Создаёшь Merge Request. И ждёшь. Ждёшь, пока твои коллеги, эти дохуя умные, начнут ковыряться в каждой строчке. "А почему тут так? А можно ли вот эдак? О, я нашёл опечатку!". Чувствуешь себя так, будто стоишь голый перед комиссией. Иногда хочется просто впендюрить им всем и закрыть таску, но нет, процесс, блядь.
4. Непрерывная интеграция (CI).
Ты только отправил код — а тебе уже Jenkins или GitLab CI пишет: "Э, сабака сука, сборка упала!". И начинается: mvn clean compile, тесты, статический анализ в SonarQube. Если всё зелёное — выдохнул. Если красное — ну всё, пиздец, сиди ищи, где накосячил. Овердохуища работы из-за одной пропущенной скобки.
5. Тестирование на стендах. Твой красивый артефакт (jar-ник или docker-образ) выкатывают на тестовый сервер. Там его начинают мучать автотестами, а потом подключаются тестировщики. И вот он, звёздный час: "Нашёл баг!". И ты такой: "Да не может быть! У меня же всё работало!". А оказывается, забыл про какую-то ебучую кодировку.
6. Деплой на продакшн (CD).
Всё, таска прошла огонь, воду и медные трубы. Мержим в мастер. Запускается пайплайн деплоя. Тут уже страшно, блядь. Особенно если стратегия какая-нибудь хитрая — blue-green или canary. Сидишь, смотришь на графики, как будто сапёр. Один неверный kubectl apply -f и ты накрылся медным тазом, уронив продакшн.
7. Мониторинг после релиза. Расслабляться рано. Теперь надо следить за логами, метриками, алертами. Если что-то пошло не так — тебе сразу в слаке: "@all, всё ебнулось!". И ты уже бежишь, как угорелый, откатывать или фиксить.
А вот, смотри, как это всё в конфиге выглядит. Просто, аж жуть берет.
stages:
- build
- test
- deploy-stage
- deploy-prod
build-job:
stage: build
script:
- mvn clean package
artifacts:
paths:
- target/*.jar
test-job:
stage: test
script:
- mvn test
deploy-to-stage:
stage: deploy-stage
script:
- kubectl apply -f k8s/deployment-stage.yaml
only:
- main
deploy-to-prod:
stage: deploy-prod
script:
- kubectl apply -f k8s/deployment-prod.yaml
when: manual # Требует ручного подтверждения
only:
- main
Видишь эту строчку when: manual? Это единственный момент, где ты можешь остановиться, выдохнуть и подумать: "А точно ли я всё проверил, или сейчас будет пизда?". И после этого всё равно нажимаешь кнопку. Потому что доверия ебать ноль, но деплоить-то надо.
Вот и весь сказ, блядь. Из кнопки — целая одиссея. Красота, ёпта.