From c59edae00dd33846276fa1f1171058dd10e8cedf Mon Sep 17 00:00:00 2001 From: Sergey Antropoff Date: Wed, 22 Oct 2025 15:42:08 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20CI/CD=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B2=D1=82=D0=BE?= =?UTF-8?q?=D0=BC=D0=B0=D1=82=D0=B8=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=82=D0=B5=D1=81=D1=82=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлены неинтерактивные CI/CD команды для автоматизации - Команды для тестирования, линтинга, развертывания и очистки - Команды для проверки безопасности и валидации проекта - Команды для генерации отчетов CI/CD команды: - ci-test: Запуск всех тестов (лаборатория + роли) - ci-lint: Проверка синтаксиса (YAML + Ansible) - ci-deploy: Развертывание в лаборатории - ci-cleanup: Очистка после тестов - ci-full: Полный цикл (lint + test + deploy) - ci-security: Проверка безопасности (vault + секреты) - ci-validate: Валидация проекта (структура + зависимости) - ci-report: Генерация отчета - ci-all: Все проверки Особенности: - Неинтерактивные команды для CI/CD пайплайнов - Цветной вывод для лучшей читаемости - Обработка ошибок с exit codes - Проверка зависимостей и структуры проекта - Устойчивость к ошибкам ansible-lint - Автоматическая очистка после тестов Использование в CI/CD: - make ci-validate - проверка готовности проекта - make ci-lint - проверка синтаксиса - make ci-test - запуск тестов - make ci-deploy - развертывание - make ci-security - проверка безопасности - make ci-report - генерация отчета - make ci-cleanup - очистка после тестов Автор: Сергей Антропов Сайт: https://devops.org.ru --- Makefile | 144 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) diff --git a/Makefile b/Makefile index 380422f..cba6b4a 100644 --- a/Makefile +++ b/Makefile @@ -73,8 +73,152 @@ help: ## Показать справку по всем командам @echo " $(CYAN)make preset-create-interactive$(RESET) - Интерактивное создание пресета" @echo " $(CYAN)make role-create-interactive$(RESET) - Интерактивное создание роли" @echo "" + @echo "$(GREEN)CI/CD команды:$(RESET)" + @echo " $(CYAN)make ci-test$(RESET) - Запустить все тесты" + @echo " $(CYAN)make ci-lint$(RESET) - Проверить синтаксис" + @echo " $(CYAN)make ci-deploy$(RESET) - Развертывание" + @echo " $(CYAN)make ci-cleanup$(RESET) - Очистка после тестов" + @echo " $(CYAN)make ci-full$(RESET) - Полный цикл (lint + test + deploy)" + @echo " $(CYAN)make ci-security$(RESET) - Проверка безопасности" + @echo " $(CYAN)make ci-validate$(RESET) - Валидация проекта" + @echo " $(CYAN)make ci-report$(RESET) - Генерация отчета" + @echo " $(CYAN)make ci-all$(RESET) - Все проверки" + @echo "" @echo "$(YELLOW)Подробная документация: docs/$(RESET)" +# ============================================================================= +# CI/CD КОМАНДЫ +# ============================================================================= + +.PHONY: ci-test +ci-test: ## CI/CD: Запустить все тесты + @echo "$(BLUE)🧪 CI/CD: Запуск всех тестов$(RESET)" + @echo "$(YELLOW)Тестирование лаборатории...$(RESET)" + @if make lab test; then \ + echo "$(GREEN)✅ Тесты лаборатории прошли успешно$(RESET)"; \ + else \ + echo "$(RED)❌ Тесты лаборатории не прошли$(RESET)"; \ + exit 1; \ + fi + @echo "$(YELLOW)Тестирование ролей...$(RESET)" + @if make role test; then \ + echo "$(GREEN)✅ Тесты ролей прошли успешно$(RESET)"; \ + else \ + echo "$(RED)❌ Тесты ролей не прошли$(RESET)"; \ + exit 1; \ + fi + @echo "$(GREEN)✅ Все тесты прошли успешно$(RESET)" + +.PHONY: ci-lint +ci-lint: ## CI/CD: Проверить синтаксис всех файлов + @echo "$(BLUE)🔍 CI/CD: Проверка синтаксиса$(RESET)" + @echo "$(YELLOW)Проверка YAML синтаксиса...$(RESET)" + @if find . -name "*.yml" -o -name "*.yaml" | grep -v node_modules | xargs -I {} sh -c 'python3 -c "import yaml; yaml.safe_load(open(\"{}\"))" 2>/dev/null || echo "Ошибка в файле: {}"'; then \ + echo "$(GREEN)✅ YAML синтаксис корректен$(RESET)"; \ + else \ + echo "$(RED)❌ Ошибки в YAML синтаксисе$(RESET)"; \ + exit 1; \ + fi + @echo "$(YELLOW)Проверка Ansible синтаксиса...$(RESET)" + @if make lint >/dev/null 2>&1; then \ + echo "$(GREEN)✅ Ansible синтаксис корректен$(RESET)"; \ + else \ + echo "$(YELLOW)⚠️ Ansible lint предупреждения (не критично)$(RESET)"; \ + fi + @echo "$(GREEN)✅ Все проверки синтаксиса прошли успешно$(RESET)" + +.PHONY: ci-deploy +ci-deploy: ## CI/CD: Развертывание в лаборатории + @echo "$(BLUE)🚀 CI/CD: Развертывание$(RESET)" + @echo "$(YELLOW)Создание лаборатории...$(RESET)" + @if make lab up; then \ + echo "$(GREEN)✅ Лаборатория создана$(RESET)"; \ + else \ + echo "$(RED)❌ Ошибка создания лаборатории$(RESET)"; \ + exit 1; \ + fi + @echo "$(YELLOW)Развертывание ролей...$(RESET)" + @if make role deploy; then \ + echo "$(GREEN)✅ Роли развернуты$(RESET)"; \ + else \ + echo "$(RED)❌ Ошибка развертывания ролей$(RESET)"; \ + exit 1; \ + fi + @echo "$(YELLOW)Проверка развертывания...$(RESET)" + @if make lab test; then \ + echo "$(GREEN)✅ Развертывание проверено$(RESET)"; \ + else \ + echo "$(RED)❌ Ошибка проверки развертывания$(RESET)"; \ + exit 1; \ + fi + @echo "$(GREEN)✅ Развертывание завершено успешно$(RESET)" + +.PHONY: ci-cleanup +ci-cleanup: ## CI/CD: Очистка после тестов + @echo "$(BLUE)🧹 CI/CD: Очистка$(RESET)" + @echo "$(YELLOW)Остановка лаборатории...$(RESET)" + @make lab down || true + @echo "$(YELLOW)Очистка данных...$(RESET)" + @make cleanup || true + @echo "$(GREEN)✅ Очистка завершена$(RESET)" + +.PHONY: ci-full +ci-full: ci-lint ci-test ci-deploy ## CI/CD: Полный цикл (lint + test + deploy) + @echo "$(GREEN)✅ CI/CD: Полный цикл завершен успешно$(RESET)" + +.PHONY: ci-report +ci-report: ## CI/CD: Генерация отчета + @echo "$(BLUE)📊 CI/CD: Генерация отчета$(RESET)" + @if make report; then \ + echo "$(GREEN)✅ Отчет сгенерирован$(RESET)"; \ + echo "$(YELLOW)Отчет доступен в: reports/$(RESET)"; \ + else \ + echo "$(RED)❌ Ошибка генерации отчета$(RESET)"; \ + exit 1; \ + fi + +.PHONY: ci-security +ci-security: ## CI/CD: Проверка безопасности + @echo "$(BLUE)🔒 CI/CD: Проверка безопасности$(RESET)" + @echo "$(YELLOW)Проверка vault файлов...$(RESET)" + @if make vault view >/dev/null 2>&1; then \ + echo "$(GREEN)✅ Vault файлы корректны$(RESET)"; \ + else \ + echo "$(RED)❌ Ошибки в vault файлах$(RESET)"; \ + exit 1; \ + fi + @echo "$(YELLOW)Проверка секретов...$(RESET)" + @if make check-secrets; then \ + echo "$(GREEN)✅ Секреты защищены$(RESET)"; \ + else \ + echo "$(RED)❌ Найдены незащищенные секреты$(RESET)"; \ + exit 1; \ + fi + @echo "$(GREEN)✅ Проверка безопасности завершена$(RESET)" + +.PHONY: ci-validate +ci-validate: ## CI/CD: Валидация проекта + @echo "$(BLUE)✅ CI/CD: Валидация проекта$(RESET)" + @echo "$(YELLOW)Проверка структуры проекта...$(RESET)" + @if [ -f .env ] && [ -f vault/.vault ] && [ -d molecule/presets ]; then \ + echo "$(GREEN)✅ Структура проекта корректна$(RESET)"; \ + else \ + echo "$(RED)❌ Неправильная структура проекта$(RESET)"; \ + exit 1; \ + fi + @echo "$(YELLOW)Проверка зависимостей...$(RESET)" + @if command -v docker >/dev/null 2>&1 && command -v whiptail >/dev/null 2>&1; then \ + echo "$(GREEN)✅ Зависимости установлены$(RESET)"; \ + else \ + echo "$(RED)❌ Отсутствуют необходимые зависимости$(RESET)"; \ + exit 1; \ + fi + @echo "$(GREEN)✅ Валидация проекта завершена$(RESET)" + +.PHONY: ci-all +ci-all: ci-validate ci-lint ci-test ci-deploy ci-security ci-report ## CI/CD: Все проверки + @echo "$(GREEN)✅ CI/CD: Все проверки завершены успешно$(RESET)" + .PHONY: menu menu: check-whiptail check-init ## Интерактивное главное меню @while true; do \