Какие использовал инструменты для анализа кода

«Какие использовал инструменты для анализа кода» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В DevOps-контексте анализ кода — это не только код приложения, но и код инфраструктуры, конфигурации и сборки. Я интегрирую эти проверки в CI/CD пайплайн.

1. Анализ кода инфраструктуры (IaC):

  • Terraform: Использую встроенную команду terraform validate для проверки синтаксиса и terraform plan для предварительного просмотра изменений.
  • Checkov и Tfsec: Для статического анализа безопасности. Они проверяют Terraform-код на соответствие best practices (например, незашифрованные S3 buckets, открытые security groups).
    # Интеграция Checkov в пайплайн
    - checkov --directory ./terraform --soft-fail

2. Анализ конфигураций и манифестов:

  • YAML/JSON lint: Например, yamllint для проверки синтаксиса Kubernetes манифестов и файлов конфигурации.
  • kubeval и kubeconform: Для валидации Kubernetes YAML-манифестов на соответствие схеме Kubernetes API.
    kubeval --strict my-deployment.yaml

3. Анализ Dockerfile:

  • Hadolint: Статический анализатор для Dockerfile. Он проверяет на наличие антипаттернов, рекомендует использовать конкретные теги образов, избегать запуска от root.
    # Hadolint укажет на проблему в этом слое
    RUN apt-get update && apt-get install -y package && rm -rf /var/lib/apt/lists/*

4. Анализ зависимостей и уязвимостей:

  • Trivy: Универсальный инструмент, который использую не только для образов, но и для сканирования файлов зависимостей (например, package-lock.json, Gemfile.lock) прямо в репозитории.
  • GitLab Dependency Scanning / Container Scanning: Встроенные функции GitLab CI, которые автоматически запускают сканирование при изменении соответствующих файлов.

5. Статический анализ кода приложения (в контексте сборки): Хотя это часто ответственность разработчиков, в пайплайне я настраиваю запуск линтеров, специфичных для языка проекта (например, golangci-lint для Go, ESLint для JavaScript), чтобы обеспечить единый стандарт кода перед сборкой образа.

Все эти проверки запускаются на ранних стадиях CI-пайплайна (например, в stage test), что предотвращает попадание проблемного кода в дальнейшие этапы сборки и деплоя.