Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
80 changes: 34 additions & 46 deletions .github/workflows/sonarcloud.yml
Original file line number Diff line number Diff line change
@@ -1,30 +1,12 @@
# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.

# This workflow helps you trigger a SonarCloud analysis of your code and populates
# GitHub Code Scanning alerts with the vulnerabilities found.
# Free for open source project.

# 1. Login to SonarCloud.io using your GitHub account

# 2. Import your project on SonarCloud
# * Add your GitHub organization first, then add your repository as a new project.
# * Please note that many languages are eligible for automatic analysis,
# which means that the analysis will start automatically without the need to set up GitHub Actions.
# * This behavior can be changed in Administration > Analysis Method.
# SonarCloud аналіз для NetSdrClient (.NET 8)
#
# 3. Follow the SonarCloud in-product tutorial
# * a. Copy/paste the Project Key and the Organization Key into the args parameter below
# (You'll find this information in SonarCloud. Click on "Information" at the bottom left)
#
# * b. Generate a new token and add it to your Github repository's secrets using the name SONAR_TOKEN
# (On SonarCloud, click on your avatar on top-right > My account > Security
# or go directly to https://sonarcloud.io/account/security/)

# Feel free to take a look at our documentation (https://docs.sonarcloud.io/getting-started/github/)
# or reach out to our community forum if you need some help (https://community.sonarsource.com/c/help/sc/9)
# Перед першим запуском обов'язково:
# 1. Створити проект у SonarCloud (Analyze new project) для цього репозиторію.
# 2. У SonarCloud вимкнути Automatic Analysis (Administration -> Analysis Method).
# 3. Згенерувати User Token у SonarCloud та додати його у GitHub Secrets форку
# під іменем SONAR_TOKEN (Repo Settings -> Secrets and variables -> Actions).
# 4. Замінити нижче змінні `SONAR_PROJECT_KEY` і `SONAR_ORGANIZATION` на власні
# значення з SonarCloud (вкладка Information знизу зліва у проєкті Sonar).

name: SonarCloud analysis

Expand All @@ -36,12 +18,16 @@ on:
workflow_dispatch:

permissions:
pull-requests: read # allows SonarCloud to decorate PRs with analysis results
pull-requests: read

env:
SONAR_PROJECT_KEY: nik-bykoff_ReengineeringCourse
SONAR_ORGANIZATION: nik-bykoff

jobs:
sonar-check:
name: Sonar Check
runs-on: windows-latest # безпечно для будь-яких .NET проектів
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
with: { fetch-depth: 0 }
Expand All @@ -50,34 +36,36 @@ jobs:
with:
dotnet-version: '8.0.x'

# 1) BEGIN: SonarScanner for .NET
- name: SonarScanner Begin
run: |
dotnet tool install --global dotnet-sonarscanner
echo "$env:USERPROFILE\.dotnet\tools" >> $env:GITHUB_PATH
dotnet sonarscanner begin `
/k:"ppanchen_NetSdrClient" `
/o:"ppanchen" `
/d:sonar.token="${{ secrets.SONAR_TOKEN }}" `
/d:sonar.cs.opencover.reportsPaths="**/coverage.xml" `
/d:sonar.cpd.cs.minimumTokens=40 `
/d:sonar.cpd.cs.minimumLines=5 `
/d:sonar.exclusions=**/bin/**,**/obj/**,**/sonarcloud.yml `
/d:sonar.qualitygate.wait=true
/k:"${{ env.SONAR_PROJECT_KEY }}" `
/o:"${{ env.SONAR_ORGANIZATION }}" `
/d:sonar.token="${{ secrets.SONAR_TOKEN }}" `
/d:sonar.cs.opencover.reportsPaths="**/coverage.xml" `
/d:sonar.cpd.cs.minimumTokens=40 `
/d:sonar.cpd.cs.minimumLines=5 `
/d:sonar.exclusions=**/bin/**,**/obj/**,**/sonarcloud.yml `
/d:sonar.qualitygate.wait=true
shell: pwsh
# 2) BUILD & TEST

- name: Restore
run: dotnet restore NetSdrClient.sln

- name: Build
run: dotnet build NetSdrClient.sln -c Release --no-restore
#- name: Tests with coverage (OpenCover)
# run: |
# dotnet test NetSdrClientAppTests/NetSdrClientAppTests.csproj -c Release --no-build `
# /p:CollectCoverage=true `
# /p:CoverletOutput=TestResults/coverage.xml `
# /p:CoverletOutputFormat=opencover
# shell: pwsh
# 3) END: SonarScanner

