diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 8ad1302..f02eef8 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -140,3 +140,30 @@ jobs: # Piège : sans `shell: bash`, un échec de `uv export` serait masqué par le pipe. shell: bash run: uv export --frozen --no-dev --no-emit-project --no-hashes | uvx pip-audit --requirement /dev/stdin --no-deps + + sast: + name: Analyse statique de sécurité + runs-on: ubuntu-latest + defaults: + run: + working-directory: apps/backend + + steps: + - name: Récupère le dépôt + uses: actions/checkout@v4 + + - name: Installe uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + cache-dependency-glob: apps/backend/uv.lock + + # Pourquoi : le périmètre est `app`, le code livré. Les tests emploient légitimement des + # secrets factices et des `assert` que Bandit signalerait sans qu'aucun n'atteigne la prod. + - name: Analyse le code livré (bloquant à partir de MEDIUM) + run: uvx bandit --recursive app --severity-level medium --confidence-level medium + + # Piège : sans cette seconde passe, un constat LOW disparaîtrait du journal sans trace. + - name: Rapport complet, tous niveaux + continue-on-error: true + run: uvx bandit --recursive app diff --git a/.github/workflows/ml.yml b/.github/workflows/ml.yml index b85fec7..4700a97 100644 --- a/.github/workflows/ml.yml +++ b/.github/workflows/ml.yml @@ -57,3 +57,27 @@ jobs: # synthetiques ou un magasin SQLite local jetable (cf. ml/tests/test_train.py). - name: Tests run: uv run pytest + + sast: + name: Analyse statique de sécurité + runs-on: ubuntu-latest + defaults: + run: + working-directory: ml + + steps: + - name: Récupère le dépôt + uses: actions/checkout@v4 + + - name: Installe uv + uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + cache-dependency-glob: ml/uv.lock + + - name: Analyse le code livré (bloquant à partir de MEDIUM) + run: uvx bandit --recursive enervision_ml --severity-level medium --confidence-level medium + + - name: Rapport complet, tous niveaux + continue-on-error: true + run: uvx bandit --recursive enervision_ml