Skip to content

🐛 [BUG] - Réconciliation SonarQube en échec 404 quand le projet à supprimer est déjà absent (deleteProject non idempotent) #2785

Open

Description

@shikanime

Description

La réconciliation SonarQube échoue lorsqu'elle doit supprimer un projet SonarQube orphelin (dépôt retiré du projet côté console) qui n'existe déjà plus dans SonarQube. L'API répond 404 « Project '...' not found » et l'erreur n'est pas tolérée : toute la réconciliation du projet passe en échec (résultat de plugin KO).

Cas observé en production sur le projet testformation-demo-java-infra : la suppression du projet SonarQube testformation-demo-java-infra-77b9 (clé calculée par la console, dépôt orphelin) a reçu un 404, faisant échouer ensureProjectRepositories puis la réconciliation complète du projet.

Le cas survient lorsque le projet SonarQube visé est déjà absent au moment de la suppression : réconciliations concurrentes du même projet (rejeu de hooks pendant qu'une synchronisation est en cours, resynchronisation admin) où la première suppression réussit et la seconde reçoit un 404, ou suppression du projet SonarQube hors console entre le listing et la suppression.

Comportement attendu : une suppression « déjà effectuée » doit être idempotente (comme le tolère déjà la création avec ensure), la réconciliation ne doit pas échouer. C'est le pendant côté suppression de #2778 (échec 400 côté création).

Etapes de reproduction

  1. Avoir un projet portant un projet SonarQube orphelin à supprimer lors de la réconciliation (dépôt retiré du projet côté console, ou projet SonarQube supprimé hors console).
  2. Déclencher deux réconciliations du même projet de façon rapprochée ou concurrente (rejeu de hooks pendant une synchronisation en cours, resynchronisation admin, cron).
  3. Voir la seconde réconciliation échouer : « SonarQube API responded with status 404: Project '...' not found » (résultat de plugin KO pour le projet).

Captures d'écran

Logs

{"name":"SonarqubeError","message":"SonarQube API responded with status 404: Project 'testformation-demo-java-infra-77b9' not found","stack":"SonarqubeError: SonarQube API responded with status 404: Project 'testformation-demo-java-infra-77b9' not found\n at SonarqubeHttpClientService.fetch (/app/dist/src/modules/sonarqube/sonarqube-http-client.service.js:60:19)\n at process.processTicksAndRejections (node:internal/process/task_queues:104:5)\n at async SonarqubeClientService.deleteProject (/app/dist/src/modules/sonarqube/sonarqube-client.service.js:111:9)\n at async handlePromiseResult (/app/dist/src/modules/infrastructure/telemetry/telemetry.decorator.js:44:16)\n at async /app/dist/src/modules/sonarqube/sonarqube.service.js:214:17\n at async Promise.all (index 1)\n at async SonarqubeService.ensureProjectRepositories (/app/dist/src/modules/sonarqube/sonarqube.service.js:212:9)\n at async handlePromiseResult (/app/dist/src/modules/infrastructure/telemetry/telemetry.decorator.js:44:16)\n at async Promise.all (index 2)\n at async SonarqubeService.ensureProjectGroup (/app/dist/src/modules/sonarqube/sonarqube.service.js:102:9)"}

Navigateurs

OS

Version de la console impactée

Observé en production (environnement dso) ; comportement présent sur main.

Définition du fini

  • Une suppression de projet SonarQube déjà absent ne fait plus échouer la réconciliation (suppression idempotente)
  • Des tests unitaires couvrent la suppression d'un projet déjà absent (aucun échec remonté)
  • Le correctif est terminé

Références

Activity

  1. shikanime commented on Sep 28, 2026

    @shikanime
    Author
  2. added theissue type on Sep 28, 2026
  3. self-assigned this
    on Sep 28, 2026
  4. added this to the 9.27.0 milestone on Sep 28, 2026
  5. yorha-operator commented on Sep 28, 2026

    @yorha-operator
    Contributor

    Analyse racine

    Cause : SonarqubeClientService.deleteProject propage un 404 quand le projet est déjà absent, et aucun site d'appel ne l'absorbe. Deux sites concernés dans sonarqube.service.ts :

    • ensureProjectRepositories → suppression des dépôts orphelins (stack trace production)
    • deleteProjectGroup → suppression sur l'événement project.delete

    Dans les deux cas, un projet SonarQube déjà supprimé fait planter la réconciliation complète du projet (résultat KO).

    Stack trace production (dump error format) :

    {
      "name": "SonarqubeError",
      "message": "SonarQube API responded with status 404: Project 'testformation-demo-java-infra-77b9' not found",
      "stack": "SonarqubeError: ...\n  at SonarqubeHttpClientService.fetch\n  at async SonarqubeClientService.deleteProject\n  at async SonarqubeService.ensureProjectRepositories"
    }
    

    Preuve de reproduction locale (client mocké, test jetable) :

    • orphelin à supprimer + 404 → handleUpsert retourne status: KO, message « SonarQube API responded with status 404: Project '…' not found »
    • deux réconciliations concurrentes → première OK, seconde KO
    REPRO-1 result: {"status":"KO","message":"SonarQube API responded with status 404: Project 'testformation-demo-removed-repo-4b00' not found"}
    REPRO-2 race: {"first":"OK","second":"KO"}
    
    sequenceDiagram
        participant A as Réconciliation A
        participant B as Réconciliation B
        participant S as SonarQube
        A->>S: search des projets du slug
        B->>S: search des projets du slug
        S-->>A: orphelin X listé
        S-->>B: orphelin X listé
        A->>S: POST api/projects/delete (X)
        S-->>A: 204
        B->>S: POST api/projects/delete (X)
        S-->>B: 404 « Project X not found »
        Note over B: réconciliation KO
    
    Loading

    Proposition : tolérer « not found » à la suppression — ajouter isSonarqubeNotFound(error) dans sonarqube.utils.ts (pendant de isSonarqubeAlreadyExists de #2778), et l'appliquer aux deux sites de suppression avec un log verbose « déjà absent ». Les autres erreurs continuent de se propager. Test unitaire à ajouter : orphelin déjà supprimé → réconciliation OK.

    Liens avec les autres issues

  6. shikanime commented on Sep 28, 2026

    @shikanime
    MemberAuthor

    Pendant GitLab du même incident : #2787 (suppression d'un dépôt orphelin échoue en 404, double Projects.remove dans deleteProjectGroupRepo). Les deux 404 proviennent du même flux de suppression de projet.

  7. moved this from Backlog to Triage in Cloud Pi Nativeon Sep 29, 2026
  8. moved this from Refinement to Experiment Design in Cloud Pi Nativeon Sep 29, 2026
  9. modified the milestones: 9.27.0, 9.28.0, 9.29.0 on Oct 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingto refineNeed to be refine by PO

Type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions