Ответ
Типичный CI/CD пайплайн для Java-приложения включает автоматизацию сборки, тестирования и развертывания.
Этапы пайплайна (на примере GitLab CI):
-
Сборка (Build):
build: stage: build script: - mvn clean compile artifacts: paths: - target/ -
Тестирование (Test):
test: stage: test script: - mvn test dependencies: - build -
Статический анализ кода (Code Quality):
sonarqube-check: stage: test script: - mvn sonar:sonar -
Создание артефакта (Package):
package: stage: package script: - mvn package -DskipTests artifacts: paths: - target/*.jar -
Создание Docker-образа:
docker-build: stage: package script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -
Деплой в staging-окружение:
deploy-to-staging: stage: deploy script: - echo "Deploying to Kubernetes..." - kubectl set image deployment/myapp myapp=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n staging environment: name: staging only: - main # Автоматический деплой при мерже в main -
Деплой в production (ручной или с approval):
deploy-to-prod: stage: deploy script: - kubectl apply -f k8s/production.yaml environment: name: production when: manual # Требует ручного запуска
Ключевые практики:
- Инфраструктура как код (IaC): Конфигурации Kubernetes (Deployment, Service) хранятся в репозитории.
- Неизменяемые артефакты: Версия образа определяется хэшем коммита (
$CI_COMMIT_SHA). - Откат (Rollback): Простой откат через развертывание предыдущего Docker-тега.
- Мониторинг: Интеграция с Prometheus/Grafana для отслеживания здоровья после деплоя.
Ответ 18+ 🔞
А, ну вот, смотри, классика жанра — как этот ваш Java-приклад запихнуть в трубу CI/CD, чтобы оно само собиралось, тестировалось и ехало на сервера, пока ты кофе пьёшь. Сейчас разложу по полочкам, но с приправами.
Этапы этой нашей волшебной конвейерной ленты (возьмём для примера GitLab CI, ибо популярно):
-
Сборка (Build): Ну, тут всё просто, как три копейки. Берём и компилим.
build: stage: build script: - mvn clean compile artifacts: paths: - target/Собрали — положили артефакты в карман, чтобы на следующем этапе не начинать с пустого места.
-
Тестирование (Test): А вот тут уже интереснее. Запускаем тесты. Если они все зелёные — молодцы. Если нет — ну, ёпта, иди фикси, пока тебя не зафиксили.
test: stage: test script: - mvn test dependencies: - buildЗависим от сборки, логично же. Не из воздуха же тесты запускать.
-
Статический анализ кода (Code Quality): Это когда умный дядька-робот (типа SonarQube) приходит и говорит: «А у тебя тут, дружок, код пахнет, как старые носки в спортзале». Полезная, блядь, вещь, хоть и нервы треплет.
sonarqube-check: stage: test script: - mvn sonar:sonar -
Создание артефакта (Package): Теперь упаковываем наше добро в красивую банку — JAR-файл.
package: stage: package script: - mvn package -DskipTests artifacts: paths: - target/*.jarТесты уже прогнали, поэтому
-DskipTests, чтобы время зря не терять. -
Создание Docker-образа: А теперь — магия! Засовываем нашу банку в контейнер. Собираем образ, тэгируем его хэшем коммита (чтобы потом не было мухлежа) и пихаем в registry.
docker-build: stage: package script: - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA$CI_COMMIT_SHA— это наш золотой ключик. Один коммит — один неизменяемый образ. Хули тут менять-то? -
Деплой в staging-окружение: Выехали! Катим свежий образ на тестовый стенд (staging). Обычно это происходит автоматом при мерже в основную ветку.
deploy-to-staging: stage: deploy script: - echo "Deploying to Kubernetes..." - kubectl set image deployment/myapp myapp=$CI_REGISTRY_IMAGE:$CI_COMMIT_SHA -n staging environment: name: staging only: - mainСказали куберу: «Слушай сюда, дружище, замени-ка под капотом у деплоймента
myappобраз на вот этот, новенький». И он послушно меняет. -
Деплой в production (ручной или с approval): А вот это уже серьёзно, детка. На прод — только с санкции. Поэтому ставим
when: manual.deploy-to-prod: stage: deploy script: - kubectl apply -f k8s/production.yaml environment: name: production when: manualСидишь, смотришь на staging, всё ли работает. Потом глубоко вздыхаешь, крестишься и жмёшь кнопочку. Волнение, блядь, пиздец.
А теперь, блядь, ключевые практики, без которых это всё — просто цирк:
- Инфраструктура как код (IaC): Все эти твои кубернетисовские
deployment.yamlиservice.yamlдолжны лежать в том же гите, рядом с кодом. Чтобы не было вот этого: «А на моей машине работало!» — «Ага, а конфиги у тебя в голове, да?». - Неизменяемые артефакты: Как уже говорил — один коммит, один тег образа. Никаких «ой, я тут на проде конфиг поправил прямо в поде». Нахуй такие практики, они от лукавого.
- Откат (Rollback): Всё просто, как двери. Если на прод накатилась хуйня — говоришь куберу: «Верни-ка, браток, образ на предыдущий тег». И он, сука, возвращает. Красота.
- Мониторинг: После деплоя не убегаешь пить пиво. Сначала смотришь в Grafana или куда ты там смотришь — не полетели ли метрики в тартарары. Потом уже пиво.
Вот и вся нехитрая магия. Сделал раз — и потом только кнопки жать. Ах да, и молиться, чтобы интернет не отрубился в момент docker push.