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

TypeUsage
featNouvelle fonctionnalite
fixCorrection de bug
choreMaintenance, configuration
docsDocumentation
testAjout ou modification de tests
refactorRefactoring 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

AnalyseurDescription
StyleCop.AnalyzersStyle de code et conventions de nommage
Roslynator.AnalyzersAnalyse de code et suggestions d'amelioration
Roslynator.CodeAnalysis.AnalyzersAnalyse complementaire Roslynator
Roslynator.Formatting.AnalyzersRegles de formatage Roslynator
Meziantou.AnalyzerBonnes pratiques .NET
CSharpGuidelinesAnalyzerDirectives de codage C#
Microsoft.VisualStudio.Threading.AnalyzersBonnes pratiques async/await
AsyncAwaitBestPracticesDetection 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

RegleDescriptionComment satisfaire
AV1706Parametres lambda descriptifsNommer user, session, command au lieu de x, s
SA1210using tries alphabetiquementTrier les imports par ordre alphabetique
AV2202Utiliser != null au lieu de .HasValuePreferer != null pour les nullables
AV1555Results.Problem() : args positionnelsNe pas utiliser d'arguments nommes
AV1580Pas d'appels imbriques dans les argumentsExtraire dans une variable locale
AV1561Max 3 parametres dans un constructeur/recordSupprimer avec #pragma warning disable AV1561 si necessaire (DI, records)
AV1755Nom de methode async doit finir par AsyncSupprimer 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.props a la racine.
  • Les fichiers .csproj individuels ne doivent pas contenir d'attribut Version sur les PackageReference.
  • 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

  1. Creer une branche feature depuis main :
    git checkout -b feat/nom-de-la-feature
    
  2. Developper et committer avec les conventional commits.
  3. Pousser et creer une Pull Request vers main.
  4. La CI (GitHub Actions) execute automatiquement :
    • Build (Compile)
    • Tests unitaires (UnitTests)
    • Tests d'integration (IntegrationTests)
  5. 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-tests
  • integration-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

ComposantTechnologie
Framework.NET 10, net10.0
CQRSMediatR 14 (ICommand/IQuery wrappers)
ValidationFluentValidation
MappingMapster
ID generationIdGen (pas Guid.NewGuid())
EndpointsMinimal APIs avec TypedResults
AuthASP.NET Identity + JWT Bearer (RS256)
DatabasePostgreSQL via EF Core
Background jobsHangfire
ObservabiliteOpenTelemetry, Serilog
Orchestration.NET Aspire
API docsSwagger + Scalar