Ошибка Sonar Scanner: 'Не файл или каталог' в Bitbucket Pipeline
Устраните ошибку SonarScanner 'Не файл или каталог' в Bitbucket Pipeline: правильная настройка монтирования томов и путей для успешного анализа кода.
Ошибка Sonar Scanner: «Не файл и не каталог» при настройке локальной VM с Bitbucket Pipeline
Я настраиваю CI/CD pipeline, используя собственный Bitbucket runner на локальной виртуальной машине VMware. На VM установлены как сервер SonarQube, так и Sonar Scanner, но при запуске сканирования появляется ошибка «это не файл или каталог».
Я пробовал вызывать сканер с полным путем и явно через bash, но результат тот же.
Bitbucket pipeline configuration
image: node:22.18.0
backend_runner: &backend_runner
runs-on:
- self.hosted
- linux
- frontend
definitions:
caches:
node: ~/.npm
trivy: ~/.cache/trivy
steps:
- step: &Install-dependencies
<<: *backend_runner
name: Installing Dependencies
caches:
- node
script:
- npm install
- step: &sonar
<<: *backend_runner
name: "SonarQube Scan"
image: sonarsource/sonar-scanner-cli:latest
script:
- echo "Starting SonarQube scan..."
- sonar-scanner -Dsonar.login="$SONAR_TOKEN"
- step: &docker_build_scan_push
<<: *backend_runner
caches:
- trivy
name: docker Image build + push + scan
script:
- chmod +x Scripts/dbe_push.sh
- bash Scripts/dbe_push.sh
artifacts:
- Reports/**
pipelines:
branches:
dev_master:
- step: *Install-dependencies
- step: *sonar
- step: *docker_build_scan_push
sonar‑project.properties (root directory)
sonar.projectKey=tnbe
sonar.projectName=TNBE
sonar.sources=.
sonar.host.url=http://localhost:9000
Что может вызывать ошибку «не файл и не каталог» при работе Sonar Scanner в этой конфигурации, и как я могу это исправить?
Ошибка «не является файлом или каталогом» при работе Sonar Scanner в локальной VM обычно возникает из‑за проблем с разрешением путей между средой Bitbucket Pipeline и исходными файлами. На основе вашей конфигурации наиболее вероятные причины и решения:
Основная проблема – контейнер SonarScanner Docker не может получить доступ к исходным файлам проекта, потому что они не смонтированы в контейнер.
Содержание
- Распространённые причины ошибки «Не является файлом или каталогом»
- Немедленные решения для вашего окружения
- Расширенные варианты конфигурации
- Шаги устранения неполадок
- Профилактические меры
Распространённые причины ошибки «Не является файлом или каталогом»
Несоответствие рабочего каталога
SonarScanner запускается внутри Docker‑контейнера, но может находиться не в том каталоге, где расположены исходные файлы. Согласно документации SonarQube, если анализ начинается из одного места, а файлы находятся в другом, необходимо правильно настроить базовый каталог проекта.
Проблемы с монтированием томов Docker
В текущей конфигурации pipeline каталог исходных файлов не монтируется в контейнер сканера. Как показано в обсуждениях Stack Overflow, это распространённая проблема, когда контейнер не может получить доступ к файлам хоста.
Проблемы с разрешением путей
Конфигурация sonar.sources=. может не разрешаться корректно в контексте Docker‑контейнера. Относительный путь . относится к рабочему каталогу контейнера, а не к корню проекта на хосте VM.
Немедленные решения для вашего окружения
Решение 1: Смонтировать каталог исходных файлов в контейнер
Измените шаг сканирования Sonar, чтобы смонтировать текущий каталог в контейнер:
- step: &sonar
<<: *backend_runner
name: "SonarQube Scan"
image: sonarsource/sonar-scanner-cli:latest
script:
- echo "Starting SonarQube scan..."
- sonar-scanner -Dsonar.login="$SONAR_TOKEN"
volumes:
- .:/usr/src # Mount current directory to /usr/src in container
Решение 2: Явно задать рабочий каталог
Добавьте шаг, чтобы перейти в правильный каталог перед запуском сканера:
- step: &sonar
<<: *backend_runner
name: "SonarQube Scan"
image: sonarsource/sonar-scanner-cli:latest
script:
- echo "Starting SonarQube scan..."
- cd /usr/src # Change to mounted directory
- sonar-scanner -Dsonar.login="$SONAR_TOKEN"
volumes:
- .:/usr/src
Решение 3: Обновить sonar‑project.properties
Измените файл свойств, чтобы использовать абсолютные пути и указать базовый каталог проекта:
sonar.projectKey=tnbe
sonar.projectName=TNBE
sonar.projectBaseDir=/usr/src # Container path where files are mounted
sonar.sources=.
sonar.host.url=http://localhost:9000
Расширенные варианты конфигурации
Использование sonar.projectBaseDir
Как рекомендовано в документации SonarQube, если ваш анализ начинается из другого места, чем исходные файлы, явно задайте базовый каталог проекта:
sonar.projectBaseDir=/path/to/your/project
sonar.sources=src
Конфигурация специфичная для Docker
Для Docker‑окружения документация SonarSource предлагает:
- step: &sonar
<<: *backend_runner
name: "SonarQube Scan"
image: sonarsource/sonar-scanner-cli:latest
script:
- sonar-scanner \
-Dsonar.login="$SONAR_TOKEN" \
-Dsonar.projectBaseDir=/usr/src \
-Dsonar.sources=.
volumes:
- .:/usr/src
- ~/.sonar/cache:/root/.sonar/cache # Cache for faster scans
Шаги устранения неполадок
Шаг 1: Проверить доступ к файлам
Перед запуском сканера убедитесь, что файлы доступны в контейнере:
- step: &debug-access
<<: *backend_runner
name: "Debug File Access"
image: sonarsource/sonar-scanner-cli:latest
script:
- echo "Checking directory contents..."
- ls -la /usr/src/
- echo "Verifying source files..."
- find /usr/src -name "*.js" -o -name "*.ts" | head -10
volumes:
- .:/usr/src
Шаг 2: Проверить конфигурацию сканера
Запустите сканер в режиме отладки, чтобы увидеть подробные логи:
- step: &sonar-debug
<<: *backend_runner
name: "SonarQube Scan Debug"
image: sonarsource/sonar-scanner-cli:latest
script:
- echo "Starting SonarQube scan with debug mode..."
- sonar-scanner -Dsonar.login="$SONAR_TOKEN" -X
volumes:
- .:/usr/src
Шаг 3: Тестировать простую команду
Проверьте базовые операции с файлами в контейнере:
- step: &test-container
<<: *backend_runner
name: "Test Container Access"
image: alpine:latest
script:
- echo "Testing basic container operations..."
- apk add --no-cache bash
- bash -c "ls -la /usr/src/"
volumes:
- .:/usr/src
Профилактические меры
Конфигурация кэша
Добавьте кэш Sonar, чтобы ускорить последующие сканирования и избежать повторной загрузки анализаторов языков:
definitions:
caches:
node: ~/.npm
trivy: ~/.cache/trivy
sonar: ~/.sonar/cache # Add Sonar cache
Полная глубина клонирования
Убедитесь, что ваш pipeline клонирует полный репозиторий, что необходимо SonarScanner для корректного назначения проблем:
pipelines:
branches:
dev_master:
- step:
name: Clone Repository
script:
- git clone --depth 1 https://your-repo-url.git .
# OR for full history:
- git clone https://your-repo-url.git .
Конфигурация, специфичная для окружения
Создайте конфигурации, специфичные для каждого окружения:
# For local development
sonar.projectBaseDir=./
sonar.sources=src
# For Docker/CI
sonar.projectBaseDir=/usr/src
sonar.sources=.
Источники
- SonarQube Documentation - Scanner Configuration
- Stack Overflow - Sonar Scanner Docker Path Issues
- Community SonarSource - Docker Scanner Configuration
- Atlassian Documentation - Bitbucket Pipeline Caching
Вывод
Ошибка «не является файлом или каталогом» в настройке SonarScanner в основном вызвана некорректным монтированием файлов между Docker‑контейнером и хост‑VM. Чтобы решить проблему:
- Смонтируйте каталог исходных файлов в контейнер сканера через
volumes. - Установите рабочий каталог внутри контейнера, указывая на смонтированное расположение.
- Обновите sonar‑project.properties, чтобы использовать абсолютные пути контейнера.
- Добавьте шаги отладки, чтобы проверить доступ к файлам перед запуском сканера.
- Внедрите кэширование для повышения производительности и предотвращения повторной загрузки анализаторов.
Следуя этим шагам, SonarScanner сможет корректно находить и анализировать исходные файлы в среде Bitbucket Pipeline.