Skip to main content

depdelta-cli

PyPI CI License: MIT

Know what a dependency update breaks before you merge, on Gerrit and GitLab.

DepDelta reads every release's notes, security advisories and published API between two versions of a package, and says what changed and what will break: see eslint 8.57.0 → 9.0.0 for an example. depdelta brings that review to your CI. On every change that updates a dependency (from Renovate or anyone) it posts the breaking changes, security fixes, removed APIs and where your code uses them, right on the change.

On GitHub, the DepDelta GitHub app does this with no CI job. Setup guide, example review and FAQ: depdelta.com/ci.

How it works

On every change that touches a manifest or lockfile, depdelta:

  1. sends the changed manifests and lockfiles (both ends) to DepDelta. Source code is never sent;
  2. gets back each update's verdict and, for npm and Maven, the declarations it removes or changes;
  3. looks for those declarations in the checkout, and sends only the hits (path, line, symbol);
  4. posts the review: a Gerrit change message (no vote), or one GitLab merge request note that later pipelines edit in place. Each update links to its full comparison on depdelta.com.

Beyond each update, the review says what the change does to your lockfiles: packages before and after, new and removed direct dependencies (dev or production, and what each pulls in), and packages that newly run code at install time (an npm install script, a Python package built from source, a Composer plugin, a Cargo build script).

Nine ecosystems: npm, PyPI, Maven, Composer, Cargo, RubyGems, pub.dev, NuGet and Go. For Android and other Gradle builds that means build.gradle(.kts), settings.gradle(.kts), version catalogs (gradle/libs.versions.toml, libraries and plugins) and gradle.lockfile; plugins count as updates too (AGP, Kotlin, KSP, Hilt). Needs Python 3.11+ and git, nothing else.

docker pull ghcr.io/mbobiosio/depdelta-cli:latest
# or
pip install depdelta-cli

API key

Sign in at depdelta.com with GitHub or Google, make a key in Settings → API keys for CI, and store it in your CI's secrets as DEPDELTA_API_KEY. Each key gets 240 reviews an hour, waiting on release notes included.

Jenkins with Gerrit Trigger

The job runs on patchset-created. Gerrit Trigger sets GERRIT_PROJECT, GERRIT_CHANGE_NUMBER, GERRIT_PATCHSET_REVISION and GERRIT_CHANGE_URL. The review is posted with a Gerrit account's HTTP password: a service account works best.

The checkout needs the patch set's parent: don't clone with depth 1 (or let depdelta fetch it; it does when the parent is missing).

pipeline {
  agent { docker { image 'ghcr.io/mbobiosio/depdelta-cli:latest' } }
  stages {
    stage('DepDelta') {
      steps {
        withCredentials([
          string(credentialsId: 'depdelta-api-key', variable: 'DEPDELTA_API_KEY'),
          usernamePassword(credentialsId: 'gerrit-http',
                           usernameVariable: 'GERRIT_HTTP_USER',
                           passwordVariable: 'GERRIT_HTTP_PASSWORD'),
        ]) {
          // A DepDelta outage shouldn't fail the build.
          catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
            sh 'depdelta'
          }
        }
      }
    }
  }
}

Without Docker: pip install depdelta-cli on the agent, then the same sh 'depdelta'.

DEPDELTA_GERRIT_URL overrides Gerrit's address when GERRIT_CHANGE_URL isn't the REST root (a proxy, a different host name for agents).

Messages carry the tag autogenerated:depdelta, so Gerrit folds older patch sets' reviews away, and notify only the change owner.

GitLab CI

Runs in merge request pipelines. CI_JOB_TOKEN can't write notes: give the job a project access token with the api scope (Reporter role is enough) as GITLAB_TOKEN.

depdelta:
  image: ghcr.io/mbobiosio/depdelta-cli:latest
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
      changes:
        - "**/package.json"
        - "**/package-lock.json"
        - "**/pom.xml"
        - "**/requirements*.txt"
        - "**/pyproject.toml"
        - "**/*.lock"
        - "**/go.mod"
  variables:
    GIT_DEPTH: 0
  script:
    - depdelta
  allow_failure: true

Uses link to the files at the merge request's head commit.

Options

depdelta [--repo .] [--base REV --head REV] [--print]
         [--format markdown|text] [--wait 300]
         [--fail-on never|breaking|review|unknown|safe]
         [--api-url URL]
  • --print prints the review instead of posting it. With --base and --head (outside CI) it always prints: depdelta --base origin/main --head HEAD.
  • --wait is how long to wait for DepDelta to read release notes it hasn't seen yet. After that the review posts as it stands, saying what is still being read.
  • --fail-on breaking exits 1 when an update is breaking, to fail the job.

Exit status: 0 posted (or nothing to review), 1 the --fail-on verdict was met or .depdelta.yml blocks new install-time code, 2 it couldn't review or post.

.depdelta.yml

An optional file at the repository root, read at the change's head commit. The GitHub app reads the same file.

install_scripts: warn        # off | warn (default) | block
allow_install_scripts:       # never flagged
  - esbuild
  - sharp
  • warn flags each package that newly runs code at install.
  • block flags them too, and depdelta exits 1, so the job fails until the package is allowed or removed.
  • off leaves install-time code out of the review.

depdelta sends the file as it is; DepDelta reads it. A file it can't read falls back to the defaults, and the review says why.

Privacy

Only the changed manifests and lockfiles leave CI, plus, for updates with removed or changed APIs, the path, line and symbol of each use found. The source code stays in CI. Gerrit and GitLab credentials are sent only to your Gerrit or GitLab. The privacy policy has the details.

Development

uv sync
make check format test

src/depdelta_cli/usage.py is the same usage matcher the DepDelta service and GitHub app run, and manifests.py uses the same manifest names: changes to either start in the service, then are copied here.

Releases: bump version in pyproject.toml, then tag v<version> and push the tag. GitHub Actions publishes to PyPI and GHCR.

License

MIT

Metadata

Release files for depdelta-cli 0.2.0

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

Source distribution (sdist)

Source distribution for depdelta-cli 0.2.0
File Size Uploaded Provenance Actions
depdelta_cli-0.2.0.tar.gz 49.4 kB With provenance Details for depdelta_cli-0.2.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for depdelta-cli 0.2.0
File Interpreter ABI Platform Actions
depdelta_cli-0.2.0-py3-none-any.whl Python 3 none any Details for depdelta_cli-0.2.0-py3-none-any.whl

Total release size: 73.6 kB

Release files / depdelta_cli-0.2.0.tar.gz

Download URL depdelta_cli-0.2.0.tar.gz
Size 49.4 kB
Tags Source
SHA-256 checksum
How to use checksums
82e0a58e7320ae9067b671a359cda6def14180e50b7da24aff0cb09c8d63c998
BLAKE2b-256 checksum
How to use checksums
3662dea65e2c4b587e63175978bb4b8f05fd208437a950fc7afa24e4240d0759
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Oct 25, 2026.

Transparency log

Release files / depdelta_cli-0.2.0-py3-none-any.whl

Download URL depdelta_cli-0.2.0-py3-none-any.whl
Size 24.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e2e3fb2c6ca8714c6f8d903de1c8d06440641b498fcc1a84a339048eb06e8275
BLAKE2b-256 checksum
How to use checksums
f8c872cf7ced5f319528f754f9be054016ef34ea7035c3665c61d5ee5d4d2bc2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

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 Oct 25, 2026.

Transparency log

Security for depdelta-cli 0.2.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for depdelta_cli-0.2.0.tar.gz

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 Oct 25, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

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