Skip to content

docker-publish.yml smoke step proves the CLI resolved but not that the image's SQL drivers did #14701

Description

@os-trump

Found while implementing the ruling on #14510 (PR #14699). Filed unassigned, not fixed there — the file is outside that card's fence.

What is missing

The runtime image now installs pg and mysql2 alongside the CLI, and docker/README.md publishes that list as a maintained public promise. PR #14699 pins the two files against each other (check-docs-image-tag grew a limb that fails when the install line and the published table disagree), so the promise cannot drift within the repo.

Nothing yet asserts the drivers are actually in the built image. The ruling on #14510 named that pin explicitly:

Pins: the image probe (node -e "require('pg'); require('mysql2')" inside the built image) is green

It could not be satisfied in the execution lane: no Docker daemon in the container, and ghcr.io blob reads are refused by egress policy, so the reading there is honestly NOT MEASURED. It is cheap in CI, where the image already exists.

Where it goes

.github/workflows/docker-publish.yml already pulls and runs the pushed image:

      - name: Smoke-test the pushed image (amd64)
        # `os --version` proves the CLI resolved, installed, and runs on the
        # pushed image; a boot test needs an artifact + DB and belongs to the
        # examples/e2e suites, not here.
        run: |
          docker pull "$IMAGE:$VERSION"
          docker run --rm "$IMAGE:$VERSION" os --version

The comment's own reasoning extends to the drivers exactly: require() proves they resolved and installed, and needs no artifact and no database. One line:

          docker run --rm "$IMAGE:$VERSION" node -e "require('pg'); require('mysql2')"

Why it is worth the line

The install currently has no failure mode anyone would notice. npm install -g of a package that resolves to nothing an ObjectStack path imports still exits 0; a future refactor that moves the install into a stage the runtime layer does not carry — the exact shape #14510 describes for the scaffolder's generated Dockerfile, where the runtime stage copies only dist/objectstack.json — would publish a green build of an image whose README promises a driver it does not have. The in-repo gate cannot see that: it compares two files, and both would still agree.

The failure this closes is also the expensive one, because it lands on the first run of a new install. Whoever picks this up should ideally also read the assertion in the other direction once (confirm the probe goes red against an image built without the drivers), since a probe that cannot fail is the same vacuous green the in-repo limb has an explicit rule against.

Not urgent and not a blocker for #14699, which is honest about what it does and does not measure.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions