Pipelines & automation
Config-driven, scheduled, observable workflows that run without you.
A pipeline is a batch job with its decisions pulled out. The stages are ordinary functions; what makes it a pipeline is the configuration above them, the logging and the alerting below, and the fact that you can swap one stage without touching anything else.
The value shows up on the days it fails. A named stage in an exception message tells you where; a per-stage log tells you what it was doing; an alert tells you at all. Without those, a scheduled job that has not run for three weeks looks exactly like a scheduled job that has.
Below: the concepts cover what belongs in config and what belongs in code; the how-to guides build the runner, the scheduling, the retries and the reporting; and the fixes are the failures peculiar to work that runs unattended — cron with no environment, a job that never started, a retry that made things worse.
🧭 Start with the concepts
The ideas the how-to guides below assume you already have.
- How to Make a GIS Workflow Reproducible in Python
- What Is a GIS Data Pipeline? The Anatomy Explained
- Idempotency Explained: Why a GIS Job Must Be Safe to Re-run
- Configuration vs Code: What Belongs in a Config File
- Logs, Metrics and Alerts: Observability for GIS Pipelines
- Cron, systemd, Airflow or CI? Choosing a Scheduler for GIS Jobs
Show every concept in this topic
- What to Test in a GIS Pipeline (and What You Cannot)
- The Anatomy of a Batch Job: Discover, Apply, Report
- Failure Policy in Batch Processing: Fail Fast, Skip or Quarantine
- Repair, Reject or Flag? Choosing What Cleaning Should Do
- Choosing the Unit of Work in a Batch Job: File, Layer, Feature or Tile
- Incremental Processing: How a Batch Job Knows What Changed
- Notebook, App or Report: Choosing How to Ship an Analysis
- Provenance and lineage explained for spatial workflows
- Dataset versioning explained
⚙️ Then do the task
Step-by-step walkthroughs with code you can copy and adapt.
- How to Automate GIS Workflows with Python
- How to Build a GIS Data Pipeline in Python: The Complete Workflow
- How to Chain GIS Processing Steps into a Reusable Pipeline in Python
- How to Drive a GIS Pipeline from a YAML Config File in Python
- How to Turn a GIS Script into a Command-Line Tool with argparse
- How to Schedule a Python GIS Script to Run Automatically
Show every how-to guide in this topic
- How to Add Retries and Timeouts to an Automated GIS Job in Python
- How to Validate Pipeline Inputs and Outputs Automatically in Python
- How to Cache Pipeline Steps So Only Changed Data Is Reprocessed
- How to Get Alerted When an Automated GIS Job Fails
- How to Containerise a Python GIS Pipeline with Docker
- How to Test a GIS Pipeline with pytest
- How to Record Run Metadata and Data Lineage in a GIS Pipeline
- How to Handle Credentials and Secrets in an Automated GIS Job
- How to Run a Python GIS Pipeline in CI with GitHub Actions
- How to Process Only the Files That Changed Since the Last Run
- How to Update a PostGIS Table from a GeoDataFrame Without Duplicates
- How to Profile a Slow Python GIS Script and Find the Real Bottleneck
- How to Cache Downloaded GIS Data So You Fetch It Once
- How to Publish a GeoJSON API from a GeoDataFrame with FastAPI
- How to Cache Geocoding Results So a Rerun Costs Nothing
- How to Build a Reusable Map Style Module
- How to Use DuckDB as the Engine in a GIS Pipeline
- How to run a privacy check before publishing a spatial dataset
- How to record lineage automatically in a pipeline
🔧 When it breaks
The errors this topic produces, with the cause explained rather than just the command.
- Python GIS Script Works Manually but Not from Cron: How to Fix It
- ModuleNotFoundError in a Scheduled GIS Job: Fixing the Wrong Python Environment
- Relative Paths Break When a GIS Script Runs Automatically: How to Fix It
- YAML Config File Will Not Load: Common Errors in a Python GIS Pipeline
- My GIS Pipeline Fails Silently: Fixing Swallowed Errors and Wrong Exit Codes
- GIS Tests Pass Locally but Fail in CI: How to Fix It
Learning paths through this topic
A curated route rather than a list — the guides in the order that builds on itself.
Related topics
Subjects that keep coming up alongside this one, most overlap first.