test(e2e): wire google-adk into the runtime e2e suite #2012
Reference in New Issue
Block a user
Delete Branch "e2e/google-adk-ci-wiring"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Wire the
google-adkruntime into the e2e suite so it is continuously exercised like the other runtimes. google-adk was fully registered (manifest, provisionerknownRuntimes, canvas, CPruntimeImagePinTemplates+allowedRuntimes) and its image is published + pinned — but it had zero e2e coverage. This closes that gap.Changes
scripts/test-all-runtimes-a2a-e2e.sh(the all-runtimes A2A parity harness)GOOGLE_API_KEY→ workspace secret), wait-online loop (already${!WS_IDS[@]}), A2A round-trip (§4), session-continuity (§5 — ADKInMemorySessionServicekeyed on A2Acontext_id).SKIP_GOOGLE_ADKguard + aGOOGLE_API_KEYpre-req check, mirroring the existingSKIP_*/OPENROUTER_API_KEYpatterns..gitea/workflows/e2e-staging-saas.yml+.gitea/workflows/continuous-synth-e2e.ymlgoogle-adk)per-runtime LLM-key case (expectsMOLECULE_STAGING_GOOGLE_API_KEY), theE2E_GOOGLE_API_KEYenv wiring, and the gemini model slug. Identical dispatch-gated shape to the existingcodex/hermes/langgraphcases (Gitea 1.22.6 dropsworkflow_dispatch.inputs, so these run viaE2E_RUNTIME).Auth note (deliberate)
PROD disallows API keys (org policy) → Gemini runs via Vertex AI + ADC there. CI uses the keyed AI-Studio path (config model
google_genai:gemini-2.5-pro) because it needs no GCP service-account plumbing in the runner. Vertex stays the supported prod path; this is the CI-only keyed path. Documented in-file.Follow-up (not in this PR)
MOLECULE_STAGING_GOOGLE_API_KEYrepo secret must be set for a green google-adk run (the workflow hard-fails clean with the missing-secret message until then — same as the other runtimes before their keys existed).canary-release.md), so that's a separate throwaway-tenant exercise — tracked separately.🤖 Generated with Claude Code
Review: core-devops (independent — not the author)
APPROVED. Genuine review of the google-adk e2e test-wiring. Findings:
(a) Harness bash (scripts/test-all-runtimes-a2a-e2e.sh) — correct and pattern-consistent.
bash -nclean; CI "Shellcheck (E2E scripts)" is green.GOOGLE_ADK_KEY="${GOOGLE_API_KEY:-}"mirrorsPEER_OPENAI_KEY. Provision (provision "ParityGoogleADK" "google-adk" ...), key-injection (set_secret … GOOGLE_API_KEY, double-guarded on WS id + key non-empty), and the §4/§5 loop additions all follow the openclaw/claude-code shape exactly.ifkeyed onSKIP_GOOGLE_ADKalone — right granularity, since google-adk has its own key rather than sharing the OpenRouter key that the hermes/codex/openclaw OR-guard covers.max=180for the first cold ADK pull is reasonable (hermes is 120); loop is already${!WS_IDS[@]}-driven.(b) Workflow YAML (e2e-staging-saas.yml + continuous-synth-e2e.yml) — valid + consistent.
google-adk)LLM-key case (MOLECULE_STAGING_GOOGLE_API_KEY→E2E_GOOGLE_API_KEY) is byte-identical in shape to the existing codex/hermes cases.E2E_MODEL_SLUGternary extension is correct: verified in the live run it evaluated toMiniMax-M2on the default (no-input) path, so the newgoogle-adkbranch only fires underE2E_RUNTIME=google-adk.workflow_dispatch.inputsshape.(c) Auth model — consistent in the diff and commit body across all three sites: PROD = Vertex AI + ADC (org disallows API keys); CI = keyed AI-Studio path with config model
google_genai:gemini-2.5-pro. The workspace secret written isGOOGLE_API_KEY, matching the slug.CI combined state = failure, but no failure is attributable to this PR:
qa-review/approved+security-review/approved: normal pre-review red gates (flip to success on approval).lint-continue-on-error-tracking: repo-wide — 37 violations across 57 workflow files because trackermc#774is now 16 days old (>14d cap). Flags files this PR never touched; the diff adds zerocontinue-on-errordirectives. Pre-existing, blocks every open PR until mc#774 is renewed. Not this PR's defect.E2E Staging SaaS (full lifecycle): ran on the default claude-code / MiniMax-M2 path (no dispatch input), not google-adk. It failed on a staging-infra flake — workspace31c8a8cf…"transiently failed — bootstrap-watcher deadline (cp#245)". Unrelated to this wiring.Follow-up (not blocking, as the PR notes): a fully-green google-adk staging run additionally needs the google-adk template image in the staging ECR account + a staging-CP google-adk pin (#2003 workspace-server image + canary tenant). Confirmed
MOLECULE_STAGING_GOOGLE_API_KEYIS already set in the runner env (evaluated to a non-empty secret in the live run), so that follow-up item is satisfied.Test-only change, no production code touched. Approving.
Independent 2nd review (QA/coverage lens) — APPROVED
Reviewed the full PR diff against base, plus the script at HEAD
947cc73and both workflow files. Test-only change; wiresgoogle-adkinto the runtime E2E suite mirroring the codex/hermes/langgraph pattern.(a) Consistency — coverage fully wired, not half:
google-adk is present at every site the other runtimes appear in
scripts/test-all-runtimes-a2a-e2e.sh:GOOGLE_ADK_KEYcapture (L38, L57)WS_IDS[google-adk], L176)set_secret … GOOGLE_API_KEY, guarded by WS-id presence, L194-198)${!WS_IDS[@]}, with the 180-iter cold-pull override at L213)No gaps.
(b) Guard correctness:
if [ -z "$GOOGLE_ADK_KEY" ] && [ -z "${SKIP_GOOGLE_ADK:-}" ]; then exit 2— hard-fails loudly when the key is absent and the runtime is not skipped (no silent pass), and is cleanly bypassed bySKIP_GOOGLE_ADK=1(no spurious fail). The key-injection block is independently guarded by[ -n "${WS_IDS[google-adk]:-}" ], so it no-ops under skip. Correct.(c) Workflow per-runtime auth cases:
Both
continuous-synth-e2e.ymlande2e-staging-saas.ymladd agoogle-adk)case with the correct secretMOLECULE_STAGING_GOOGLE_API_KEY→E2E_GOOGLE_API_KEY, properly;;-terminated, matching the codex/hermes shape. Both files YAML-parse clean. TheE2E_MODEL_SLUGternary correctly appendsgoogle-adk && 'google_genai:gemini-2.5-pro'ahead of the default — verified in the live run log it still evaluates toMiniMax-M2on the default claude-code path (no regression to the default). Note (non-blocking):workflow_dispatch.inputsare intentionally dropped in the Gitea port, sogithub.event.inputs.runtimeis inert under Gitea today and the google-adk branch is currently only reachable if inputs return — but this exactly mirrors the existing (also-inert) codex/hermes branches, and the author flags it in the inline comment. Consistent with precedent.(d) Session-continuity assertion justified:
google-adk genuinely preserves cross-turn state via ADK
InMemorySessionServicekeyed on the A2Acontext_id, so thecarol-recall PASS-expectation is legitimate (parity with the hermes plugin path), not a coin-flip. Justified.Required checks on
947cc73:CI / all-required (pull_request)— success ✓E2E API Smoke Test / E2E API Smoke Test (pull_request)— success ✓Handlers Postgres Integration / Handlers Postgres Integration (pull_request)— success ✓Non-blocking reds confirmed harmless:
lint-continue-on-error-trackingis the known pre-existing mc#774-age failure on untouched files;E2E Staging SaaS (full lifecycle) / E2E Staging SaaSiscontinue-on-error: true(RFC#219 §1, not the PR gate —pr-validateis, and it is green) and its failure is an unrelated bootstrap-watcher transient on the default claude-code/MiniMax path (cp#245), not the new google-adk wiring;qa-review/security-revieware review-gate sentinels that flip green once posted.Sound and well-scoped. Approving on the QA/coverage axis. Not merging.