Publish an image for every service Compose can build, on both architectures - #365
Merged
Conversation
davidmckayv
requested review from
MikeRyanDev,
guidovizoso and
tylerslaton
as code owners
September 4, 2026 17:37
davidmckayv
force-pushed
the
images
branch
3 times, most recently
from
September 4, 2026 17:57
aeb4041 to
c87cbda
Compare
…ctures `ghcr.io/copilotkit/openbot` was the only image a release produced, so anything running the Compose stack built `agent-computer`, the supervisor, both Bots and the migration image from source on every machine: a toolchain, and several minutes of Chromium. Each is now published beside it at `ghcr.io/copilotkit/openbot-<service>`, carrying `linux/amd64` and `linux/arm64` so one reference works on a server and on an arm64 laptop. Built on native runners of each architecture and joined into a manifest list, rather than under QEMU, because emulated `bun install` and `vite build` are a known source of release-day flakiness and arm64 runners cost a public repository nothing. Each list gets its own build provenance attestation, and `container-images.json` pins a digest for all of them. Nothing changes for a checkout: unset, `COMPUTER_IMAGE`, `SUPERVISOR_IMAGE`, `BOT_IMAGE`, `LANGGRAPH_IMAGE` and `SERVER_IMAGE` name local tags and Compose builds them as before. Point them at published digests and set `IMAGE_PULL_POLICY=missing` to pull instead. That is deliberately not a promise that nothing is built, and the comment says so: a failed pull falls back to building, which suits a developer and not a machine without a toolchain. `.github/published-images.json` is the list, read by the publishing matrix and by CI, which now builds those five Dockerfiles and fails if the list stops matching the tree. Nothing built them before, because they are built by `docker compose up --build`, which only the smoke journey runs and which cannot run in CI, so a broken one surfaced during a release after the first image had already been pushed.
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.
P0 of the OpenBot Desktop build: publish the images instead of building them on the user's machine.
ghcr.io/copilotkit/openbotwas the only image a release produced, so anything running the Compose stack builtagent-computer, the supervisor, both Bots and the migration image from source on every machine. That needs a toolchain and several minutes, most of them Chromium.What this does
ghcr.io/copilotkit/openbot-<service>,linux/amd64andlinux/arm64, joined into one manifest list, each with its own build provenance attestation.container-images.json, and refuses to write the file if any is missing.SUPERVISOR_IMAGE,BOT_IMAGE,LANGGRAPH_IMAGEandSERVER_IMAGEalongside the existingCOMPUTER_IMAGE, plusIMAGE_PULL_POLICY, so a machine can pull those digests rather than build.Native arm64 runners rather than QEMU: emulated
bun installandvite buildare a known source of release-day flakiness, and arm64 runners cost a public repository nothing, so emulation would be slower and less reliable at no saving.Why CI now builds them
They are built by
docker compose up --build, which only the smoke journey runs and which cannot run in CI. So a brokensupervisor/Dockerfilesurfaced during a release, after theopenbotimage had already been pushed, whichdocs/releasing.mdalready calls out as the one failure that leaves a published image with nothing pointing at it..github/published-images.jsonis the single list, read by the publishing matrix and by CI, and CI fails if it stops matching the Dockerfiles in the tree. A Dockerfile the release does not publish is one a machine would build from source, and that failure is otherwise silent.Verified
component dockerfilesandimageboth pass on this PR. Thefull-cilabel did not exist in this repository until now, so theimagejob had never once run on a pull request despite being gated on that label since it was written.linux/arm64, locally. Nothing had ever built them for arm64; every base image (Playwright noble,oven/bun,spire-server) does publish it.imagetools createinto a tagged manifest list, both platforms present, both attestation manifests carried through with correctvnd.docker.reference.digestback-references, anddocker pull --platformworking for each from the merged tag.imagetools inspect --format '{{.Manifest.Digest}}'returns the list digest, checked against the raw manifest hash.IMAGE_PULL_POLICY: unset builds,missingpulls. It also falls back to building when the pull fails, which the comment and the docs now say, because that is right for a developer and wrong for a machine with no toolchain, where the useful answer is that the image could not be fetched. Anything shipping these to a machine that cannot build overrides thebuildsections away instead.Not verified
The publishing jobs themselves have not run:
ubuntu-24.04-armand the artifact hand-off between the matrix jobs are first exercised by the next release, which is also the first release whosecontainer-images.jsoncarries more than one image.