Reusable CLI that runs dependabot/cli update jobs against a git repo and turns the results into real pull/merge requests — across Bitbucket Cloud and GitLab, without copying scripts into every repo.
| Provider | Status | Notes |
|---|---|---|
| Bitbucket Cloud | ✅ | writes files via the src API, opens PRs via /pullrequests |
| GitLab (SaaS or self-hosted) | ✅ | writes files via the Commits API, opens MRs via /merge_requests |
Provider is auto-detected from CI environment variables (Bitbucket Pipelines sets
BITBUCKET_WORKSPACE; GitLab CI sets CI_PROJECT_ID/GITLAB_CI), so most repos never
need to configure it explicitly. Override with GIT_PROVIDER=bitbucket or
GIT_PROVIDER=gitlab if you ever need to force it.
Adding a new provider means implementing the interface in src/providers/bitbucket.mjs /
src/providers/gitlab.mjs (getContext, buildSourceBlock, buildGitSourceCredential,
getDefaultBranch, commitFiles, findOpenPr, createPullRequest, closePullRequest)
and registering it in src/providers/index.mjs — src/run-updates.mjs and
src/create-prs.mjs don't need to change at all.
Copy templates/bitbucket-pipelines.yml -> bitbucket-pipelines.yml and
templates/dependabot-config.json -> dependabot-config.json. Set the three repository
variables listed in the template's header comment, then trigger the dependabot-update
custom pipeline manually or on a schedule (Repo settings -> Pipelines -> Schedules).
Copy templates/gitlab-ci.yml -> .gitlab-ci.yml and templates/dependabot-config.json
-> dependabot-config.json. Set the CI/CD variables listed in the template's header
comment (Settings -> CI/CD -> Variables), then trigger it manually ("Run pipeline") or on
a schedule (Build -> Pipeline schedules).
Either way: no scripts to copy, no logic to keep in sync. Behaviour for every repo comes from bumping this package's version.
Reads ./dependabot-config.json in the current working directory, builds a job
description per entry (using the detected provider's source block + git_source
credential), and runs dependabot update, writing .dependabot-run/output-N.yaml + a
manifest.json describing what ran.
Reads .dependabot-run/manifest.json (or explicit output-*.yaml paths passed as
arguments) and turns each recorded create_pull_request / update_pull_request /
close_pull_request entry into a real PR/MR via the detected provider — no local git
clone needed.
Filters applied automatically, on every provider:
- Skips
update_dependency_list/mark_as_processedentries (informational, not PR actions). - Skips transitive-only dependency bumps by default (updates that only touch a lockfile,
never the manifest) — otherwise
npm_and_yarnin particular can produce 100+ PRs for a small project. SetSKIP_TRANSITIVE_ONLY_UPDATES=falseto disable. - Truncates PR/MR descriptions over ~30KB (release notes for monorepo packages like
@aws-sdk/*can be huge; Bitbucket in particular rejects descriptions over ~32KB).
DRY_RUN=true runs fully offline and just logs what it would do, for either provider.
Each provider checks its own env var names first, falling back to the generic
GIT_READ_TOKEN / GIT_WRITE_TOKEN if unset - handy if you'd rather configure tokens
once and reuse the same CI/CD variable names across providers.
| Bitbucket | GitLab | |
|---|---|---|
| Read (used by the updater itself) | BITBUCKET_GIT_TOKEN |
GITLAB_TOKEN |
| Write (used to open PRs/MRs) | BITBUCKET_PR_TOKEN |
GITLAB_PR_TOKEN (falls back to GITLAB_TOKEN) |
npm install
npm testUnit tests (mocha + chai + sinon) live in test/:
test/lib/format.test.mjs- pure helpers (branch naming, title/body generation, truncation, the transitive-dependency filter).test/providers/bitbucket.test.mjs,test/providers/gitlab.test.mjs- each provider's API calls, withfetchstubbed via sinon so nothing touches the network.test/providers/index.test.mjs- provider auto-detection.test/create-prs.test.mjs,test/run-updates.test.mjs- the orchestration logic, using a fake provider object so these tests exercise the actual routing/filtering decisions without depending on any specific provider's implementation.
npm install
npm link # makes dependabot-run-updates / dependabot-create-prs available globally
cd /path/to/some/other/repo
npm link dependabot-for-git
BITBUCKET_WORKSPACE=... BITBUCKET_REPO_SLUG=... ... dependabot-run-updatesThe dependabot CLI's job/output schema isn't formally documented. The Bitbucket field
names this package relies on (updated-dependency-files, pr-title, pr-body,
commit-message, etc.) were confirmed against real output from dependabot-cli; the
GitLab source block schema was confirmed against the upstream CLI's own README and a
GitHub issue showing a real GitLab job description, but hasn't been exercised against a
live GitLab run the way the Bitbucket path has. If your fork diverges further, re-check
src/create-prs.mjs and the relevant src/providers/*.mjs against a fresh output.yaml,
ideally with DRY_RUN=true first.