name: sonar # Анализ SonarCloud вместе с покрытием: один прогон собирает решение под сканером, гоняет тесты # и отправляет результат. Только push в main — декорация pull request'ов у SonarCloud завязана # на GitHub/GitLab, из Gitea она не работает, и анализ PR только засорял бы ветки в проекте. on: push: branches: [main] workflow_dispatch: jobs: analyze: runs-on: ubuntu-latest env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} SONAR_HOST: https://sonarcloud.io SONAR_PROJECT_KEY: mrleo1nid_telewave SONAR_ORGANIZATION: mrleo1nid steps: - uses: actions/checkout@v4 with: # Полная история — иначе Sonar не сопоставит изменения с авторами и «новым кодом». fetch-depth: 0 # Сканер — java-приложение, на runner-образе Java может не оказаться. - uses: actions/setup-java@v4 if: env.SONAR_TOKEN != '' with: distribution: temurin java-version: 21 - uses: actions/setup-dotnet@v4 if: env.SONAR_TOKEN != '' with: dotnet-version: 10.0.x - name: Install scanner if: env.SONAR_TOKEN != '' run: dotnet tool install --global dotnet-sonarscanner # Сканер запускается из корня репозитория, а не из backend/: так в анализ попадает и фронт. - name: Begin analysis if: env.SONAR_TOKEN != '' run: | export PATH="$PATH:$HOME/.dotnet/tools" dotnet sonarscanner begin \ /k:"$SONAR_PROJECT_KEY" \ /o:"$SONAR_ORGANIZATION" \ /d:sonar.host.url="$SONAR_HOST" \ /d:sonar.token="$SONAR_TOKEN" \ /d:sonar.cs.opencover.reportsPaths="**/coverage/**/coverage.opencover.xml" \ /d:sonar.exclusions="frontend/node_modules/**,frontend/dist/**,frontend/src/routeTree.gen.ts,backend/src/TeleWave.Infrastructure/Migrations/**" \ /d:sonar.coverage.exclusions="backend/src/TeleWave.Infrastructure/Migrations/**,frontend/**" # Сканер подмешивает в сборку свои анализаторы, а в проекте TreatWarningsAsErrors=true — # любое замечание Sonar роняло бы сборку вместо того, чтобы приехать в отчёт. Строгая # сборка живёт в build.yml, здесь она нужна только как носитель анализа. - name: Build if: env.SONAR_TOKEN != '' run: dotnet build backend/TeleWave.slnx -c Release /p:TreatWarningsAsErrors=false # Формат opencover, а не cobertura по умолчанию: C#-анализатор Sonar читает именно его. # Интеграционные тесты без Docker пропускаются сами (см. PostgresFixture). - name: Test + coverage if: env.SONAR_TOKEN != '' run: > dotnet test backend/TeleWave.slnx -c Release --no-build --collect:"XPlat Code Coverage;Format=opencover" --results-directory backend/coverage --logger "console;verbosity=normal" - name: End analysis if: env.SONAR_TOKEN != '' run: | export PATH="$PATH:$HOME/.dotnet/tools" dotnet sonarscanner end /d:sonar.token="$SONAR_TOKEN" - name: Skipped if: env.SONAR_TOKEN == '' run: echo "SONAR_TOKEN не задан — анализ пропущен."