Skip to content

fix(ci): fail the certify gate closed when an app's dependencies do not install - #4738

Merged
cmgrote merged 1 commit into
christophergrote/fnd-4244from
christophergrote/fnd-4538
Nov 4, 2026
Merged

cmgrote merged 1 commit into
christophergrote/fnd-4244from
christophergrote/fnd-4538

Conversation

@cmgrote

@cmgrote cmgrote commented Nov 4, 2026

Copy link
Copy Markdown
Collaborator

Stacked on #4731. The base is christophergrote/fnd-4244; retarget to main once #4731 merges.

Fixes FND-4538.

Why

When uv sync failed in the certify job, contract drift and unit tests were skipped and the verdict still passed, with only a "Certification incomplete" warning. An app whose install always failed therefore published uncertified.

Before the gate could fail closed, the installs that fail for reasons outside the app had to be fixed:

  • Python drift. Certify used the runner's system python3, now 3.14. App images ship 3.13, from the golden base in the SDK Dockerfile that app-runtime-base is built from. Apps with no .python-version built wheel-less pins from source on 3.14: pyarrow==20.0.0 failed in cmake, and pandas, numpy and duckdb ran past the 30-minute cap.
  • Native headers. hive's pykerberos needs libkrb5-dev. tests-reusable already takes an apt-packages input for this, but build-and-publish-app had no equivalent.

What

  • certify.py verdict blocks publish when the app install fails, whether in certify itself or in any certify-unit leg. An app with no tests/unit still passes.
  • certify_unit_shards.py verdict now reports install_failed instead of folding it into skipped.
  • certify and certify-unit set UV_PYTHON from container_python_version.py print-version. This is the same source of truth the SDK's own test workflows use, and it overrides an app's .python-version. certify-unit's sparse SDK checkout now includes /Dockerfile.
  • New apt_packages input (default empty), installed before uv sync in both jobs. The guard is byte-identical to tests-reusable's.
  • docs/standards/app-certification.md is updated.

Tests

  • test_build_and_publish_certify_wiring.py (new) asserts step order and env routing. It also executes the pin step against an SDK laid out as the job checks it out, including the case with no golden tag, where the step must fail rather than export an empty value. It executes the apt guard as well.
  • Verdict tests cover both cases: an install failure blocks, and a missing tests/unit passes.
  • Red-green: 29 of the new or changed tests fail against the parent commit and pass here.
  • On x86_64-manylinux_2_28, pyarrow==20.0.0, pandas==2.3.0, numpy==2.3.1 and duckdb==1.3.1 all resolve to wheels on 3.13. pyarrow==20.0.0 has no wheel on 3.14.

Rollout

Callers use @main, so this takes effect for every app on merge. hive must pass apt_packages: "libkrb5-dev gcc python3-dev"; a companion PR in that repo is ready to merge straight after this one. publish and discovery are fixed by the Python pin alone. The earlier intermittent install failures in two other apps were not reproduced in their recent runs.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AbKqGawV8xf6jHvYupy2hA

…ot install

The certify job passed with only a "Certification incomplete" warning when
`uv sync` failed, so an app whose install always failed published without
contract-drift or unit-test certification.

- certify.py verdict blocks publish when the app install fails, in certify
  or in any certify-unit leg. An app with no tests/unit still passes.
- certify_unit_shards.py reports install_failed separately from skipped,
  so the verdict can tell "could not run" from "nothing to run".
- Both certify jobs pin UV_PYTHON to the app image's Python (the SDK
  Dockerfile's golden tag, via container_python_version.py). Unpinned, they
  used the runner's system 3.14 while images ship 3.13, and apps with no
  .python-version built wheel-less deps (pyarrow 20, pandas, numpy) from
  source and failed.
- New apt_packages input installs native build headers (hive's pykerberos
  needs libkrb5-dev) before uv sync, behind the same allowlist guard as
  tests-reusable.yaml's apt-packages, pinned byte-identical by a test.
@linear

linear Bot commented Nov 4, 2026

Copy link
Copy Markdown

FND-4538

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