Другое

Ошибка 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

yaml
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)

properties
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, чтобы смонтировать текущий каталог в контейнер:

yaml
- 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: Явно задать рабочий каталог

Добавьте шаг, чтобы перейти в правильный каталог перед запуском сканера:

yaml
- 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

Измените файл свойств, чтобы использовать абсолютные пути и указать базовый каталог проекта:

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, если ваш анализ начинается из другого места, чем исходные файлы, явно задайте базовый каталог проекта:

properties
sonar.projectBaseDir=/path/to/your/project
sonar.sources=src

Конфигурация специфичная для Docker

Для Docker‑окружения документация SonarSource предлагает:

yaml
- 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: Проверить доступ к файлам

Перед запуском сканера убедитесь, что файлы доступны в контейнере:

yaml
- 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: Проверить конфигурацию сканера

Запустите сканер в режиме отладки, чтобы увидеть подробные логи:

yaml
- 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: Тестировать простую команду

Проверьте базовые операции с файлами в контейнере:

yaml
- 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, чтобы ускорить последующие сканирования и избежать повторной загрузки анализаторов языков:

yaml
definitions:
  caches:
    node: ~/.npm
    trivy: ~/.cache/trivy
    sonar: ~/.sonar/cache  # Add Sonar cache

Полная глубина клонирования

Убедитесь, что ваш pipeline клонирует полный репозиторий, что необходимо SonarScanner для корректного назначения проблем:

yaml
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 .

Конфигурация, специфичная для окружения

Создайте конфигурации, специфичные для каждого окружения:

yaml
# For local development
sonar.projectBaseDir=./
sonar.sources=src

# For Docker/CI
sonar.projectBaseDir=/usr/src
sonar.sources=.

Источники

  1. SonarQube Documentation - Scanner Configuration
  2. Stack Overflow - Sonar Scanner Docker Path Issues
  3. Community SonarSource - Docker Scanner Configuration
  4. Atlassian Documentation - Bitbucket Pipeline Caching

Вывод

Ошибка «не является файлом или каталогом» в настройке SonarScanner в основном вызвана некорректным монтированием файлов между Docker‑контейнером и хост‑VM. Чтобы решить проблему:

  1. Смонтируйте каталог исходных файлов в контейнер сканера через volumes.
  2. Установите рабочий каталог внутри контейнера, указывая на смонтированное расположение.
  3. Обновите sonar‑project.properties, чтобы использовать абсолютные пути контейнера.
  4. Добавьте шаги отладки, чтобы проверить доступ к файлам перед запуском сканера.
  5. Внедрите кэширование для повышения производительности и предотвращения повторной загрузки анализаторов.

Следуя этим шагам, SonarScanner сможет корректно находить и анализировать исходные файлы в среде Bitbucket Pipeline.

Авторы
Проверено модерацией
Модерация