Skip to content

ci: make the Tests workflow actually run, and gate the deploy-blockers - #120

Merged
dgokeeffe merged 1 commit into
mainfrom
ci/make-tests-actually-run
Aug 5, 2026
Merged

ci: make the Tests workflow actually run, and gate the deploy-blockers#120
dgokeeffe merged 1 commit into
mainfrom
ci/make-tests-actually-run

Conversation

@dgokeeffe

Copy link
Copy Markdown
Collaborator

CI has never run the test suite on this repo

The Tests workflow has exactly one run in its history — a manual workflow_dispatch in May — and that run has zero jobs. Dependency Audit and Update Lockfile have never produced a run at all.

Cause: all three target databrickslabs-protected-runner-group. That group is granted per-repo across the org (ucx, dqx, dlt-meta use it successfully) and this repo was never granted it, so jobs targeting it are never scheduled — silently, with nothing anywhere to notice.

What that already cost

Runners

test.yml, dependency-audit.yml, update-lockfile.ymlubuntu-latest. None need org secrets (first two read-only; the third uses only the repo-scoped GITHUB_TOKEN), and hosted runners are free for public repos.

release.yml is left on the protected group — it signs release artifacts, so it deserves a deliberate decision rather than a drive-by change. ⚠️ That means releases stay blocked until the repo is granted the runner group. Worth requesting from an org admin either way.

New gates, each tied to a failure that actually happened

Gate Catches
requirements.txt must be installable #84 / #115 / #116
requirements.lock must match requirements.txt the drift above
13 app modules must import boot-time breakage with no unit test
Floor on tests that actually ran #106 — a suite reporting "465 skipped" passes vacuously

Two bugs found while verifying this locally

  1. tests/e2e/conftest.py raised an uncaught FileNotFoundError when the databricks CLI is absent — surfacing as a pytest INTERNALERROR that kills the entire session. This workflow would have failed on its first run, since hosted runners don't have the CLI. Now treated as "prerequisite absent" → skip.

  2. tests/integration is excluded from the PR gate. It gates on Docker — and Docker is present on ubuntu-latest, so it would really run: building an apps-like image and executing the full setup pipeline (npm installs, CLI downloads). Confirmed locally that including it produces failures. Still runnable on demand.

Verification

Every step run locally, including with PATH stripped of the databricks CLI to simulate a hosted runner: 535 passed, 3 skipped.

Then each gate was confirmed to fail when its bug is reintroduced — the #84 pin, a truncated lockfile, and the #106 whole-session skip:

### Does the install gate catch the #84 breakage?   ✓ gate CATCHES it
### Does the lock gate catch drift?                ✓ gate CATCHES it
### Does the vacuous-suite guard catch #106?       ✓ gate CATCHES it  (parsed passed=0)

This PR should be the first thing on this repo whose CI actually goes green — which is itself the test.

CI has never run the test suite on this repo. The Tests workflow has exactly one
run in its history — a manual workflow_dispatch in May — and that run has zero
jobs. Dependency Audit and Update Lockfile have never produced a run at all.

Cause: all three target `databrickslabs-protected-runner-group`. That group is
granted per-repo across the org (ucx, dqx, dlt-meta and others use it
successfully) and this repo was never granted it, so jobs targeting it are
never scheduled — silently, with no failure anywhere to notice.

Consequences already observed:

- #84 bumped pydantic-core to 2.47.0 while pydantic==2.13.4 pins
  pydantic-core==2.46.4 exactly. requirements.txt became unsatisfiable, so
  every Databricks Apps deploy from main failed until #110 repaired it. GitHub
  reported the PR MERGEABLE; nothing installed requirements.txt.
- #115 and #116 were the same failure and were caught only by resolving them
  by hand.
- requirements.lock had drifted from requirements.txt, because Update Lockfile
  never ran. Regenerated here.

## Runners

test.yml, dependency-audit.yml and update-lockfile.yml move to ubuntu-latest.
None of them need org secrets — the first two are read-only, and the third uses
only the repo-scoped GITHUB_TOKEN. GitHub-hosted runners are free for public
repos. release.yml is left on the protected group: it signs release artifacts,
so it deserves a deliberate decision rather than a drive-by change (it also
means releases stay blocked until the repo is granted the group — noted in the
PR).

## New gates, each tied to a failure that actually happened

1. requirements.txt must be installable — catches the #84/#115/#116 class.
2. requirements.lock must match requirements.txt — catches the drift above.
3. App modules must import — 13 modules whose failure takes the app down at
   boot, most with no direct unit test.
4. A floor on tests that actually ran — a suite reporting "all skipped" passes
   vacuously, which is exactly what #106 fixed (465 skipped).

## Two bugs found while verifying the workflow locally

- tests/e2e/conftest.py raised an uncaught FileNotFoundError when the
  databricks CLI is absent. That surfaces as a pytest INTERNALERROR which kills
  the entire session — so this workflow would have failed on its first run on a
  hosted runner, where the CLI isn't installed. A missing CLI is now treated as
  "prerequisite absent" and skips.
- tests/integration is excluded from the PR gate. It gates on Docker, and
  Docker *is* present on ubuntu-latest, so it would really run: building an
  apps-like image and executing the full setup pipeline. Confirmed locally that
  including it produces failures. It stays runnable on demand.

## Verification

Every step was run locally, including with PATH stripped of the databricks CLI
to simulate a hosted runner: 535 passed, 3 skipped. Each of the four gates was
then confirmed to fail when its bug is reintroduced — the #84 pin, a truncated
lockfile, and the #106 whole-session skip.
@dgokeeffe

Copy link
Copy Markdown
Collaborator Author

Correction: the runner group was not the (only) cause

