Aller au contenu

PD-96 — Initialisation du projet mobile iOS (React Native + TypeScript)


📚 Navigation User Story | Document | | | ---------- | -- | | 📋 **Spécification** | *(ce document)* | | 🛠️ [Plan d'implémentation](PD-96-plan.md) | | | ✅ [Critères d'acceptation](PD-96-acceptability.md) | | | 📝 [Retour d'expérience](PD-96-rex.md) | | [← Retour à mobile-ios](../PD-195-epic.md) · [↑ Index User Story](index.md)

Références

  • EPIC : MOBILE-IOS
  • JIRA : PD-96
  • Repo(s) concernés : mobile-ios

Objectif

Initialiser le socle technique de l'application mobile iOS ProbatioVault afin de disposer d'un projet React Native fiable, maintenable et sécurisé, servant de base à l'ensemble des développements fonctionnels et cryptographiques ultérieurs.

Cette User Story vise à établir un environnement de développement standardisé, testé et intégré au pipeline CI/CD.

Description fonctionnelle

L'application mobile iOS doit disposer d'un projet React Native fonctionnel, configuré avec TypeScript en mode strict, des outils de qualité de code, des tests unitaires et une structure de dossiers claire.

Le projet doit permettre :

  • le développement d'écrans applicatifs iOS ;
  • l'intégration ultérieure de modules de sécurité et de cryptographie ;
  • l'exécution de tests automatisés ;
  • une validation systématique via un pipeline CI/CD.

Aucune fonctionnalité métier n'est attendue à ce stade, hormis un écran de test confirmant le bon démarrage de l'application.

Spécifications techniques

Élément Valeur
Framework Expo SDK 54
Langage TypeScript strict
Tests Jest avec coverage ≥ 80%
Build EAS Build (Expo Application Services)
CI/CD GitLab CI (lint, type-check, test, sonar, build EAS)
Qualité ESLint + Prettier + SonarQube

Périmètre

Inclus

  • Projet Expo initialisé (SDK 54).
  • Configuration de TypeScript en mode strict (noImplicitAny, strictNullChecks).
  • Arborescence conforme (src/components, screens, services, hooks, store).
  • Mise en place des outils de linting (ESLint) et de formatage (Prettier).
  • Mise en place des tests unitaires Jest avec seuil de couverture ≥ 70%.
  • Création d'une structure de dossiers scalable et lisible.
  • Configuration de la navigation applicative de base.
  • Mise en place d'un pipeline CI/CD GitLab (lint, type-check, test, sonar, build EAS).
  • Intégration SonarQube pour analyse qualité.
  • Documentation de la structure et des conventions du projet.

Exclu

  • Implémentation de fonctionnalités métier.
  • Implémentation de la cryptographie client-side.
  • Intégration Android, Web ou Desktop.
  • Gestion de comptes utilisateurs ou d'authentification.
  • Déploiement App Store ou signature Apple.

Contraintes

  • Qualité & maintenabilité
  • TypeScript doit être configuré en mode strict.
  • Les règles ESLint doivent inclure des règles de sécurité.
  • Le formatage du code doit être homogène et automatisé.
  • La structure du projet doit être documentée et cohérente.

  • Tests

  • Les tests unitaires doivent être exécutables localement et en CI.
  • Un seuil minimal de couverture doit être appliqué.
  • L'échec des tests ou du lint doit bloquer le pipeline.

  • CI/CD

  • Le pipeline GitLab doit exécuter lint, tests et build iOS.
  • Le build iOS doit être reproductible sans intervention manuelle.

  • Sécurité

  • Aucun secret ne doit être présent dans le code.
  • Les dépendances doivent être auditables.
  • Les outils de sécurité statique doivent être activés dès l'initialisation.

Diagrammes

Pipeline CI/CD — Diagramme de séquence

Le pipeline GitLab CI exécute les étapes de validation de manière séquentielle. L'échec d'une étape bloque les suivantes (INV : tests et lint bloquants).

sequenceDiagram
    participant Dev as Développeur
    participant GL as GitLab CI
    participant ES as ESLint + Prettier
    participant TS as TypeScript (tsc)
    participant JT as Jest
    participant SQ as SonarQube
    participant EAS as EAS Build

    Dev->>GL: git push
    GL->>ES: Lint (ESLint + Prettier)
    alt Lint KO
        ES-->>GL: Erreur lint
        GL-->>Dev: Pipeline FAILED
    else Lint OK
        ES-->>GL: OK
        GL->>TS: Type-check (tsc --noEmit, strict)
        alt Type-check KO
            TS-->>GL: Erreur TS strict
            GL-->>Dev: Pipeline FAILED
        else Type-check OK
            TS-->>GL: OK
            GL->>JT: Tests Jest (coverage >= 70%)
            alt Tests KO ou coverage < 70%
                JT-->>GL: Échec tests / seuil non atteint
                GL-->>Dev: Pipeline FAILED
            else Tests OK
                JT-->>GL: OK (coverage >= 70%)
                GL->>SQ: Analyse SonarQube
                alt Quality Gate ERROR
                    SQ-->>GL: QG FAILED
                    GL-->>Dev: Pipeline FAILED
                else Quality Gate OK
                    SQ-->>GL: QG PASSED
                    GL->>EAS: Build iOS (EAS Build)
                    alt Build KO
                        EAS-->>GL: Erreur build
                        GL-->>Dev: Pipeline FAILED
                    else Build OK
                        EAS-->>GL: Artefact .ipa
                        GL-->>Dev: Pipeline SUCCESS
                    end
                end
            end
        end
    end

Pipeline CI/CD — Diagramme d'états

Chaque étape du pipeline est un état. La transition vers l'état suivant n'est possible que si l'étape courante réussit (INV : aucun secret dans le code, ESLint avec règles de sécurité, TypeScript strict).

stateDiagram-v2
    [*] --> Lint
    Lint --> TypeCheck : lint OK
    Lint --> Failed : lint KO
    TypeCheck --> Tests : tsc strict OK
    TypeCheck --> Failed : erreur TS
    Tests --> Sonar : coverage >= 70%
    Tests --> Failed : tests KO / coverage < 70%
    Sonar --> Build_EAS : Quality Gate PASSED
    Sonar --> Failed : Quality Gate ERROR
    Build_EAS --> Success : artefact .ipa généré
    Build_EAS --> Failed : build KO

    Success --> [*]
    Failed --> [*]

    state Failed {
        direction LR
        [*] --> PipelineFailed
        note right of PipelineFailed : Bloque le merge.\nCorrection requise.
    }

Hypothèses

  • L'équipe de développement dispose d'un environnement Node.js compatible.
  • Expo est retenu comme base technique pour la phase initiale.
  • Les outils standards de l'écosystème React Native sont suffisants pour les besoins actuels.
  • Les modules de sécurité avancés seront ajoutés dans des User Stories dédiées.

Liens documentaires

  • Architecture :
  • Mobile iOS Architecture Overview
  • EPIC :
  • MOBILE-IOS
  • Qualité & Sécurité :
  • Conventions de développement ProbatioVault
  • Politique de qualité et de tests