# Крок з покриттям буде увімкнено у Лабі 3
# - name: Tests with coverage (OpenCover)
# run: |
# dotnet test NetSdrClientAppTests/NetSdrClientAppTests.csproj -c Release --no-build `
# /p:CollectCoverage=true `
# /p:CoverletOutput=TestResults/coverage.xml `
# /p:CoverletOutputFormat=opencover
# shell: pwsh

- name: SonarScanner End
run: dotnet sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}"
shell: pwsh
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -360,4 +360,9 @@ MigrationBackup/
.ionide/

# Fody - auto-generated XML schema
FodyWeavers.xsd
FodyWeavers.xsd

# Local environment / secrets
.env
.env.*
!.env.example
39 changes: 31 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,36 @@
# Лабораторні з реінжинірингу (8×)
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=coverage)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=bugs)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=ppanchen_NetSdrClient&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=ppanchen_NetSdrClient)

**Предмет**: Реінжиніринг програмного забезпечення
**Студент**: Биков Нікіта Вячеславович
**Група**: ПЗС-1
**Форк**: [`nik-bykoff/ReengineeringCourse`](https://github.com/nik-bykoff/ReengineeringCourse)
**Upstream**: [`lenagrin/ReengineeringCourse`](https://github.com/lenagrin/ReengineeringCourse)

Бейджі SonarCloud (підставлено `nik-bykoff_ReengineeringCourse` / `nik-bykoff`; стануть зеленими після створення проєкту в SonarCloud та налаштування `SONAR_TOKEN`):

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=coverage)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=bugs)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Duplicated Lines (%)](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=duplicated_lines_density)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Security Rating](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)
[![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=nik-bykoff_ReengineeringCourse&metric=sqale_rating)](https://sonarcloud.io/summary/new_code?id=nik-bykoff_ReengineeringCourse)

## Звіти про виконання робіт

| № | Лабораторна | Гілка | Звіт |
|---|-------------|-------|------|
| 1 | Підключення SonarCloud і CI | `lab-01-sonarcloud-ci` | [docs/labs/lab-01.md](docs/labs/lab-01.md) |
| 2 | Code Smells через PR | `lab-02-code-smells` | [docs/labs/lab-02.md](docs/labs/lab-02.md) |
| 3 | Тести та покриття | `lab-03-tests-coverage` | [docs/labs/lab-03.md](docs/labs/lab-03.md) |
| 4 | Дублікати через SonarCloud | `lab-04-duplications` | [docs/labs/lab-04.md](docs/labs/lab-04.md) |
| 5 | Архітектурні правила (NetArchTest) | `lab-05-arch-rules` | [docs/labs/lab-05.md](docs/labs/lab-05.md) |
| 6 | Безпечний рефакторинг під тести | `lab-06-echoserver-refactor` | [docs/labs/lab-06.md](docs/labs/lab-06.md) |
| 7 | Оновлення залежностей | `lab-07-dependencies` | [docs/labs/lab-07.md](docs/labs/lab-07.md) |
| 8 | Чистий проєкт і gated build | `lab-08-quality-gate` | [docs/labs/lab-08.md](docs/labs/lab-08.md) |

---

Цей репозиторій використовується для курсу **реінжиніринг ПЗ**.
Мета — провести комплексний реінжиніринг спадкового коду NetSdrClient, включаючи рефакторинг архітектури, покращення якості коду, впровадження сучасних практик розробки та автоматизацію процесів контролю якості через CI/CD пайплайни.
Expand Down
74 changes: 74 additions & 0 deletions docs/labs/lab-01.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# Лабораторна робота 1. Підключення SonarCloud і CI

**Дисципліна**: Реінжиніринг програмного забезпечення
**Студент**: Биков Нікіта Вячеславович
**Група**: ПЗС-1
**Гілка**: `lab-01-sonarcloud-ci`
**Pull Request**: створюється з `nik-bykoff:lab-01-sonarcloud-ci` у `lenagrin/ReengineeringCourse:master`

## Мета

Підключити SonarCloud до репозиторію і створити GitHub Actions pipeline, який на кожен push у `master` та pull request виконує сканування коду та публікує звіт у SonarCloud (з декорацією PR і Quality Gate).

## Хід виконання

1. Виконано форк `lenagrin/ReengineeringCourse` у власний акаунт `nik-bykoff/ReengineeringCourse`. Локальні `remote`-и налаштовано так:
- `origin` -> `https://github.com/nik-bykoff/ReengineeringCourse.git`
- `upstream` -> `https://github.com/lenagrin/ReengineeringCourse.git`
2. Підготовлено інфраструктуру для збереження локальних секретів (`.env` додано до [`.gitignore`](../../.gitignore)), щоб виключити витік `GITHUB_TOKEN`.
3. У workflow [`.github/workflows/sonarcloud.yml`](../../.github/workflows/sonarcloud.yml) ключі SonarCloud винесено у блок `env`. Поточні значення:
- `SONAR_PROJECT_KEY = nik-bykoff_ReengineeringCourse`
- `SONAR_ORGANIZATION = nik-bykoff`
4. У [`README.md`](../../README.md) додано шапку з даними студента, лінком на форк і таблицю звітів усіх восьми лабораторних. Бейджі SonarCloud переведено на `nik-bykoff_ReengineeringCourse`.
5. Закоментований крок `Tests with coverage (OpenCover)` залишено на місці з міткою «буде увімкнено у Лабі 3».

## Зміни у коді та конфігурації

| Файл | Зміна |
|------|-------|
| [`.github/workflows/sonarcloud.yml`](../../.github/workflows/sonarcloud.yml) | Винесено `SONAR_PROJECT_KEY` / `SONAR_ORGANIZATION` в `env`, додано шапку-інструкцію, прибрано зайві коментарі шаблону |
| [`README.md`](../../README.md) | Додано шапку студента, форк/upstream, таблиця звітів, оновлені бейджі |
| [`.gitignore`](../../.gitignore) | Додано правила `.env`, `.env.*`, виняток `.env.example` |
| [`docs/labs/lab-01.md`](lab-01.md) | Цей звіт |

## Як перевірити

1. У SonarCloud створити організацію (якщо ще не створена) та новий проєкт `ReengineeringCourse` з аккаунту `nik-bykoff`. Зафіксувати Project Key та Organization Key.
2. У SonarCloud вимкнути Automatic Analysis: `Project -> Administration -> Analysis Method -> CI-based`.
3. Згенерувати User Token: `My Account -> Security -> Generate Tokens` (тип Project Analysis).
4. Додати токен у Secrets форку: `Repo Settings -> Secrets and variables -> Actions -> New repository secret`, ім'я `SONAR_TOKEN`.
5. Якщо `SONAR_PROJECT_KEY` / `SONAR_ORGANIZATION` у workflow відрізняються від реально створених у SonarCloud — оновити значення у блоці `env`.
6. Створити PR з гілки `lab-01-sonarcloud-ci` у `master`. У вкладці `Checks` PR-а перевірити, що `Sonar Check` та `SonarCloud Code Analysis` пройшли і Quality Gate декоративно прив'язаний до PR.
7. Бейджі у README мають почати показувати реальні значення після першого успішного аналізу.

## Метрики до/після

Цей крок ще не дає метрик якості — він лише вмикає інфраструктуру. Базові показники зафіксовано наприкінці лаби (буде наповнено після першого Sonar-аналізу):

| Метрика | До | Після |
|---------|----|-------|
| Quality Gate | відсутній | очікується `Passed` після фіксів у Лабах 2–8 |
| Coverage on New Code | n/a | n/a (тести з'являться у Лабі 3) |
| Bugs | n/a | n/a |
| Code Smells | n/a | n/a |
| Duplications on New Code | n/a | n/a |

## Висновки

Підключення SonarCloud вимагає чотирьох зовнішніх дій (створення проєкту, токен, secret у GitHub, вимкнення Automatic Analysis), які не автоматизуються через коміт у репозиторій. Усе, що автоматизується (workflow, бейджі, README, гігієна `.env`), оформлено в межах гілки `lab-01-sonarcloud-ci`. Подальші лаби спираються на цей пайплайн.

## Посилання

- Шаблон workflow з README базового завдання
- [SonarCloud для .NET — офіційна документація](https://docs.sonarsource.com/sonarcloud/getting-started/github/)
- [GitHub Actions — `setup-dotnet`](https://github.com/actions/setup-dotnet)

## Скріни

Місця для скрінів (буде вкладено після першого реального запуску):

```text
[ScreenSonar1] Project Information у SonarCloud (Project Key, Organization)
[ScreenSonar2] PR Checks: SonarCloud Code Analysis - Passed
[ScreenSonar3] Бейджі у README з реальними значеннями
```