jira-ingest
Async Jira data pipeline for Data Center and Cloud. Fetches projects, releases, boards, issues, and transitions; writes Parquet, CSV, or JSON Lines to local disk, S3, Azure Blob, or GCS; and optionally loads records into any SQLAlchemy-compatible database.
Features
- Dual-mode: Jira Data Center (Bearer PAT + optional mTLS) and Jira Cloud (Basic Auth)
- Async fetching with concurrent project processing, in-memory caching, and exponential-backoff retry
- Configurable custom fields extraction -- map any
customfield_XXXXXto a logical name - PII hashing for assignee and author fields
- Output formats: Parquet (Snappy), CSV, JSON Lines
- Output destinations: local filesystem, S3, Azure Blob, GCS via fsspec
- Pluggable database loader: PostgreSQL, Redshift (with S3 COPY fast path), Snowflake, DuckDB, SQLite
- Click CLI with
runandvalidatecommands - Pydantic v2 settings and data schemas
- ruff + mypy strict + pre-commit + GitHub Actions CI
Quick start
pip install pipewell-jira-ingest
cp .env.example .env # edit with your Jira URL and credentials
jira-ingest validate # confirm connectivity
jira-ingest run # fetch everything and write to ./output
For database loading, install the optional extra:
pip install "pipewell-jira-ingest[database]" # PostgreSQL, SQLite, etc.
pip install "pipewell-jira-ingest[redshift]" # Redshift with S3 COPY fast path
Documentation
| Guide | Description |
|---|---|
| Authentication | Jira Cloud vs Data Center, PAT vs Basic Auth, mTLS certificates, scoped API tokens, scoping by project |
| Output sinks | Local filesystem, S3, Azure Blob, GCS -- URIs, auth options, output layout |
| Database loading | PostgreSQL, Redshift S3 COPY, Snowflake, DuckDB, SQLite; programmatic API |
| Custom fields | Mapping customfield_XXXXX IDs to logical names, finding field IDs |
Configuration reference
All settings are read from environment variables (or a .env file) with the prefix JIRA_.
| Variable | Default | Description |
|---|---|---|
JIRA_MODE |
cloud |
cloud or dc |
JIRA_URL |
required | Jira base URL |
JIRA_API_TOKEN |
required | API token (Cloud) or PAT (DC) |
JIRA_EMAIL |
required for Cloud | Account email |
JIRA_CERT_PEM |
Base64-encoded PEM for mTLS (DC only) | |
JIRA_CLOUD_ID |
Routes Cloud requests through Atlassian's API gateway; required for fine-grained/scoped API tokens (Cloud only) | |
JIRA_PROJECT_KEYS |
all projects | Comma-separated project keys to scope the run |
JIRA_OUTPUT_FORMAT |
parquet |
parquet, csv, or jsonl |
JIRA_SINK_URI |
./output |
fsspec URI for output destination |
JIRA_SINK_OPTIONS |
{} |
JSON dict of auth options forwarded to fsspec |
JIRA_CUSTOM_FIELDS |
{} |
JSON dict mapping logical name to Jira field ID |
JIRA_LOG_LEVEL |
INFO |
Log verbosity |
DATABASE_URL |
SQLAlchemy URL to load into a database after writing | |
DATABASE_SCHEMA |
Target schema (used with DATABASE_URL) |
|
REDSHIFT_IAM_ROLE |
IAM role ARN for Redshift S3 COPY |
CLI
jira-ingest run [OPTIONS]
--env-file TEXT Path to .env file [default: .env]
--start-date TEXT Filter issues from date (YYYY-MM-DD)
--end-date TEXT Filter issues until date (YYYY-MM-DD)
--date-suffix TEXT Output file date suffix [default: today]
--database-url TEXT SQLAlchemy URL to load into a database
--db-schema TEXT Target database schema
--redshift-iam-role TEXT IAM role ARN for Redshift S3 COPY
jira-ingest validate [OPTIONS]
--env-file TEXT Path to .env file [default: .env]
Output layout
{JIRA_SINK_URI}/
issues/issues_{date}.parquet
projects/projects_{date}.parquet
releases/releases_{date}.parquet
boards/boards_{date}.parquet
transitions/transitions_{date}.parquet
Development
pip install -e ".[dev]"
pre-commit install
pytest
Metadata
Release files for pipewell-jira-ingest 1.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pipewell_jira_ingest-1.1.0.tar.gz | 46.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pipewell_jira_ingest-1.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 79.9 kB
Release files / pipewell_jira_ingest-1.1.0.tar.gz
| Download URL | pipewell_jira_ingest-1.1.0.tar.gz |
|---|---|
| Size | 46.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
c699e4e13d69ee14cde967fc6afd193d5212163a988811a5ae4f787a71daed84
|
|
BLAKE2b-256 checksum How to use checksums |
abe49c5b85c64cd5048f5b69a23e18e6d670bdf37e8f5526bb5748b7cacf5d1e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency logRelease files / pipewell_jira_ingest-1.1.0-py3-none-any.whl
| Download URL | pipewell_jira_ingest-1.1.0-py3-none-any.whl |
|---|---|
| Size | 33.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
52be2f322d409e55122c7d9cf0ba873120ede98fd6cecf880d6fc3134e6dab89
|
|
BLAKE2b-256 checksum How to use checksums |
9e8f19fbde800eaacb92fe40d8ce365952f74008be67554226d99251a39e8756
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 17, 2026.
Transparency log