Repository navigation
Release v3.0.0
Changes
Breaking
-
Challenges that are not services no longer get instances.
cmgrnow derives a
delivery_typefor every challenge (service,artifact_only, orflag_only) from
whether it publishes ports and which challenge type it uses. Onlyservicechallenges
run instances: builds of artifact-only and flag-only challenges always report an empty
instanceslist, andPOST /builds/<id>(start instance) fails for them. Previously
every build launched a placeholder container.- API consumers must branch on
delivery_type. An empty instance list is only a
deployment problem whendelivery_typeisserviceandinstance_countis
positive; on-demand builds (instance_countof-1) legitimately have zero
instances between user sessions. - Placeholder instances left over from older versions are torn down on the next schema
update or challenge rebuild. cmgr testandcmgr playtestskip the start/stop steps for non-service challenges
and run the solver directly against the build.
- API consumers must branch on
-
Docker image tags are now content-addressed. Tags changed from
<challenge>:<build_id>-<host>to<challenge>:s<seed>-<checksum>-<host>, where the
checksum covers the challenge source and flag format. Build IDs are local database
handles and no longer appear in tags, so rebuilt content gets a new tag instead of
mutating one in place (making challenge images safe to push to a registry). Anything
that reconstructs image tags from build IDs must be updated. Existing images are
retagged automatically by a one-time, resumable migration on first start. -
Built-in challenge types now build on
ubuntu:24.04(wasubuntu:20.04). This
affectsremote-make,static-make, and the solver image. Existing challenges may
need updating for OpenSSL 3.x, PEP 668 (pipnow runs with
--break-system-packages), and renamed distro packages.
New features
flag-onlychallenge type for challenges that are nothing but a submission prompt
— no service, no downloads (knowledge checks, second flags exported by a sibling
challenge). The build's only product ismetadata.json; aMakefileis optional, and
theSEEDbuild argument allows per-build shuffling of option lists. Exempt from
cmgr test --require-solve, since the flag is the answer. See
examples/flag-only/.POST /builds/<id>/checkruns the automated solver against a non-service build
without an instance, mirroring the existing instance check. Service builds are
rejected.cmgr test --require-solveuses the same path.cmgr update --prune-olduntags the image generation each rebuild displaces from
its rollback slot. Off by default, since anothercmgrdatabase on the same Docker
daemon may reference those tags. Removal is refcount-guarded; the current and previous
generations are always retained.cmgr test --keep-imagesretains build images until the whole run finishes so
challenges can share base layers — a large speedup when testing a directory of
challenges. Used by CI.- Builds now report
checksumandprev_checksum(the retained rollback generation)
through the API, and images carrycmgr.managed/cmgr.challengelabels. cmgr updateprints a delivery-type summary, so a challenge that is unexpectedly
artifact-only (a forgotten# PUBLISH) is visible before deployment. A challenge that
publishes neither ports nor artifacts logs a warning.
Fixes
- Docker build failures are no longer swallowed. Modern daemons emit an
errorkey
beforeerrorDetail; the old anchored pattern missed it and surfaced every build,
push, and pull failure as a misleading "No such image". cmgr updatenow warns when a challenge's on-disk source has drifted but its builds
are already complete, closing the gap where updating a schema left stale images in
place.- Artifact extraction works against images with no
CMD, no need totail /dev/nullanymore. - Solvers for artifact-only challenges run on Docker's default bridge, preserving
outbound network access. - Line endings are normalized to LF via
.gitattributes.
Examples and CI
- Example challenges standardized on
ubuntu:24.04and hardened; themultireference
was deduplicated and thestatic-makelockbox builds against OpenSSL 3.0. - The
disksexamples share a slimmedlibguestfsbase image, cutting build time
substantially. - CI checks out before
setup-goso the Go module cache actually hits, and runs the
integration tests with--keep-images.
Dependencies
- Bumped
docker/cli,moby/moby(api + client),mattn/go-sqlite3,yuin/goldmark,
JohannesKaufmann/html-to-markdown,golang.org/x/net, andgolang.org/x/systo
their latest releases.