build(ci): add Dependabot configuration for all package ecosystems - #9089
build(ci): add Dependabot configuration for all package ecosystems#9089DoDiODev wants to merge 2 commits into
Conversation
4a13a21 to
099c443
Compare
Open question for maintainers: automatic merging after a trial period?This pull request deliberately does not enable any form of automatic For context, since it is a common misconception: Dependabot itself cannot merge.
Two details make this cheap for this repository specifically: Dependabot pull The questions, concretely:
One optional addition that pairs well with this: Dependabot's If the answer to (1) is yes, we are happy to prepare that follow-up pull request |
099c443 to
f601196
Compare
Summary
Adds
.github/dependabot.ymlso that dependency updates arrive as reviewablepull requests instead of periodic manual audits.
This is a configuration-only change. No source file, build step or runtime
behaviour is touched, and rolling it back means deleting one file.
The configuration contains seven update entries across 19 directory entries:
gomod/backendgo.modnpm/config-uipackage.json+yarn.locknpm/e2epackage.json(no lockfile)pip/backend/python,/backend/python/pydevlake,/backend/python/plugins/azuredevops,/backend/python/test/fakeplugin,/grafana/scriptsrequirements.txt, 3 ×pyproject.toml+poetry.lockdocker/backend,/config-ui,/grafana,/devops/docker/lake-builder,/.devcontainer,/devops/deployment/k8sk8s-deploy.yamldocker-compose/,/.devcontainer,/devops/deployment/temporal,/backend/test/e2e/remotegithub-actions/.github/actions/auto-cherry-pickDesign decisions
Weekly schedule, five open pull requests per ecosystem. Enough to keep the
tree moving without flooding review capacity.
Minor and patch updates are grouped, majors stay separate. A grouped pull
request keeps low-risk churn to a single review; a major change deserves its own
discussion. This mirrors how the recent manual dependency batches were split.
commit-message.prefix: build(deps)..github/workflows/commit-msg.ymlrejects any commit that does not match its conventional-commit pattern. The
prefix was verified against that exact regular expression, including the grouped
form (
build(deps): bump the … group across 5 directories with 3 updates) andthe development-dependency form (
build(deps-dev): …).Language base images are pinned deliberately, so they are ignored. In Docker
tag semantics
python:3.11 → python:3.14andgolang:1.26 → golang:1.27areminor updates. They are not dependency bumps, though: the Python tag has to
match what the Poetry lockfiles resolve against, and the Go tag has to match the
godirective inbackend/go.modand the toolchain used by CI. Both aretherefore ignored for minor as well as major updates and remain a conscious,
manual decision.
nodeis ignored for majors only, because the build imagetracks the active LTS line and Node 26 is not an LTS release.
versioning-strategy: increasefor/e2e. That directory declares"@playwright/test": "^1.58.2"and has no lockfile. With the default strategyDependabot only rewrites a manifest once a release leaves the declared range, so
the entry would have produced nothing while still looking configured.
git2gois never bumped automatically. It is ABI-coupled to the libgit2version installed in the builder image; a mismatch fails at link time.
Action pinning
Most workflows reference actions by tag. The
docker/*actions are pinned to acommit SHA with a
# vX.Y.Zcomment, for example:Dependabot updates such a pin to the new commit SHA and rewrites the version
comment, so the pinning style is preserved rather than replaced by a tag.
Dependabot never proposes changing the namespace of an action. Moving to a
differently owned action stays a manual step, which matters here because ASF
infrastructure maintains an allow-list of permitted actions.
Files that are not valid workflows are not read at all — this includes
.github/workflows/codespell.yml.action-blocked-by-asfandgo-checklist.yml.bak. The blocked Codespell action is therefore left alone.Deferred upgrades
Every
ignoreentry carries a comment explaining why it exists, so it can beremoved once the reason no longer applies:
typescript(major)node(major)github.com/swaggo/swag(major)github.com/libgit2/git2go/*gomysql(major, Docker and Compose)26.7.0python,golang,devcontainers/go(major + minor)jenkins/jenkins,atlassian/jira-software,atlassian/bitbucket-serverin ComposeCompose files use their own ecosystem. The
docker-composeupdater coversdocker-compose.datasources.yml,.devcontainer/docker-compose.yml,devops/deployment/temporal/docker-compose-temporal.ymlandbackend/test/e2e/remote/docker-compose.test.yml. The three datasource imageslisted above are ignored; regular database image updates remain enabled, while
MySQL major changes remain a deliberate manual decision.
Not covered
Stating this explicitly, because a configuration file can otherwise suggest more
coverage than it provides:
docker-compose-dev-mysql.ymlanddocker-compose-dev-postgresql.yml— the Compose ecosystem exists, but itscurrent filename matcher accepts only one hyphenated segment after
compose; these two multi-suffix names are not fetched. Their database andOAuth2 Proxy images remain manual.
container:andservices:images — thegithub-actionsecosystem only updates
uses:references. Compose updates therefore stillrequire a consistency check against the database service images in CI.
backend/scripts/install-mockery.sh— a tool version inside a shellscript.
apache/skywalking-eyes@main— a branch reference rather than a version.backend/python/requirements.txt— without a versionconstraint there is nothing to raise.
Validation
dependabot-2.0.jsonschema (Draft 7) withno violations, which also confirms the plural
directorieskey and everyupdate-typesvalue used.Compose filename matcher was tested against all six non-release Compose
files: four match and the two documented dev files do not.
.github/workflows/commit-msg.ymlfor six representative bot commit forms.Verified on a fork before opening this PR
This configuration was run against a fork with version updates enabled. On
2026-09-01 it produced 17 pull requests across five ecosystems, which
confirms the behaviour that matters here:
js-minor-patchbundled 21 updates into a single PR,actions-minor-patchbundled 4, andpython-minor-patchbundled 3 across twodirectories. Major bumps stayed outside the groups, as intended.
github-actionsgroup PR rewrote SHAs to newSHAs and carried the
# vX.Y.Zcomment along, e.g.docker/setup-qemu-action@ce36039… # v4.0.0becamedocker/setup-qemu-action@96fe6ef… # v4.2.0. No pin was downgraded to a tag.versioning-strategy: increaseis required for/e2e. It producedupdate @playwright/test requirement from ^1.58.2 to ^1.62.1- a bump thatwould otherwise stay silent, because the new release already satisfies the
declared caret range and that directory has no lockfile.
ignorerules hold.typescriptis at 6.0.3 with 7.0.2 available andno PR was raised. The language images (
node,golang,python) werelikewise left alone.
open-pull-requests-limitthrottles. Thegithub-actionsecosystemstopped exactly at its limit of 5.
The Compose entry was exercised in a subsequent fork run on 2026-09-02. It
processed all four configured files. PostgreSQL was correctly proposed from
18.4-alpineto18.6-alpine, but MySQL was proposed from8.4.11to theunrelated numeric tag
26.7.0in all four directories. This surfaced one moreissue that is fixed in this branch:
mysqlnow ignoresversion-update:semver-majorin both thedockeranddocker-composeblocks. Patch and minor updates within the selected 8.4 LTSline remain enabled.
with zero violations and copied byte-for-byte to the fork test branch.
commented that MySQL was no longer being updated, and deleted all four head
branches. This is a direct behavioural test of the ignore rule rather than
only a schema check.
Two issues surfaced during that run and are already fixed in this branch:
dependency-name: mcr.microsoft.com/devcontainers/gonever matched, becauseDependabot strips the registry host from the dependency name. Using
devcontainers/gofixes it - after the change Dependabot closed thesuperfluous PR itself with "Looks like devcontainers/go is no longer being
updated by Dependabot".
labelswere dropped. Dependabot only creates its default labelsautomatically; labels named in the configuration must already exist, and none
of the ones originally chosen exist in this repository. Every PR carried a
"The following labels could not be found" warning. Without the key,
Dependabot applies and creates its defaults, so no repository setup is
required up front. Maintainers can add their own labels later if they want
them.
Known limitation: the
gomodecosystemThe sixth ecosystem,
gomod, could not be verified. It fails for a reason thatis independent of this configuration:
backend/mocks/is gitignored whiletracked sources such as
helpers/unithelperimport it, sogo mod tidycannotresolve those packages and Dependabot aborts after every version bump.
The same failure reproduces on a plain checkout without Dependabot involved:
Generating the mocks first makes
go mod tidyexit cleanly and leavesgo.modand
go.sumbyte-identical, so the module itself is consistent.This is tracked separately in #9088. Until it is
resolved, the
gomodblock in this file will not produce pull requests. It iskept in place so that Go updates start working as soon as the underlying issue
is fixed - reviewers may of course prefer to drop the block until then.
Rollback
Delete the file. Dependabot reevaluates open version-update pull requests when
the configuration changes and may close obsolete ones automatically, as the
fork test demonstrated for all four ignored MySQL-major pull requests. Any pull
request that remains open after reevaluation must be closed manually.