name: ScriptPython on: push: branches: - main paths: - 'Outputs/SHP/*.shp' - 'Outputs/DB_Synthese-PSM_LARRA.sql' workflow_dispatch: permissions: contents: write concurrency: group: pyThtoQgis cancel-in-progress: false jobs: ScriptPython: runs-on: ubuntu-24.04 steps: # ============================================================ # 1. Checkout # ============================================================ - name: Checkout repository uses: actions/checkout@v6 with: fetch-depth: 0 # ============================================================ # 2. Vérification des fichiers SHP et SQL modifiés # ou lancement manuel # ============================================================ - name: Check SHP and SQL changes id: changed shell: bash run: | echo "========================================" echo "VÉRIFICATION DES MODIFICATIONS" echo "========================================" # -------------------------------------------------------- # Lancement manuel # -------------------------------------------------------- if [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then echo "Workflow lancé manuellement." echo "changed=true" >> "$GITHUB_OUTPUT" echo "manual=true" >> "$GITHUB_OUTPUT" echo "shp=true" >> "$GITHUB_OUTPUT" echo "sql=true" >> "$GITHUB_OUTPUT" exit 0 fi echo "========================================" echo "Recherche des fichiers modifiés" echo "========================================" # -------------------------------------------------------- # SHP ajoutés ou modifiés # -------------------------------------------------------- SHP_FILES=$(git diff-tree \ --no-commit-id \ --name-only \ --diff-filter=AM \ -r \ "$GITHUB_SHA" \ -- 'Outputs/SHP/*.shp') # -------------------------------------------------------- # SQL ajouté ou modifié # -------------------------------------------------------- SQL_FILE="Outputs/DB_Synthese-PSM_LARRA.sql" SQL_CHANGED=$(git diff-tree \ --no-commit-id \ --name-only \ --diff-filter=AM \ -r \ "$GITHUB_SHA" \ -- "$SQL_FILE") # -------------------------------------------------------- # Affichage # -------------------------------------------------------- echo "" echo "SHP ajoutés/modifiés :" if [ -n "$SHP_FILES" ]; then echo "$SHP_FILES" echo "shp=true" >> "$GITHUB_OUTPUT" else echo "Aucun" echo "shp=false" >> "$GITHUB_OUTPUT" fi echo "" echo "SQL ajouté/modifié :" if [ -n "$SQL_CHANGED" ]; then echo "$SQL_CHANGED" echo "sql=true" >> "$GITHUB_OUTPUT" else echo "Aucun" echo "sql=false" >> "$GITHUB_OUTPUT" fi # -------------------------------------------------------- # Décision de poursuivre # -------------------------------------------------------- if [ -n "$SHP_FILES" ] || [ -n "$SQL_CHANGED" ]; then echo "" echo "SHP ou SQL ajouté/modifié : CONTINUER" echo "changed=true" >> "$GITHUB_OUTPUT" else echo "" echo "Aucun SHP ni SQL ajouté/modifié." echo "changed=false" >> "$GITHUB_OUTPUT" fi echo "manual=false" >> "$GITHUB_OUTPUT" # ============================================================ # 3.1 Arrêt si aucun SHP/SQL et pas de lancement manuel # ============================================================ - name: Stop if no SHP or SQL changes if: steps.changed.outputs.changed != 'true' shell: bash run: | echo "Aucun SHP ou SQL ajouté/modifié." echo "Arrêt du workflow." # ============================================================ # 3.2 Vérification de la base SQL # ============================================================ - name: Check SQL database if: steps.changed.outputs.changed == 'true' shell: bash -el {0} run: | set -e echo "========================================" echo "CHECK DATABASE" echo "========================================" SQL_FILE="Outputs/DB_Synthese-PSM_LARRA.sql" if [ ! -f "$SQL_FILE" ]; then echo "ERREUR : fichier SQL introuvable :" echo "$SQL_FILE" exit 1 fi echo "Base SQL trouvée :" ls -lh "$SQL_FILE" # ============================================================ # 4. Micromamba # IMPORTANT : # PAS de GDAL ici. # GDAL sera fourni par notre package précompilé. # ============================================================ - name: Setup Micromamba if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' uses: mamba-org/setup-micromamba@v3.2.1 with: environment-name: pyThtoQgis create-args: >- python=3.12 numpy sfcgal=2.2 geos proj sqlite libtiff libjpeg-turbo libpng zlib curl openssl init-shell: bash cache-environment: true cache-downloads: true # ============================================================ # 5. Informations environnement # ============================================================ - name: Environment information if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | echo "========================================" echo "ENVIRONMENT" echo "========================================" echo "CONDA_PREFIX=$CONDA_PREFIX" python --version echo "" conda list | grep -E \ "python|numpy|sfcgal|geos|proj|sqlite" # ============================================================ # 6. Téléchargement package GDAL # ============================================================ - name: Download GDAL + SFCGAL package if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} env: GH_TOKEN: ${{ github.token }} run: | set -e GDAL_VERSION=3.13.3 PACKAGE_NAME="gdal-${GDAL_VERSION}-sfcgal-2.2-geos-3.14.1-ubuntu-24.04" TAG="gdal-sfcgal-${GDAL_VERSION}" echo "========================================" echo "GDAL PACKAGE" echo "========================================" echo "Release : $TAG" echo "Package : $PACKAGE_NAME" gh release download "$TAG" \ --repo "$GITHUB_REPOSITORY" \ --pattern "${PACKAGE_NAME}.tar.gz" \ --dir "$RUNNER_TEMP" echo "" echo "Package téléchargé :" ls -lh \ "$RUNNER_TEMP/${PACKAGE_NAME}.tar.gz" # ============================================================ # 7. Installation package GDAL # ============================================================ - name: Installation GDAL package if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | set -e GDAL_VERSION=3.13.3 PACKAGE_NAME="gdal-${GDAL_VERSION}-sfcgal-2.2-geos-3.14.1-ubuntu-24.04" PACKAGE="$RUNNER_TEMP/${PACKAGE_NAME}.tar.gz" EXTRACT_DIR="$RUNNER_TEMP/gdal-extract" echo "========================================" echo "INSTALLATION GDAL" echo "========================================" # ======================================================== # Vérification du package # ======================================================== if [ ! -f "$PACKAGE" ]; then echo "ERREUR : package introuvable :" echo "$PACKAGE" exit 1 fi # ======================================================== # Extraction # ======================================================== rm -rf "$EXTRACT_DIR" mkdir -p "$EXTRACT_DIR" tar \ -xzf \ "$PACKAGE" \ -C "$EXTRACT_DIR" # ======================================================== # Affichage STRUCTURE REELLE # ======================================================== echo "" echo "========================================" echo "STRUCTURE DU PACKAGE" echo "========================================" find "$EXTRACT_DIR" \ -maxdepth 6 \ -print \ | sort # ======================================================== # Répertoire racine # ======================================================== GDAL_DIR="$EXTRACT_DIR/$PACKAGE_NAME" if [ ! -d "$GDAL_DIR" ]; then echo "" echo "ERREUR : répertoire package absent :" echo "$GDAL_DIR" exit 1 fi echo "" echo "GDAL_DIR :" echo "$GDAL_DIR" # ======================================================== # Vérification structure attendue # ======================================================== echo "" echo "========================================" echo "VERIFICATION" echo "========================================" if [ ! -d "$GDAL_DIR/bin" ]; then echo "ERREUR : bin/ absent" exit 1 fi if [ ! -d "$GDAL_DIR/lib" ]; then echo "ERREUR : lib/ absent" exit 1 fi # ======================================================== # Installation BIN # ======================================================== echo "" echo "Installation bin/..." cp -av \ "$GDAL_DIR/bin/." \ "$CONDA_PREFIX/bin/" # ======================================================== # Installation LIB # ======================================================== echo "" echo "Installation lib/..." cp -av \ "$GDAL_DIR/lib/." \ "$CONDA_PREFIX/lib/" # ======================================================== # Installation SHARE # ======================================================== if [ -d "$GDAL_DIR/share" ]; then echo "" echo "Installation share/..." cp -av \ "$GDAL_DIR/share/." \ "$CONDA_PREFIX/share/" fi # ======================================================== # Vérification GDAL # ======================================================== echo "" echo "========================================" echo "VERIFICATION GDAL" echo "========================================" echo "" echo "gdalinfo :" which gdalinfo gdalinfo --version echo "" echo "GDAL Python :" python - <<'PY' from osgeo import gdal from osgeo import ogr print("GDAL :", gdal.VersionInfo("--version")) print("OGR drivers :", ogr.GetDriverCount()) PY echo "" echo "========================================" echo "GDAL INSTALLE" echo "========================================" # ============================================================ # 8. Vérification GDAL # ============================================================ - name: Check GDAL if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | set -e echo "========================================" echo "GDAL" echo "========================================" which gdalinfo gdalinfo --version echo "" echo "Python GDAL :" python - <<'PY' from osgeo import gdal print( gdal.VersionInfo("--version") ) print() print( gdal.VersionInfo("--build-info") ) PY # ============================================================ # 9. Vérification SFCGAL # ============================================================ - name: Check SFCGAL linkage if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | set -e echo "========================================" echo "GDAL / SFCGAL" echo "========================================" ldd "$CONDA_PREFIX/lib/libgdal.so" \ | grep -Ei "sfcgal|geos" # ============================================================ # 10. Test SFCGAL # ============================================================ - name: Test SFCGAL via OGR if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | python - <<'PY' from osgeo import ogr from osgeo import gdal print("========================================") print("TEST SFCGAL") print("========================================") print(gdal.VersionInfo("--version")) wkt = """ POLYHEDRALSURFACE Z ( ( (0 0 0, 10 0 0, 10 10 0, 0 10 0, 0 0 0) ) ) """ geom = ogr.CreateGeometryFromWkt(wkt) if geom is None: raise RuntimeError( "Impossible de créer la géométrie 3D" ) print("Type :", geom.GetGeometryName()) print("Geometry type :", geom.GetGeometryType()) print("Has Z :", ogr.GT_HasZ(geom.GetGeometryType())) valid = geom.IsValid() print("IsValid() :", valid) print() print("SFCGAL accessible par OGR : OK") PY # ============================================================ # 11. Dépendances Python # ============================================================ - name: Install Python dependencies if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.sql == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | python -m pip install --upgrade pip pip install alive-progress pip install pandas pip install matplotlib # ============================================================ # 12. Affichage des SHP # ============================================================ - name: List SHP input files if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | echo "========================================" echo "SHP INPUT" echo "========================================" find Outputs/SHP \ -maxdepth 1 \ -type f \ -name "*.shp" \ -print # ============================================================ # 13. Exécution pyThtoQgis # ============================================================ - name: Run pyThtoQgis if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | set -e echo "========================================" echo "pyThtoQgis" echo "========================================" cd Scripts/pyThtoQgis python pyThtoQgis.py --folder "../../Outputs/SHP/" # ============================================================ # 14. Exécution pyThStat # ============================================================ - name: Run pyThStat if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.manual == 'true' shell: bash -el {0} run: | set -e echo "========================================" echo "pyThStat" echo "========================================" ls -l cd Scripts/pyThStat echo "========================================" ls -l python pythStat.py --file "../../Outputs/DB_Synthese-PSM_LARRA.sql" # ============================================================ # 15. Fichiers produits # ============================================================ - name: Show generated files if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.sql == 'true' || steps.changed.outputs.manual == 'true' shell: bash run: | echo "========================================" echo "GENERATED FILES" echo "========================================" git status --short echo "" git diff --stat # ============================================================ # 16. Commit # ============================================================ - name: Commit generated files if: steps.changed.outputs.shp == 'true' || steps.changed.outputs.sql == 'true' || steps.changed.outputs.manual == 'true' uses: stefanzweifel/git-auto-commit-action@v7 env: COMMIT_DATE: ${{ steps.changed.outputs.commit_date }} with: commit_message: "Auto-generate outputs from ScriptPython - ${{ env.COMMIT_DATE }}" commit_user_name: "github-actions[bot]" commit_user_email: "41898282+github-actions[bot]@users.noreply.github.com" commit_author: "github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>"