Workflow de developpement
Conventions de code, analyseurs statiques, workflow de commits et processus de developpement pour Place API.
Workflow de developpement
Conventional Commits
Le projet impose les conventional commits via Husky et commitlint.
Format
<type>(<scope>): <description>
Types autorises
| Type | Usage |
|---|---|
feat | Nouvelle fonctionnalite |
fix | Correction de bug |
chore | Maintenance, configuration |
docs | Documentation |
test | Ajout ou modification de tests |
refactor | Refactoring sans changement fonctionnel |
Exemples
git commit -m "feat(identity): add TOTP two-factor authentication"
git commit -m "fix(auth): prevent session fixation on refresh token rotation"
git commit -m "test(identity): add integration tests for social login"
git commit -m "chore(deps): update MediatR to v14"
Pre-commit hooks
Les hooks Husky sont configures via npm install et executent :
- commitlint : Valide le format du message de commit.
Formatage du code
Commande
dotnet format place-dotnet-api.slnx --severity error --verbosity detailed
Configuration
Le formatage est configure via .editorconfig a la racine du projet. Les regles principales sont :
- Indentation : 4 espaces
- Fin de ligne : LF
- Encodage : UTF-8
- Nullable : enable
- Implicit usings : enable
Analyseurs statiques
Le projet utilise un ensemble complet d'analyseurs C# configures dans Directory.Build.props. Tous les warnings sont traites comme des erreurs (TreatWarningsAsErrors=true).
Analyseurs actifs
| Analyseur | Description |
|---|---|
| StyleCop.Analyzers | Style de code et conventions de nommage |
| Roslynator.Analyzers | Analyse de code et suggestions d'amelioration |
| Roslynator.CodeAnalysis.Analyzers | Analyse complementaire Roslynator |
| Roslynator.Formatting.Analyzers | Regles de formatage Roslynator |
| Meziantou.Analyzer | Bonnes pratiques .NET |
| CSharpGuidelinesAnalyzer | Directives de codage C# |
| Microsoft.VisualStudio.Threading.Analyzers | Bonnes pratiques async/await |
| AsyncAwaitBestPractices | Detection des patterns async problematiques |
Configuration dans Directory.Build.props
<PropertyGroup>
<RunAnalyzersDuringBuild>true</RunAnalyzersDuringBuild>
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<CodeAnalysisTreatWarningsAsErrors>true</CodeAnalysisTreatWarningsAsErrors>
<AnalysisLevel>latest-Recommended</AnalysisLevel>
<AnalysisMode>Recommended</AnalysisMode>
</PropertyGroup>
Regles cles a connaitre
| Regle | Description | Comment satisfaire |
|---|---|---|
| AV1706 | Parametres lambda descriptifs | Nommer user, session, command au lieu de x, s |
| SA1210 | using tries alphabetiquement | Trier les imports par ordre alphabetique |
| AV2202 | Utiliser != null au lieu de .HasValue | Preferer != null pour les nullables |
| AV1555 | Results.Problem() : args positionnels | Ne pas utiliser d'arguments nommes |
| AV1580 | Pas d'appels imbriques dans les arguments | Extraire dans une variable locale |
| AV1561 | Max 3 parametres dans un constructeur/record | Supprimer avec #pragma warning disable AV1561 si necessaire (DI, records) |
| AV1755 | Nom de methode async doit finir par Async | Supprimer avec #pragma warning disable AV1755 pour les methodes Handle imposees par l'interface |
Suppressions courantes
// Pour les primary constructors avec plus de 3 parametres DI
#pragma warning disable AV1561
public sealed class MyHandler(
IUserStore store,
IMediator mediator,
ILogger<MyHandler> logger,
IDbContext context)
#pragma warning restore AV1561
// Pour les methodes Handle imposees par l'interface
#pragma warning disable AV1755
public async Task<Result> Handle(MyCommand command, CancellationToken ct)
#pragma warning restore AV1755
Exclusions
Les fichiers de migration EF Core sont exclus de l'analyse StyleCop via Directory.Build.props :
<Compile Update="**\Migrations\**\*.cs">
<ExcludeFromStyleCop>true</ExcludeFromStyleCop>
</Compile>
Regle importante
Ne jamais modifier .editorconfig pour supprimer des warnings. Corriger les violations directement dans le code source.
Gestion des packages
Le projet utilise Central Package Management (CPM) via Directory.Packages.props. Cela signifie :
- Les versions des packages sont definies uniquement dans
Directory.Packages.propsa la racine. - Les fichiers
.csprojindividuels ne doivent pas contenir d'attributVersionsur lesPackageReference. - Le format de solution est
.slnx(nouveau format XML).
Ajouter un package
<!-- Dans Directory.Packages.props -->
<PackageVersion Include="NouveauPackage" Version="1.0.0" />
<!-- Dans le .csproj du module -->
<PackageReference Include="NouveauPackage" />
Strategie de branches
Branche principale
main: Branche de production, protegee.
Workflow
- Creer une branche feature depuis
main:git checkout -b feat/nom-de-la-feature - Developper et committer avec les conventional commits.
- Pousser et creer une Pull Request vers
main. - La CI (GitHub Actions) execute automatiquement :
- Build (
Compile) - Tests unitaires (
UnitTests) - Tests d'integration (
IntegrationTests)
- Build (
- Review et merge.
CI/CD
GitHub Actions
Deux workflows sont configures :
ci.yml
Declenche sur push et PR vers main.
steps:
- uses: actions/checkout@v4
- name: 'Run: Compile, UnitTests, IntegrationTests'
run: ./build.cmd Compile UnitTests IntegrationTests
Les resultats de tests sont publies comme artefacts :
unit-testsintegration-tests
Le build utilise Nuke comme systeme de build automatise (./build.cmd).
release.yml
Declenche sur push vers main. Utilise semantic-release pour :
- Analyser les messages de commit conventionnels.
- Generer automatiquement un changelog.
- Creer un tag de version et une release GitHub.
Semantic Release
Les plugins configures :
@semantic-release/changelog: Generation du changelog.@semantic-release/git: Commit du changelog et des fichiers de version.
Stack technique
| Composant | Technologie |
|---|---|
| Framework | .NET 10, net10.0 |
| CQRS | MediatR 14 (ICommand/IQuery wrappers) |
| Validation | FluentValidation |
| Mapping | Mapster |
| ID generation | IdGen (pas Guid.NewGuid()) |
| Endpoints | Minimal APIs avec TypedResults |
| Auth | ASP.NET Identity + JWT Bearer (RS256) |
| Database | PostgreSQL via EF Core |
| Background jobs | Hangfire |
| Observabilite | OpenTelemetry, Serilog |
| Orchestration | .NET Aspire |
| API docs | Swagger + Scalar |