From 34701bd6b1042eaa8bf27f1fdc36260f47f11e22 Mon Sep 17 00:00:00 2001 From: Leonid Pershin Date: Sun, 26 Jul 2026 20:52:37 +0300 Subject: [PATCH] Update README.md to replace build and test badges with a consolidated CI badge. Remove obsolete workflow files for build, test, and Sonar analysis, streamlining the CI/CD process. --- .gitea/workflows/build.yml | 43 --------- .gitea/workflows/ci.yml | 177 +++++++++++++++++++++++++++++++++++++ .gitea/workflows/sonar.yml | 82 ----------------- .gitea/workflows/test.yml | 57 ------------ README.md | 5 +- 5 files changed, 179 insertions(+), 185 deletions(-) delete mode 100644 .gitea/workflows/build.yml create mode 100644 .gitea/workflows/ci.yml delete mode 100644 .gitea/workflows/sonar.yml delete mode 100644 .gitea/workflows/test.yml diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml deleted file mode 100644 index 71e763f..0000000 --- a/.gitea/workflows/build.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: build - -on: - push: - branches: [main] - pull_request: - -jobs: - backend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 10.0.x - - name: Restore - working-directory: backend - run: dotnet restore TeleWave.slnx - - name: Build (Release) - working-directory: backend - run: dotnet build TeleWave.slnx -c Release --no-restore - - frontend: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 22 - - name: Enable pnpm - run: corepack enable - - name: Install - working-directory: frontend - run: pnpm install --frozen-lockfile - - name: Lint - working-directory: frontend - run: pnpm lint - - name: Typecheck - working-directory: frontend - run: pnpm typecheck - - name: Build - working-directory: frontend - run: pnpm build diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..0a00b90 --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,177 @@ +name: ci + +# Один workflow вместо трёх: порядок build → tests → sonar задаётся через `needs`, а между +# отдельными файлами workflow'ов в Gitea связать этапы нечем. Побочный эффект — этапы идут +# последовательно, поэтому прогон дольше, зато тесты не стартуют на заведомо битой сборке, +# а анализ не уходит в SonarCloud с красными тестами. +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +jobs: + build-backend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + - name: Restore + working-directory: backend + run: dotnet restore TeleWave.slnx + # Строгая сборка: TreatWarningsAsErrors=true из Directory.Build.props не отключаем. + - name: Build (Release) + working-directory: backend + run: dotnet build TeleWave.slnx -c Release --no-restore + + build-frontend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 22 + - name: Enable pnpm + run: corepack enable + - name: Install + working-directory: frontend + run: pnpm install --frozen-lockfile + - name: Lint + working-directory: frontend + run: pnpm lint + - name: Typecheck + working-directory: frontend + run: pnpm typecheck + - name: Build + working-directory: frontend + run: pnpm build + + tests: + runs-on: ubuntu-latest + needs: [build-backend, build-frontend] + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 10.0.x + - name: Restore + working-directory: backend + run: dotnet restore TeleWave.slnx + - name: Test + coverage + working-directory: backend + run: > + dotnet test TeleWave.slnx + -c Release + --no-restore + --collect:"XPlat Code Coverage" + --results-directory ./coverage + --logger "console;verbosity=normal" + + # Бейдж покрытия обновляем только для main (не для PR/форков): генерируем SVG и + # force-пушим в отдельную orphan-ветку badges — README ссылается на её raw-URL. + - name: Coverage badge + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + working-directory: backend + env: + TOKEN: ${{ secrets.COVERAGE_TOKEN || secrets.GITEA_TOKEN }} + run: | + dotnet tool install --global dotnet-reportgenerator-globaltool + export PATH="$PATH:$HOME/.dotnet/tools" + reportgenerator \ + "-reports:coverage/**/coverage.cobertura.xml" \ + "-targetdir:coverage/badges" \ + "-reporttypes:Badges" \ + "-assemblyfilters:+TeleWave.Domain;+TeleWave.Application" \ + "-classfilters:-System.*" + BADGE=coverage/badges/badge_linecoverage.svg + test -f "$BADGE" || { echo "badge not generated"; exit 1; } + WORK=$(mktemp -d) + cp "$BADGE" "$WORK/coverage.svg" + cd "$WORK" + git init -q -b badges + git add coverage.svg + git -c user.name=gitea-actions -c user.email=actions@local \ + commit -q -m "coverage badge [skip ci]" + git push -f \ + "https://gitea-actions:${TOKEN}@gitea.hsrv.site/mrleo1nid/TeleWave.git" badges + + # Анализ SonarCloud вместе с покрытием: один прогон собирает решение под сканером, гоняет тесты + # и отправляет результат. Только push в main — декорация pull request'ов у SonarCloud завязана + # на GitHub/GitLab, из Gitea она не работает, и анализ PR только засорял бы ветки в проекте. + sonar: + runs-on: ubuntu-latest + needs: tests + if: github.event_name != 'pull_request' + 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-backend, здесь она нужна только как носитель анализа. + - 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 не задан — анализ пропущен." diff --git a/.gitea/workflows/sonar.yml b/.gitea/workflows/sonar.yml deleted file mode 100644 index 19dcef7..0000000 --- a/.gitea/workflows/sonar.yml +++ /dev/null @@ -1,82 +0,0 @@ -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 не задан — анализ пропущен." diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml deleted file mode 100644 index 745861e..0000000 --- a/.gitea/workflows/test.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: tests - -on: - push: - branches: [main] - pull_request: - -jobs: - backend-tests: - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-dotnet@v4 - with: - dotnet-version: 10.0.x - - name: Restore - working-directory: backend - run: dotnet restore TeleWave.slnx - - name: Test + coverage - working-directory: backend - run: > - dotnet test TeleWave.slnx - -c Release - --no-restore - --collect:"XPlat Code Coverage" - --results-directory ./coverage - --logger "console;verbosity=normal" - - # Бейдж покрытия обновляем только для main (не для PR/форков): генерируем SVG и - # force-пушим в отдельную orphan-ветку badges — README ссылается на её raw-URL. - - name: Coverage badge - if: github.event_name == 'push' && github.ref == 'refs/heads/main' - working-directory: backend - env: - TOKEN: ${{ secrets.COVERAGE_TOKEN || secrets.GITEA_TOKEN }} - run: | - dotnet tool install --global dotnet-reportgenerator-globaltool - export PATH="$PATH:$HOME/.dotnet/tools" - reportgenerator \ - "-reports:coverage/**/coverage.cobertura.xml" \ - "-targetdir:coverage/badges" \ - "-reporttypes:Badges" \ - "-assemblyfilters:+TeleWave.Domain;+TeleWave.Application" \ - "-classfilters:-System.*" - BADGE=coverage/badges/badge_linecoverage.svg - test -f "$BADGE" || { echo "badge not generated"; exit 1; } - WORK=$(mktemp -d) - cp "$BADGE" "$WORK/coverage.svg" - cd "$WORK" - git init -q -b badges - git add coverage.svg - git -c user.name=gitea-actions -c user.email=actions@local \ - commit -q -m "coverage badge [skip ci]" - git push -f \ - "https://gitea-actions:${TOKEN}@gitea.hsrv.site/mrleo1nid/TeleWave.git" badges diff --git a/README.md b/README.md index 7417e3a..581f937 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,7 @@ # TeleWave -[![build](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions/workflows/build.yml/badge.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=build.yml) -[![tests](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions/workflows/test.yml/badge.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=test.yml) -[![coverage](https://gitea.hsrv.site/mrleo1nid/TeleWave/raw/branch/badges/coverage.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=test.yml) +[![ci](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions/workflows/ci.yml/badge.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=ci.yml) +[![coverage](https://gitea.hsrv.site/mrleo1nid/TeleWave/raw/branch/badges/coverage.svg)](https://gitea.hsrv.site/mrleo1nid/TeleWave/actions?workflow=ci.yml) [![quality gate](https://sonarcloud.io/api/project_badges/measure?project=mrleo1nid_telewave&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=mrleo1nid_telewave) **TeleWave** — сервис онлайн-каналов: пользователи смотрят сетку каналов, видео отдаётся из