I claimed this PR would be the first thing here whose CI goes green. It isn't, and the diagnosis in the description is incomplete. Evidence after pushing:

# workflow_dispatch on this branch, with runs-on: ubuntu-latest
run 30997809499  status=queued  conclusion=null  jobs=0     (still queued after 3+ min)
# the original May run, on the protected group
run 25289678794  status=queued  conclusion=null  jobs=0     (queued since 2026-05-03)

So a run is created but no job is ever scheduled, and switching to ubuntu-latest does not change that.

It is not that hosted runners are unavailable to the repo. A GitHub-managed workflow in this very repo runs jobs on ubuntu-latest fine:

{"name": "update-pip-graph", "conclusion": "success",
 "labels": ["ubuntu-latest"], "runner_group_name": "GitHub Actions"}

The difference is that those runs have event: dynamic — they're injected by GitHub (Dependency Graph, Dependabot Updates), not defined in .github/workflows/. Repository-defined workflows are the ones that can't schedule a job. That points at an Actions policy on the repo or org, which I can't read (/actions/permissions → 403, needs admin) or change.

What this PR is and isn't

Still worth merging as-is — it's necessary but not sufficient:

It does not make CI run. Nobody should read a merge here as "CI is fixed".

Needed from someone with admin

  1. Repo → Settings → Actions → General — check Actions permissions (is it "Allow all actions", or a restrictive allow-list that blocks actions/checkout etc.?) and the runner policy.
  2. Org → Settings → Actions → Runner groups — whether this repo is granted databrickslabs-protected-runner-group (it evidently isn't; ucx/dqx/dlt-meta have it).
  3. Whichever is the org's intent, one of: grant the runner group (then revert the runs-on changes here), or permit hosted runners for repository workflows.

Note release.yml is still on the protected group, so releases are blocked too — worth resolving in the same request.

@dgokeeffe
dgokeeffe merged commit 00335ff into main Aug 5, 2026
@dgokeeffe
dgokeeffe deleted the ci/make-tests-actually-run branch August 5, 2026 11:08
dgokeeffe pushed a commit that referenced this pull request Aug 5, 2026
….17.0)

Closes #118, #120, #121, #122

- Session creation prompt: ask users to reuse existing sessions before creating new
- MAX_CONCURRENT_SESSIONS backend cap (env var, default 5) with TOCTOU-safe check
- Session count label in tab bar with updates on all create/close/exit paths
- xterm.js ClipboardAddon for OSC 52 (copy-paste inside Claude Code)
- Write batching with requestAnimationFrame to prevent escape sequence fragmentation
- Alternate screen exit detection (auto-clear after Claude Code no-flicker/vim)
- SIGWINCH-based reattach (force redraw by toggling terminal size)
- 429 error message with hint to increase MAX_CONCURRENT_SESSIONS
- Replaced mlflow-tracing with mlflow-skinny 3.10.1
- PTY read chunk 4096→65536 bytes
- Fixed repo name in deployment docs
- Version bump to 0.17.0
dgokeeffe added a commit that referenced this pull request Aug 5, 2026
#120)

CI has never run the test suite on this repo. The Tests workflow has exactly one
run in its history — a manual workflow_dispatch in May — and that run has zero
jobs. Dependency Audit and Update Lockfile have never produced a run at all.

Cause: all three target `databrickslabs-protected-runner-group`. That group is
granted per-repo across the org (ucx, dqx, dlt-meta and others use it
successfully) and this repo was never granted it, so jobs targeting it are
never scheduled — silently, with no failure anywhere to notice.

Consequences already observed:

- #84 bumped pydantic-core to 2.47.0 while pydantic==2.13.4 pins
  pydantic-core==2.46.4 exactly. requirements.txt became unsatisfiable, so
  every Databricks Apps deploy from main failed until #110 repaired it. GitHub
  reported the PR MERGEABLE; nothing installed requirements.txt.
- #115 and #116 were the same failure and were caught only by resolving them
  by hand.
- requirements.lock had drifted from requirements.txt, because Update Lockfile
  never ran. Regenerated here.

## Runners

test.yml, dependency-audit.yml and update-lockfile.yml move to ubuntu-latest.
None of them need org secrets — the first two are read-only, and the third uses
only the repo-scoped GITHUB_TOKEN. GitHub-hosted runners are free for public
repos. release.yml is left on the protected group: it signs release artifacts,
so it deserves a deliberate decision rather than a drive-by change (it also
means releases stay blocked until the repo is granted the group — noted in the
PR).

## New gates, each tied to a failure that actually happened

1. requirements.txt must be installable — catches the #84/#115/#116 class.
2. requirements.lock must match requirements.txt — catches the drift above.
3. App modules must import — 13 modules whose failure takes the app down at
   boot, most with no direct unit test.
4. A floor on tests that actually ran — a suite reporting "all skipped" passes
   vacuously, which is exactly what #106 fixed (465 skipped).

## Two bugs found while verifying the workflow locally

- tests/e2e/conftest.py raised an uncaught FileNotFoundError when the
  databricks CLI is absent. That surfaces as a pytest INTERNALERROR which kills
  the entire session — so this workflow would have failed on its first run on a
  hosted runner, where the CLI isn't installed. A missing CLI is now treated as
  "prerequisite absent" and skips.
- tests/integration is excluded from the PR gate. It gates on Docker, and
  Docker *is* present on ubuntu-latest, so it would really run: building an
  apps-like image and executing the full setup pipeline. Confirmed locally that
  including it produces failures. It stays runnable on demand.

## Verification

Every step was run locally, including with PATH stripped of the databricks CLI
to simulate a hosted runner: 535 passed, 3 skipped. Each of the four gates was
then confirmed to fail when its bug is reintroduced — the #84 pin, a truncated
lockfile, and the #106 whole-session skip.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant