Chore(ci): add Dependabot config for weekly grouped GitHub Actions updates - #650
Open
AmaadMartin wants to merge 2 commits into
Open
Chore(ci): add Dependabot config for weekly grouped GitHub Actions updates#650AmaadMartin wants to merge 2 commits into
AmaadMartin wants to merge 2 commits into
Conversation
added 2 commits
August 4, 2026 11:21
…dates adk-js has no .github/dependabot.yml and no renovate.json, so nothing in the repository advances the action references in .github/workflows. Enable Dependabot version updates for the github-actions ecosystem on a weekly schedule, collapsing every action bump into one grouped pull request. The updater handles both reference forms the repo will have: today's mutable tag pins, and the commit-SHA pins an in-flight change introduces (Dependabot rewrites the trailing version comment alongside the SHA). Group pattern is '*' rather than 'actions/*': five of the six actions the workflows consume are actions/*, and an actions/*-only group would leave googleapis/release-please-action to trickle in as a separate PR. The explicit chore(deps) commit prefix keeps release-please from treating CI-only bumps as releasable changes.
…t config Drop the header narration describing how Dependabot advances commit-SHA pins. Every uses: reference in .github/workflows is a tag pin at HEAD, so the comment hedged against a repo state that does not exist; the rationale for why the config also covers SHA pins belongs in the pull request description, not the file. Collapse the two-line commit-message comment to one line. Comments only: the parsed configuration is byte-identical.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Please ensure you have read the contribution guide before creating a pull request.
Link to Issue or Description of Change
N/A — no existing issue tracks this; the description below applies.
Problem:
adk-jsconsumes 12 GitHub Actionsuses:references (9 unique refs, 6 distinct actions) across its six workflow files, and has no.github/dependabot.ymland norenovate.json. Nothing in the repository advances those references, so an action pin only ever moves when a human notices. This is about to get worse: a separate in-flight change replaces the mutable tags with full 40-character commit SHAs, which is the right supply-chain hardening but has a well-known cost — a SHA never moves, so a pinned action freezes at whatever release it was pinned to and stops receiving upstream security and bug fixes.Solution: Add one new file,
.github/dependabot.yml, enabling Dependabot version updates for thegithub-actionsecosystem on a weekly schedule, with every action bump collapsed into a single grouped PR.This is a repository-configuration-only change. It adds no TypeScript, no runtime code, no dependency, and no workflow. The entire diff is one added file, 17 insertions.
Dependabot's
github-actionsupdater handles both reference forms this repo will have, so the config is correct today and stays correct after the SHA-pinning change lands — it is not blocked on it:actions/checkout@v4→actions/checkout@v6.Note that Dependabot security updates for known advisories already run without any config file; what this file gates is the routine version sweep.
Collision check
Checked all 548 open PRs on the fork before writing anything:
No open PR adds
.github/dependabot.yml. Five PRs mention "dependabot" in their title or body (#505, #507, #508, #574, #613); I checked each one's file list withgh pr diff <n> --name-onlyand none creates the file — they touch.github/workflows/*,.nvmrc,CONTRIBUTING.md, and manifests. I also checked every open PR that touches.github/(#403, #467, #504, #505, #507, #566, #613, #648): all of them edit existing workflow files only.This PR therefore branches from
mainrather than stacking. It overlaps by adjacency with the SHA-pinning PR #505 (and its follow-up #613), but does not conflict: those PRs edit.github/workflows/*and this one adds a file neither touches. This change deliberately modifies nothing under.github/workflows/, so it can merge in either order relative to #505.Design decisions (and rejected alternatives)
The exhaustive inventory these decisions rest on — nine
uses:references, six distinct actions, verified withgrep -rhoE 'uses: *[^ ]+' .github/workflows/ | sort -uat HEAD:actions/checkoutv3,v4,v6actions/github-scriptv6,v7actions/setup-nodev6actions/setup-gov5actions/setup-pythonv5googleapis/release-please-actionv4'*', not'actions/*'. Five of the six distinct actions areactions/*; anactions/*-only group would leavegoogleapis/release-please-actionto trickle in as its own separate PR for no benefit. Per the docs, dependencies matching no group rule are updated in individual PRs — with'*'there are no stragglers, and the steady state is exactly one PR per week.open-pull-requests-limitomitted. The documented default is 5. Because the'*'group collapses all bumps into a single PR, the practical steady state is one open PR, so an explicit limit would restate the default without changing behaviour. Omitting it keeps the file to only the keys that actually decide something.commit-message.prefix: 'chore(deps)'included. Without it Dependabot infers a prefix from commit history, which here is mixed (fix(core):,Feat:,chore(ci):) and so unpredictable.release-please-config.jsondeclares"release-type": "node", which parses conventional commits to build releases; pinning achorescope guarantees CI-only bumps never generate a release entry. It also matches existing precedent in this repo's history (fix(deps): declare dotenv in the workspace root manifest,Chore(deps): add @langchain/core and @langchain/langgraph as optional peers).npmandgomodecosystems are out of scope. Adding them is a materially larger and more debatable decision (566 KB lockfile, three workspaces, Go test clients) and belongs in its own change.labels,assignees,reviewers,target-branch,ignore, orcooldownkeys. Each would either restate a default or encode a policy nobody asked for. Dependabot applies its defaultdependencieslabel already.Style note: the file uses single-quoted scalars to match the existing convention under
.github/workflows/(go-version: '1.25',python-version: '3.11',name: 'CSAT survey ADK JS'), even though GitHub's published examples use double quotes. This is stylistic only; both parse identically. The file complies with.editorconfig(2-space indent, LF, UTF-8, trailing newline) and carries no license header —scripts/check_license.shscans only*.js/*.ts, and no existing file under.github/has one.Testing Plan
Please describe the tests that you ran to verify your changes. This is required for all PRs that are not small documentation or typo fixes.
Unit Tests:
[ ] I have added or updated unit tests for my change. — deliberately not applicable, justified below.
[ ] All unit tests pass locally. — not run: this change adds no executable code and no test targets it. Per the repo's targeted-testing guidance I ran only the checks that actually exercise the change (below), not the full suite.
No
*_test.tsfile was added, and that is a deliberate decision rather than an oversight. There are zero new lines of executable code, so there is no line, branch, or function coverage to add. Thevitestcoverage scope iscore/src/**,dev/src/**,integrations/src/**(seevitest.config.ts); a file under.github/is outside it and the coverage thresholds are unaffected. No repository-configuration test exists anywhere incore/test/,dev/test/,integrations/test/, ortests/— adding one would invent a new test category and would assert GitHub's schema rather than any adk-js behaviour.In place of unit tests I ran three deterministic local checks, and proved each one can fail by mutating the file.
Check 1 — the file parses as YAML (uses
js-yaml, already a declared dependency ofcoreanddevat^4.1.1; nothing was installed and neitherpackage.jsonnorpackage-lock.jsonwas touched):Check 2 — the parsed shape matches the Dependabot v2 schema for this ecosystem:
Check 3 — validated against the published Dependabot JSON Schema.
ajv-cliwas run as a throwawaynpx --yesinvocation; no dependency was added topackage.json. Two non-obvious details:ajv-clicannot fetch-sfrom a URL, so the schema is downloaded first; and--strict=falseis required because the published schema carries the vendor keywordx-intellij-enum-metadata, which ajv's strict mode rejects — that failure is a property of the schema, not of this config.Proving the checks can fail (mutation testing)
Three mutations were applied to the committed file and then fully reverted (
diffagainst a pristine copy confirms the committed file is byte-identical to the pre-mutation version; all three checks were re-run green afterwards).directory: '/'→'/.github/workflows'version: 2→version: 3package-ecosystem: 'github-actions'→'github-action'Mutation A is the important one.
/.github/workflowsis the plausible wrong value, and it is the quiet failure mode: the config stays valid but matches no manifests, so Dependabot silently opens nothing. Failure message:Under mutation A,
ajvstill reported.github/dependabot.yml valid— the schema typesdirectoryas a plainstringwith no constraint. That is precisely why check 2 exists rather than relying on schema validation alone, and why thedirectory === '/'assertion is the one with real signal. Per the docs: "For GitHub Actions, use the value/. Dependabot will search the/.github/workflowsdirectory, as well as theaction.yml/action.yamlfile from the root directory."Mutations B and C exist to prove check 3 is not a rubber stamp, and to ground the two literal values it validates. B:
must be equal to constant. C:must be equal to one of the allowed values— confirminggithub-actionsis a real enum member of the published schema rather than a value written from memory.CI impact, verified rather than assumed.
validation.yamlrunsnpx secretlint "**/*", which is the only CI step that scans this file. Run against the new file with the repo's own.secretlintrc.json: exit 0, no findings (the file contains no credentials, and no token or registry stanza was added).scripts/check_license.shpasses — run locally, and it scans only*.js/*.tsso the new YAML is not considered.npm run lint(eslint "**/*.ts"),npm run format:check(prettier "**/*.ts" --check),build,test:coverage, anddocs:checkare all TypeScript-scoped and cannot see this file;prettierwas deliberately not run against it.cross-language-integration.ymlis untouched.Diff hygiene, verified:
Nothing under
.github/workflows/is modified,package.jsonandpackage-lock.jsonare untouched, no suppressions (any,@ts-expect-error,eslint-disable) are introduced, and noCHANGELOG.mdor patch artifacts appear.Manual End-to-End (E2E) Tests:
Please provide instructions on how to manually test your changes, including any necessary setup or configuration.
This cannot be completed from a pull-request branch, by construction. Dependabot reads
.github/dependabot.ymlfrom the repository's default branch only, and version updates are not enabled automatically on forks — a fork owner must turn them on explicitly under Settings → Advanced Security → Dependabot → Dependabot version updates → Enable. The three checks above are the pre-merge substitute.Post-merge acceptance step, for a maintainer (or for the fork owner on a fork whose default branch carries the file):
github-actionsrow with a "Last checked" timestamp and no configuration-error banner. A red banner there is the single authoritative signal that the file is wrong.chore(deps): bump the github-actions group with N updates. Dependabot applies a default 3-day cooldown to version updates, so a very recently released action version may not appear in the first sweep — that is expected, not a configuration fault.To revert: delete the file. To pause without deleting: set
open-pull-requests-limit: 0.Checklist
[x] I have read the CONTRIBUTING.md document.
[x] I have performed a self-review of my own code.
[x] I have commented my code, particularly in hard-to-understand areas.
[ ] I have added tests that prove my fix is effective or that my feature works. — no test file added (zero new executable lines); replaced by three mutation-proven verification checks, justified in the Testing Plan.
[ ] New and existing unit tests pass locally with my changes. — the repo unit suite was not run; no test targets this change.
CI result on this PR
All checks green on the revised commit
2c00a348, including the real test jobs (not just the trivial ones):run-tests (ubuntu-latest)run-tests (macos-latest)run-tests (windows-latest)run-tests(cross-language)check-licenseRevision after complexity review
A complexity reviewer flagged the file's comments (not its configuration). Both findings were valid and are fixed in
Chore(ci): trim speculative and redundant comments from the Dependabot config:grep -rhoE 'uses: *[^ ]+@[0-9a-f]{40}' .github/workflows/returns nothing — everyuses:reference at HEAD is a tag pin, so the comment hedged against a repo state that does not exist. The SHA-pin rationale is real and still matters, but it belongs in this PR description (above), not in the file. Kept the one-line purpose statement and the schema link.commit-messagecomment to one line. Same information, one line.The comment on
directory: '/'was explicitly kept — it documents the genuine footgun that/means.github/workflowsfor this ecosystem, which is exactly what mutation A below proves is worth guarding.Net −4 lines: 21 → 17. The change is comments only, and this was verified rather than assumed — the parsed output of the before and after files is byte-identical:
All checks were re-run green on the revised file: check 1 (YAML parse), check 2 (shape assertion), check 3 (
ajv→.github/dependabot.yml valid),secretlint(exit 0), andscripts/check_license.sh. Mutation A was re-applied to the revised file to confirm the revision did not weaken the checks — check 2 still fails withactual: '/.github/workflows', expected: '/'— then fully reverted, with the file verified byte-identical to its pre-mutation state.