diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..1638299
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,216 @@
+name: CI/CD Pipeline
+
+on:
+ push:
+ branches: [main, dev]
+ tags: ['*']
+ pull_request:
+ branches: [main, dev]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+env:
+ MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
+ MAVEN_CLI_OPTS_SINGLE_THREAD: "-B -V -ntp --fail-at-end"
+ MAVEN_CLI_OPTS: "-B -V -ntp --fail-at-end -T 1C"
+
+jobs:
+ build:
+ name: Build
+ runs-on: ubuntu-latest
+ container:
+ image: maven:3.9.9-eclipse-temurin-21-alpine
+ if: github.event_name == 'pull_request' || startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev'
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Cache Maven packages
+ uses: actions/cache@v5
+ with:
+ path: .m2/repository
+ key: m2-${{ github.ref_name }}-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ m2-${{ github.ref_name }}-
+ m2-
+
+ - name: Build with Maven
+ run: mvn ${MAVEN_CLI_OPTS} -pl '!Rapport' clean compile
+
+ build-rapport:
+ name: Build Rapport PDF
+ runs-on: ubuntu-latest
+ container:
+ image: ghcr.io/r-gld/maven-with-texlive:latest
+ if: |
+ (github.event_name == 'push' && github.ref == 'refs/heads/main') ||
+ (github.event_name == 'push' && github.ref == 'refs/heads/dev') ||
+ (github.event_name == 'pull_request' && contains(github.event.pull_request.labels.*.name, 'rapport'))
+ continue-on-error: true
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Cache Maven packages
+ uses: actions/cache@v5
+ with:
+ path: .m2/repository
+ key: m2-${{ github.ref_name }}-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ m2-${{ github.ref_name }}-
+ m2-
+
+ - name: Build rapport
+ run: |
+ mvn ${MAVEN_CLI_OPTS} -pl 'Rapport' clean compile
+ cp Rapport/target/latex/rapport_principal.pdf rapport_principal.pdf
+
+ - name: Upload rapport PDF
+ uses: actions/upload-artifact@v6
+ with:
+ name: rapport-${{ github.sha }}
+ path: rapport_principal.pdf
+ retention-days: 7
+
+ test:
+ name: Unit Tests
+ runs-on: ubuntu-latest
+ container:
+ image: maven:3.9.9-eclipse-temurin-21-alpine
+ needs: build
+ if: github.event_name == 'pull_request' || startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev'
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Cache Maven packages
+ uses: actions/cache@v5
+ with:
+ path: .m2/repository
+ key: m2-${{ github.ref_name }}-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ m2-${{ github.ref_name }}-
+ m2-
+
+ - name: Run tests with Jacoco
+ run: mvn ${MAVEN_CLI_OPTS} -pl '!GUI,!CoverageReport,!Rapport' jacoco:prepare-agent test jacoco:report
+
+ - name: Upload test results
+ if: always()
+ uses: actions/upload-artifact@v6
+ with:
+ name: test-results
+ path: |
+ **/target/surefire-reports/TEST-*.xml
+ **/target/site/jacoco/jacoco.xml
+ **/target/classes/
+ retention-days: 7
+
+ testIHM:
+ name: GUI Tests
+ runs-on: ubuntu-latest
+ container:
+ image: maven:3.9.9-eclipse-temurin-21-alpine
+ needs: build
+ if: github.event_name == 'pull_request' || startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev'
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
+
+ - name: Cache Maven packages
+ uses: actions/cache@v5
+ with:
+ path: .m2/repository
+ key: m2-${{ github.ref_name }}-${{ hashFiles('**/pom.xml') }}
+ restore-keys: |
+ m2-${{ github.ref_name }}-
+ m2-
+
+ - name: Install Xvfb and dependencies
+ run: apk add xvfb libx11-dev xvfb-run gtk+3.0
+
+ - name: Start Xvfb
+ run: |
+ export DISPLAY=:99
+ Xvfb $DISPLAY -screen 0 1400x900x24 +extension RANDR &
+
+ - name: Install LexerParser module
+ run: mvn ${MAVEN_CLI_OPTS} -pl 'LexerParser,CLI' -am install -DskipTests
+
+ - name: Run GUI tests
+ run: xvfb-run -a mvn ${MAVEN_CLI_OPTS} -pl 'GUI' jacoco:prepare-agent test jacoco:report
+
+ - name: Upload GUI test results
+ if: always()
+ uses: actions/upload-artifact@v6
+ with:
+ name: testIHM-results
+ path: |
+ **/target/surefire-reports/TEST-*.xml
+ **/target/site/jacoco/jacoco.xml
+ **/target/classes/
+ retention-days: 7
+
+ package-and-quality:
+ name: Package & Quality Analysis
+ runs-on: ubuntu-latest
+ container:
+ image: maven:3.9.9-eclipse-temurin-21-alpine
+ needs: [build, test, testIHM]
+ if: github.event_name == 'pull_request' || startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev'
+ steps:
+ - name: Install Git
+ run: apk add --no-cache git
+
+ - name: Checkout code
+ uses: actions/checkout@v6
+ with:
+ fetch-depth: 0
+
+ - name: Cache Maven packages
+ uses: actions/cache@v5
+ with:
+ path: .m2/repository
+ key: m2-${{ github.ref_name }}
+ restore-keys: m2-
+
+ - name: Download test artifacts
+ uses: actions/download-artifact@v7
+ with:
+ name: test-results
+ path: .
+
+ - name: Download GUI test artifacts
+ uses: actions/download-artifact@v7
+ with:
+ name: testIHM-results
+ path: .
+
+ - name: Package JARs
+ run: mvn ${MAVEN_CLI_OPTS} -pl '!Rapport' -DskipTests package
+
+ - name: Upload JAR artifacts
+ uses: actions/upload-artifact@v6
+ with:
+ name: jars
+ path: "**/target/*.jar"
+ retention-days: 7
+
+ - name: Cache SonarQube packages
+ uses: actions/cache@v5
+ with:
+ path: .sonar/cache
+ key: sonar-${{ github.ref_name }}
+ restore-keys: sonar-
+
+ - name: Run SonarQube analysis
+ env:
+ SONAR_USER_HOME: .sonar
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
+ SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}
+ run: |
+ mvn ${MAVEN_CLI_OPTS_SINGLE_THREAD} -pl '!Rapport' -DskipTests sonar:sonar \
+ -Dsonar.projectKey=avm-2025-groupe-7 \
+ -Dsonar.projectName='avm-2025-groupe-7'
diff --git a/.github/workflows/qodana_code_quality.yml b/.github/workflows/qodana_code_quality.yml
new file mode 100644
index 0000000..fbe9881
--- /dev/null
+++ b/.github/workflows/qodana_code_quality.yml
@@ -0,0 +1,39 @@
+#-------------------------------------------------------------------------------#
+# Discover all capabilities of Qodana in our documentation #
+# https://www.jetbrains.com/help/qodana/about-qodana.html #
+#-------------------------------------------------------------------------------#
+
+name: Qodana
+on:
+ workflow_dispatch:
+ pull_request:
+ push:
+ branches: [main, dev]
+ tags: ['*']
+
+jobs:
+ qodana:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ pull-requests: write
+ checks: write
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.pull_request.head.sha }}
+ fetch-depth: 0
+ - name: 'Qodana Scan'
+ uses: JetBrains/qodana-action@v2025.3
+ env:
+ QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
+ with:
+ # When pr-mode is set to true, Qodana analyzes only the files that have been changed
+ pr-mode: false
+ use-caches: true
+ post-pr-comment: true
+ use-annotations: true
+ # Upload Qodana results (SARIF, other artifacts, logs) as an artifact to the job
+ upload-result: false
+ # quick-fixes available in Ultimate and Ultimate Plus plans
+ push-fixes: 'none'
\ No newline at end of file
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
deleted file mode 100644
index 71c4c32..0000000
--- a/.gitlab-ci.yml
+++ /dev/null
@@ -1,222 +0,0 @@
-stages:
- - build
- - test
- - sonarqube-check
- - package
- - deploy
- - release
-
-default:
- image: maven:3.9.9-eclipse-temurin-21-alpine
- tags:
- - avm_groupe7
- before_script:
- - chmod +x settings.sh && ./settings.sh
- retry:
- max: 2
- when:
- - api_failure
- - script_failure
- - unknown_failure
-
-variables:
- MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
- MAVEN_CLI_OPTS_SINGLE_THREAD: "-B -V -ntp -s .settings.xml --fail-at-end"
- MAVEN_CLI_OPTS: "${MAVEN_CLI_OPTS_SINGLE_THREAD} -T 1C"
-
-cache:
- key: "m2-${CI_COMMIT_REF_SLUG}"
- policy: pull-push
- paths:
- - .m2/repository
- when: on_success
-
-check-envvars:
- stage: .pre
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- - if: $CI_COMMIT_BRANCH == 'dev'
- script:
- - >
- if [[ -z "$MAVEN_ENT_PASSWORD" ]]
- || [[ -z "$MAVEN_ENT_USERNAME" ]]
- || [[ -z "$MAVEN_MASTER_PASSWORD" ]]
- || [[ -z "$SONAR_HOST_URL" ]]
- || [[ -z "$SONAR_TOKEN" ]];
- then echo "Missing env vars"; exit 1; fi
-
-build:
- stage: build
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- - if: $CI_COMMIT_BRANCH == 'dev'
- script:
- - mvn ${MAVEN_CLI_OPTS} -pl '!Rapport' clean compile
-
-build-rapport:
- stage: build
- image: ghcr.io/r-gld/maven-with-texlive:latest
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- - if: $CI_COMMIT_BRANCH == 'dev'
- before_script:
- - chmod +x settings.sh && ./settings.sh
- script:
- - mvn -pl 'Rapport' clean compile
- - cp Rapport/target/latex/rapport_principal.pdf rapport_principal.pdf
- artifacts:
- paths:
- - rapport_principal.pdf
- name: "rapport-${CI_COMMIT_SHORT_SHA}"
- expire_in: 1 week
- allow_failure: true
-
-
-test:
- stage: test
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- - if: $CI_COMMIT_BRANCH == 'dev'
- needs:
- - build
- script:
- - mvn ${MAVEN_CLI_OPTS} -pl '!GUI,!CoverageReport,!Rapport' jacoco:prepare-agent test jacoco:report
- artifacts:
- reports:
- junit: "**/target/surefire-reports/TEST-*.xml"
- coverage_report:
- coverage_format: jacoco
- path: "**/target/site/jacoco/jacoco.xml"
- paths:
- - "**/target/surefire-reports/TEST-*.xml"
- - "**/target/site/jacoco/jacoco.xml"
- - "**/target/classes/"
- expire_in: 1 week
-
-testIHM:
- stage: test
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- - if: $CI_COMMIT_BRANCH == 'dev'
- needs:
- - build
- before_script:
- - chmod +x settings.sh && ./settings.sh
- - apk add xvfb libx11-dev xvfb-run gtk+3.0
- - export DISPLAY=:99
- - Xvfb $DISPLAY -screen 0 1400x900x24 +extension RANDR &
- script:
- - mvn ${MAVEN_CLI_OPTS} -pl 'LexerParser' -am install -DskipTests
- - xvfb-run -a mvn ${MAVEN_CLI_OPTS} -pl 'GUI' jacoco:prepare-agent test jacoco:report
- artifacts:
- reports:
- junit: "**/target/surefire-reports/TEST-*.xml"
- coverage_report:
- coverage_format: jacoco
- path: "**/target/site/jacoco/jacoco.xml"
- paths:
- - "**/target/surefire-reports/TEST-*.xml"
- - "**/target/site/jacoco/jacoco.xml"
- - "**/target/classes/"
- expire_in: 1 week
-
-package:
- stage: package
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- - if: $CI_COMMIT_BRANCH == 'dev'
- script:
- - mvn ${MAVEN_CLI_OPTS} -pl '!Rapport' -DskipTests package
- artifacts:
- paths:
- - "**/target/*.jar"
- expire_in: 1 week
- needs:
- - test
- - testIHM
-
-sonarqube-check:
- stage: sonarqube-check
- variables:
- SONAR_USER_HOME: "${CI_PROJECT_DIR}/.sonar" # Defines the location of the analysis task cache
- GIT_DEPTH: "0" # Tells git to fetch all the branches of the project, required by the analysis task
- cache:
- key: "sonar-cache"
- policy: pull-push
- paths:
- - .sonar/cache
- rules:
- - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
- - if: $CI_COMMIT_BRANCH == 'dev'
- script:
- - mvn ${MAVEN_CLI_OPTS_SINGLE_THREAD} -pl '!Rapport' -DskipTests sonar:sonar -Dsonar.projectKey=avm-2025-groupe-7 -Dsonar.projectName='avm-2025-groupe-7'
- # allow_failure: true # Uncomment this line to not fail the pipeline if the SonarQube analysis fails
- needs:
- - build
- - test
- - testIHM
-
-deploy:
- stage: deploy
- retry: 2
- rules:
- - if: $CI_COMMIT_TAG
- - if: $CI_COMMIT_BRANCH == 'main'
- needs:
- - package
- script:
- - mvn ${MAVEN_CLI_OPTS} -pl '!Rapport' -DskipTests deploy
-
-# # Ne marche pas actuellement
-#release:prepare:
-# stage: release
-# rules:
-# - if: $CI_COMMIT_BRANCH == 'main'
-# when: manual
-# before_script:
-# - chmod +x settings.sh && ./settings.sh
-# - apk add git openssh-client
-# - git config --global user.email "ci@groupe7.fr"
-# - git config --global user.name "CI Release Bot"
-# - mkdir -p ~/.ssh
-# - chmod 700 ~/.ssh
-# - cp "${GITLAB_SSH_PRIVATE_KEY}" ~/.ssh/id_rsa
-# - chmod 600 ~/.ssh/id_rsa
-# - ssh-keyscan -t rsa disc.univ-fcomte.fr >> ~/.ssh/known_hosts
-# - git remote set-url origin git@disc.univ-fcomte.fr:projet-amv-2025/groupe-7.git
-# - git fetch --all
-# - git checkout ${CI_COMMIT_BRANCH}
-# - git pull origin ${CI_COMMIT_BRANCH}
-# script:
-# - mvn ${MAVEN_CLI_OPTS_SINGLE_THREAD} -pl '!Rapport' release:clean release:prepare -DpushChanges=true -Darguments="-DskipTests"
-# after_script:
-# - git push --tags
-# artifacts:
-# paths:
-# - release.properties
-# - pom.xml.releaseBackup
-# expire_in: 1 day
-# allow_failure: false
-#
-#release:perform:
-# stage: release
-# rules:
-# - if: $CI_COMMIT_BRANCH == 'main'
-# when: manual
-# needs:
-# - release:prepare
-# script:
-# - mvn ${MAVEN_CLI_OPTS_SINGLE_THREAD} -pl '!Rapport' release:perform -Darguments="-DskipTests"
-# allow_failure: false
diff --git a/RELEASE.md b/RELEASE.md
deleted file mode 100644
index e5ca983..0000000
--- a/RELEASE.md
+++ /dev/null
@@ -1,198 +0,0 @@
-# Guide de Release
-
-Ce document décrit le processus de création de releases pour le projet MiniJAJA via GitLab CI/CD.
-
-## Prérequis
-
-### Variables d'environnement GitLab CI/CD
-
-Les variables suivantes doivent être configurées dans **Settings > CI/CD > Variables** :
-
-| Variable | Description | Protected | Masked |
-|--------------------------|-----------------------|-----------|--------|
-| `MAVEN_ENT_USERNAME` | Username pour Nexus | Oui | Non |
-| `MAVEN_ENT_PASSWORD` | Password pour Nexus | Oui | Oui |
-| `MAVEN_MASTER_PASSWORD` | Master password Maven | Oui | Oui |
-| `SONAR_HOST_URL` | URL SonarQube | Non | Non |
-| `SONAR_TOKEN` | Token SonarQube | Oui | Oui |
-| `GITLAB_SSH_PRIVATE_KEY` | Clé SSH pour push Git | Oui | Oui |
-
-### Configuration de la clé SSH
-
-Pour générer et configurer la clé SSH permettant au CI de pusher les tags :
-
-```bash
-# Générer une clé SSH dédiée au CI
-ssh-keygen -t rsa -b 4096 -C "ci-bot@groupe7.fr" -f gitlab-ci-key
-
-# Ajouter la clé publique dans GitLab
-# Settings > Repository > Deploy Keys
-# - Copier le contenu de gitlab-ci-key.pub
-# - Cocher "Write access allowed"
-
-# Ajouter la clé privée dans les variables CI/CD
-# Settings > CI/CD > Variables
-# - Nom : GITLAB_SSH_PRIVATE_KEY
-# - Valeur : contenu de gitlab-ci-key (attention aux retours à la ligne)
-# - Type : File (recommandé) ou Variable
-# - Protected : Oui
-# - Masked : Non (les clés SSH sont trop longues)
-```
-
-## Processus de release
-
-Le système de release utilise le **Maven Release Plugin** et se décompose en deux étapes :
-
-### 1. Release Prepare
-
-Cette étape :
-- Vérifie qu'il n'y a pas de modifications non commitées
-- Demande la version de release et la prochaine version SNAPSHOT
-- Met à jour les versions dans tous les pom.xml (multi-module)
-- Commit les changements avec le préfixe `[Release]`
-- Crée un tag Git (format : `v1.0.0`)
-- Push les changements et le tag vers le dépôt
-
-### 2. Release Perform
-
-Cette étape :
-- Checkout le tag créé
-- Construit le projet depuis le tag
-- Exécute les tests (optionnel, actuellement skippés)
-- Déploie les artefacts vers Nexus (repository maven-releases)
-
-## Utilisation
-
-### Créer une release depuis l'interface GitLab
-
-1. Aller sur la branche `main`
-2. Ouvrir **CI/CD > Pipelines**
-3. Cliquer sur le dernier pipeline de `main`
-4. Dans le stage `release`, cliquer sur le bouton play de `release:prepare`
-5. Maven vous demandera :
- - **Release version** : version à publier (ex: `1.0.0`)
- - **Next development version** : prochaine version SNAPSHOT (ex: `1.1-SNAPSHOT`)
-6. Attendre la fin de `release:prepare`
-7. Vérifier que le tag a bien été créé : **Repository > Tags**
-8. Lancer `release:perform` manuellement
-9. Vérifier le déploiement sur Nexus
-
-### Versions interactives vs automatiques
-
-Par défaut, Maven Release Plugin demande confirmation pour les versions. Pour automatiser :
-
-```bash
-mvn release:prepare -DreleaseVersion=1.0.0 -DdevelopmentVersion=1.1-SNAPSHOT -B
-```
-
-Cette option peut être ajoutée au job CI si vous souhaitez passer les versions en paramètres du job manuel.
-
-## Configuration Maven Release Plugin
-
-Le plugin est configuré dans le `pom.xml` racine :
-
-```xml
-
- org.apache.maven.plugins
- maven-release-plugin
- 3.1.1
-
- v@{project.version}
- true
- release
- [Release]
- deploy
-
-
-```
-
-### Paramètres importants
-
-- `tagNameFormat` : format du tag Git (v1.0.0, v1.1.0, etc.)
-- `autoVersionSubmodules` : met à jour tous les modules avec la même version
-- `releaseProfiles` : active le profil Maven `release` (si défini)
-- `scmCommentPrefix` : préfixe des commits de release
-- `goals` : objectif Maven à exécuter lors du `release:perform`
-
-## Workflow complet
-
-```
-main (1.1-SNAPSHOT)
- |
- | [CI] release:prepare (manuel)
- | - Version release : 1.1.0
- | - Prochaine version : 1.2-SNAPSHOT
- |
- +---> Commit : [Release] prepare release v1.1.0
- |
- +---> Tag : v1.1.0
- |
- +---> Commit : [Release] prepare for next development iteration
- |
-main (1.2-SNAPSHOT)
- |
- | [CI] release:perform (manuel)
- | - Checkout tag v1.1.0
- | - Build & Deploy vers Nexus
- |
-Nexus : artefact 1.1.0 publié
-```
-
-## Rollback en cas d'erreur
-
-Si `release:prepare` échoue ou si vous souhaitez annuler :
-
-```bash
-# Localement (pour test)
-mvn release:rollback
-
-# Supprimer le tag local et distant
-git tag -d v1.0.0
-git push origin :refs/tags/v1.0.0
-
-# Réinitialiser les modifications
-git reset --hard HEAD~2
-```
-
-En CI, il suffit de :
-1. Supprimer le tag dans GitLab : **Repository > Tags > Delete**
-2. Réinitialiser le commit sur `main` si nécessaire
-
-## Bonnes pratiques
-
-1. Toujours créer les releases depuis `main`
-2. S'assurer que tous les tests passent avant de lancer une release
-3. Vérifier SonarQube avant la release
-4. Suivre le versioning sémantique : `MAJOR.MINOR.PATCH`
- - MAJOR : changements incompatibles
- - MINOR : nouvelles fonctionnalités rétrocompatibles
- - PATCH : corrections de bugs
-5. Documenter les changements dans un CHANGELOG
-6. Tester le déploiement sur un environnement de staging si possible
-
-## Dépannage
-
-### Erreur : "Nothing to commit"
-
-Le working directory contient des modifications. Committez ou stash avant de lancer la release.
-
-### Erreur : "Authentication failed"
-
-Vérifiez que `GITLAB_SSH_PRIVATE_KEY` est correctement configurée et que la clé publique est ajoutée en Deploy Key avec write access.
-
-### Erreur : "Failed to deploy"
-
-Vérifiez les credentials Nexus (`MAVEN_ENT_USERNAME` et `MAVEN_ENT_PASSWORD`).
-
-### Le tag n'est pas poussé
-
-Vérifiez que `after_script: git push --tags` est présent dans le job `release:prepare`.
-
-## Améliorations futures
-
-- Génération automatique de CHANGELOG
-- Création de GitHub/GitLab Releases avec notes
-- Notifications Slack/Email lors des releases
-- Rollback automatique en cas d'échec
-- Signature GPG des artefacts
-- Tests d'intégration avant release:perform
diff --git a/qodana.yaml b/qodana.yaml
new file mode 100644
index 0000000..1c544ad
--- /dev/null
+++ b/qodana.yaml
@@ -0,0 +1,49 @@
+#-------------------------------------------------------------------------------#
+# Qodana analysis is configured by qodana.yaml file #
+# https://www.jetbrains.com/help/qodana/qodana-yaml.html #
+#-------------------------------------------------------------------------------#
+
+#################################################################################
+# WARNING: Do not store sensitive information in this file, #
+# as its contents will be included in the Qodana report. #
+#################################################################################
+version: "1.0"
+
+#Specify inspection profile for code analysis
+profile:
+ name: qodana.starter
+
+#Enable inspections
+#include:
+# - name:
+
+#Disable inspections
+#exclude:
+# - name:
+# paths:
+# -
+
+projectJDK: "21" #(Applied in CI/CD pipeline)
+
+#Execute shell command before Qodana execution (Applied in CI/CD pipeline)
+#bootstrap: sh ./prepare-qodana.sh
+
+#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline)
+#plugins:
+# - id: #(plugin id can be found at https://plugins.jetbrains.com)
+
+# Quality gate. Will fail the CI/CD pipeline if any condition is not met
+# severityThresholds - configures maximum thresholds for different problem severities
+# testCoverageThresholds - configures minimum code coverage on a whole project and newly added code
+# Code Coverage is available in Ultimate and Ultimate Plus plans
+#failureConditions:
+# severityThresholds:
+# any: 15
+# critical: 5
+# testCoverageThresholds:
+# fresh: 70
+# total: 50
+
+#Qodana supports other languages, for example, Python, JavaScript, TypeScript, Go, C#, PHP
+#For all supported languages see https://www.jetbrains.com/help/qodana/linters.html
+linter: jetbrains/qodana-jvm-community:2025.3
diff --git a/settings.sh b/settings.sh
deleted file mode 100644
index 5df2feb..0000000
--- a/settings.sh
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/usr/bin/env bash
-
-if [[ -z $HOME ]]; then
- echo "Error: HOME environment variable is not set." >&2
- exit 1
-fi
-
-cat < .settings.xml
-
-
-
- nexus-deptinfo
- ${MAVEN_ENT_USERNAME}
- ${MAVEN_ENT_PASSWORD}
-
-
- nexus-deptinfo-snapshots
- ${MAVEN_ENT_USERNAME}
- ${MAVEN_ENT_PASSWORD}
-
-
- sonar
- ${MAVEN_ENT_USERNAME}
- ${MAVEN_ENT_PASSWORD}
-
-
-
-
-
- nexus-deptinfo
- *
- https://disc.univ-fcomte.fr/cr700-nexus/repository/maven-public/
-
-
-
-
- org.sonarsource.scanner.maven
-
-
-
-
- nexus-deptinfo-snapshots
-
- true
-
-
-
- nexus-deptinfo-snapshots
- https://disc.univ-fcomte.fr/cr700-nexus/content/groups/public
-
- true
-
-
- true
-
-
-
-
-
- sonar
-
- true
-
-
- https://disc.univ-fcomte.fr/cr700-sonarqube
-
-
-
-
-EOF
-
-# Create the settings-security.xml file from a template
-cat < settings-security.xml
-
- ${MAVEN_MASTER_PASSWORD}
-
-EOF
-
-# Move settings-security.xml to the .m2 directory of the runner's container
-mv settings-security.xml "$HOME"/.m2/settings-security.xml