Skip to main content

jira-ingest

PyPI version Python versions Licence: MIT

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_XXXXX to 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 run and validate commands
  • 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 required 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_PART_FILE_MAX_RECORDS 10000 Row-count threshold per data type before flushing a new part file (must be positive)
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
  --append                   Add to an existing --date-suffix's output
                              instead of replacing it (default: replace)

jira-ingest validate [OPTIONS]

  --env-file TEXT            Path to .env file  [default: .env]

Output layout

Each data type is written as a directory of part files, not one single file -- see Output sinks for why and for the --append / replace-on-rerun semantics:

{JIRA_SINK_URI}/
  issues/issues_{date}/part-<uuid>.parquet
  projects/projects_{date}/part-<uuid>.parquet
  releases/releases_{date}/part-<uuid>.parquet
  boards/boards_{date}/part-<uuid>.parquet
  transitions/transitions_{date}/part-<uuid>.parquet

Development

pip install -e ".[dev]"
pre-commit install
pytest

Metadata

Release files for pipewell-jira-ingest 1.2.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pipewell-jira-ingest 1.2.1
File Size Uploaded
pipewell_jira_ingest-1.2.1.tar.gz 52.4 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pipewell-jira-ingest 1.2.1
File Interpreter ABI Platform
pipewell_jira_ingest-1.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 88.2 kB

Release files / pipewell_jira_ingest-1.2.1.tar.gz

Download URL pipewell_jira_ingest-1.2.1.tar.gz
Size 52.4 kB
Tags Source
SHA-256 checksum
How to use checksums
0979496534329b86fda68222a32b4decfeea5c16b2159c62ed20a2a2605bef99
BLAKE2b-256 checksum
How to use checksums
5de5df131ab91f0ad13f361c161e2617154875d27ce6e1c3ad56f8ae2b82127d
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

Release files / pipewell_jira_ingest-1.2.1-py3-none-any.whl

Download URL pipewell_jira_ingest-1.2.1-py3-none-any.whl
Size 35.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
dd40fb5f3a1f80473ba678587bd89a4eb2fe218a725831c33b2b7db350cbe9a2
BLAKE2b-256 checksum
How to use checksums
27adfd737d95da0a0dcc9a17b35c66eb36b0f0e4877f0afc82e6132c625c8d4a
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

Release history Release notifications | RSS feed

This release

1.2.1 This release

2 release files

1.2.0

2 release files

1.1.0

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page