diff --git a/.github/workflows/ScriptPython.yml b/.github/workflows/ScriptPython.yml new file mode 100644 index 0000000..6b8c46c --- /dev/null +++ b/.github/workflows/ScriptPython.yml @@ -0,0 +1,463 @@ +name: ScriptPython +on: + push: + branches: + - main + paths: + - 'Outputs/SHP/*.shp' + 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 SHP + # ============================================================ + - name: Check SHP changes + id: changed + shell: bash + run: | + SHP_FILES=$(git diff-tree \ + --no-commit-id \ + --name-only \ + --diff-filter=AM \ + -r \ + "$GITHUB_SHA" \ + -- 'Outputs/SHP/*.shp') + + echo "SHP ajoutés/modifiés :" + echo "$SHP_FILES" + + if [ -n "$SHP_FILES" ]; then + echo "shp=true" >> "$GITHUB_OUTPUT" + else + echo "shp=false" >> "$GITHUB_OUTPUT" + fi + + # ============================================================ + # 3. Arrêt si suppression uniquement + # ============================================================ + - name: Stop if no SHP added or modified + if: steps.changed.outputs.shp != 'true' + shell: bash + run: | + echo "Aucun SHP ajouté ou modifié." + echo "Arrêt du workflow." + + # ============================================================ + # 4. Micromamba + # IMPORTANT : + # PAS de GDAL ici. + # GDAL sera fourni par notre package précompilé. + # ============================================================ + - name: Setup Micromamba + if: steps.changed.outputs.shp == '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' + 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' + 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' + 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' + 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' + 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' + 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' + 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' + 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' + shell: bash -el {0} + run: | + set -e + echo "========================================" + echo "pyThtoQgis" + echo "========================================" + cd Scripts/pyThtoQgis + python pyThtoQgis.py --folder "../../Outputs/SHP/" + + # ============================================================ + # 14. Vérification base SQL + # ============================================================ + - name: Check SQL database + if: steps.changed.outputs.shp == 'true' + shell: bash -el {0} + run: | + set -e + echo "========================================" + echo "CHECK DATABASE" + echo "========================================" + + echo "========================================" + echo "Find SQL" + echo "========================================" + ls -l + echo "========================================" + find Outputs \ + -maxdepth 1 \ + -type f \ + -name "*.sql" \ + -print + + 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" + + # ============================================================ + # 15. Exécution pyThStat + # ============================================================ + - name: Run pyThStat + if: steps.changed.outputs.shp == '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" + + # ============================================================ + # 16. Fichiers produits + # ============================================================ + - name: Show generated files + if: steps.changed.outputs.shp == 'true' + shell: bash + run: | + echo "========================================" + echo "GENERATED FILES" + echo "========================================" + git status --short + echo "" + git diff --stat + + # ============================================================ + # 17. Commit + # ============================================================ + - name: Commit generated files + if: steps.changed.outputs.shp == 'true' + uses: stefanzweifel/git-auto-commit-action@v7 + with: + commit_message: "Auto-generate outputs from SHP" + 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>"