Skip to main content

Compare GitHub workflow runs with detailed analysis

Project description

ghadiff

A Python CLI tool to compare two GitHub Actions workflow runs with detailed analysis of timing, status changes, and job differences.

Features

  • 🔍 Compare any two GitHub workflow runs
  • 📊 Detailed job and step-level analysis
  • ⏱️ Duration comparisons with percentage changes
  • 🎨 Multiple output formats: Text, JSON, Markdown, HTML
  • 🚀 Defaults to tenstorrent/tt-metal repository
  • 🔒 GitHub API token support with rate limit handling

Installation

From PyPI (once published)

pip install ghadiff

From source

git clone https://github.com/Aswintechie/ghadiff.git
cd ghadiff
pip install -e .

Quick Start

Prerequisites

You'll need a GitHub personal access token for API access:

  1. Go to GitHub Settings → Developer settings → Personal access tokens
  2. Generate a new token with repo and workflow scopes
  3. Set it as an environment variable:
export GITHUB_TOKEN=your_token_here

Basic Usage

Compare two workflow runs (defaults to tenstorrent/tt-metal):

ghadiff 12345678 12345679

The first argument is Run 1 (baseline), the second is Run 2 (comparison).

With Custom Repository

ghadiff 12345678 12345679 --repo owner/repo

Generate Reports

Text format (default):

ghadiff 12345678 12345679

JSON format:

ghadiff 12345678 12345679 --format json

Markdown format:

ghadiff 12345678 12345679 --format markdown -o report.md

HTML format:

ghadiff 12345678 12345679 --format html -o report.html

Output Examples

Text Format

================================================================================
GitHub Workflow Run Comparison
================================================================================

OVERVIEW
--------------------------------------------------------------------------------
Run 1: #1234 (12345678)
  Branch: main
  SHA: abc1234
  Status: completed / success
  Duration: 45.2m

Run 2: #1235 (12345679)
  Branch: main
  SHA: def5678
  Status: completed / success
  Duration: 38.7m

Duration Difference: -6.5m

JOBS COMPARISON
--------------------------------------------------------------------------------
Total jobs compared: 25
  In both runs: 25
  Only in Run 1: 0
  Only in Run 2: 0

build-and-test
   Run 1: ✅ success    - 12.3m
   Run 2: ✅ success    - 10.1m
   Diff:  -2.2m (-17.9%)

...

JSON Format

Full structured data with all workflow, job, and step details for programmatic access.

HTML Format

Beautiful, responsive HTML report with color-coded status indicators and sortable tables.

CLI Interface Example

ghadiff 12345678 12345679 \
  --repo tenstorrent/tt-metal \
  --format html \
  --output report.html

positional arguments: run1 First workflow run ID run2 Second workflow run ID

optional arguments: -h, --help show this help message and exit --repo REPO Repository in format owner/repo (default: tenstorrent/tt-metal) --token TOKEN GitHub personal access token (or use GITHUB_TOKEN env var) --format {text,json,markdown,html} Output format (default: text) --output OUTPUT, -o OUTPUT Output file (default: stdout) --verbose, -v Verbose output (text format only)


## Python API

You can also use the package programmatically:

```python
from workflow_compare import GitHubAPI, WorkflowComparator, Reporter

# Initialize API client
api = GitHubAPI(token="your_token", repo="tenstorrent/tt-metal")

# Fetch workflow runs
run1 = api.get_workflow_run_full(12345678)
run2 = api.get_workflow_run_full(12345679)

# Compare
comparator = WorkflowComparator(run1, run2)
comparison = comparator.get_full_comparison()

# Generate report
reporter = Reporter(comparison)
print(reporter.to_text())

Development

Setup Development Environment

git clone https://github.com/Aswintechie/ghadiff.git
cd ghadiff
pip install -e ".[dev]"

Run Tests

pytest

Code Formatting

black src/

Use Cases

  • Performance Regression Detection: Compare workflow runs before and after code changes
  • CI/CD Optimization: Identify which jobs got faster or slower
  • Debugging Failures: Compare a failing run with a successful baseline
  • Release Validation: Ensure new releases don't introduce timing regressions
  • Infrastructure Changes: Validate runner or environment changes

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

MIT License

Links

Acknowledgments

Built for the Tenstorrent tt-metal project to improve CI/CD workflow analysis.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ghadiff-0.1.2.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ghadiff-0.1.2-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file ghadiff-0.1.2.tar.gz.

File metadata

  • Download URL: ghadiff-0.1.2.tar.gz
  • Upload date:
  • Size: 13.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for ghadiff-0.1.2.tar.gz
Algorithm Hash digest
SHA256 2bc648bfc631c22064d2fac775abf9f7e3a2f7ab4be5d95cf6379f7fd7e40aa8
MD5 78f86ce681ec4bd5482c94568fb023f2
BLAKE2b-256 3cc818af742a6bd361d6862dbc2e14438a9acbeaf052fdb41b1a40eb89a434b8

See more details on using hashes here.

File details

Details for the file ghadiff-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: ghadiff-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for ghadiff-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 97d577662febaef71fec2a066d95ba3213375eb681d939f2de1f4eaed2c8c77c
MD5 fcdc3998407cc08cba2d67d8cad07159
BLAKE2b-256 953e7cb06fcd446927a5a390a2fb6b218142c05c3e9ba365efbe907da15275d0

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page