The 600M bound sat below what a leg writes: ccache spent each build
deleting the entries the next run asked for, with 2624-3720 cleanup
passes and about 8% of calls served in the runs inspected on
2026-11-04.
Raising it needs room first. The repository's 10 GB quota currently
holds 1.1 GB of CodeQL trap, 1.1 GB of vcpkg, 0.7 GB of Qt and 2.1 GB
of docker buildkit layers. Two of those are now cheap to reclaim:
- docker-release wrote its layer cache with mode=max, but the build
stage sits behind COPY . ., so its compile layer is invalidated by
every source change and was never read back. mode=min keeps only the
final image stage.
- the five nightly-only legs kept their own compiler caches, 600M
each, that no pull request ever reads. They now keep none, and the
prune job retires their leftover keys immediately instead of waiting
for GitHub's whole-entry LRU eviction to pick them.
That funds per-leg bounds: 700M for one configuration, 850M for the
Debian 13 release that also runs the suite, 900M for Fedora 44's
Debug and Release, 800M for the instrumented leg, 400M for the
server-only leg, and 700M for each macOS leg. 6.45G of ccache plus the
3.2G of fixed entries leaves about 350M under the quota.
The prune step also covers the buildkit entries by age now, so the
mode=max generation of layer blobs is reclaimed instead of living
forever: a layer a build needs is downloaded and its date refreshed,
and dropping one that an index still lists only costs docker-release a
rebuilt layer, which gates nothing.
Add a workflow_dispatch trigger that builds an existing release tag with the current workflow and publishes it to GHCR under that tag name (optionally also as latest). This allows republishing a release whose image failed to publish, since re-running the original run reuses the workflow file from the release tag.
Dispatched runs check out the given tag, publish like stable releases, and use their own concurrency group so pushes to master can't cancel them.
Co-authored-by: Michael Hogg <3495076+jedinerd@users.noreply.github.com>
With archive: false, actions/upload-artifact ignores the name input and names the artifact after the uploaded file, so the digest artifacts were named after the raw digest instead of digest-<label>. The index job's download-artifact pattern digest-* then matched nothing, leaving no digests to build the image index from. Drop archive: false so the digest-<label> names apply.
Co-authored-by: Michael Hogg <3495076+jedinerd@users.noreply.github.com>
The inline comment after type=ref,event=tag was inside the tags block scalar, so it was passed to docker/metadata-action as part of the tag spec, failing with "Invalid event". Move the comment above the block.
Co-authored-by: Michael Hogg <3495076+jedinerd@users.noreply.github.com>
* native builds + merge
* naming and ordering
* use ninja and cmake build
* add ccache and cache mounts
* formatting
* Update servatrice.cpp
* Revert "Update servatrice.cpp"
This reverts commit 3acc684135c6db9baa17d00deaceecf8f7079721.
* remove ccache again
cache mounts are not part of GHA caches from docker action
* comments and cleanup
Use buildx provided in runner, see https://github.com/actions/runner-images/blob/main/images/ubuntu-slim/ubuntu-slim-Readme.md
* more explicit
* comments, first pass
* ${{ runner.temp }}
* $(printf "$GHCR_IMAGE@sha256:%s " *)
* follow docker docs for latest and extract short semver from our tags
* not so pretty, but allows the easy inspect at the end
* add Servatrice name
* add links to runner images
* comments, second pass
* cleanup
* add ccache eviction for files older than 7 days
also clean up some of the scripts to be more internally consistent
* move name build into the docker container again
* remove one extra empty line [skip ci]
* allow canceling concurrent builds on master for both desktop and docker
* add ccache eviction age to macos as well
* feat: build and release docker images using github cicd
* fix: attempt to publish to specific image name
* fix: typo in pipeline step
* typo
* typo
* limit to certain paths for PRs & naming
* ci: configure image title and url
* docker: include only necessary files and directories
this should make caching more powerful
* docker: reorder COPY with best guess of what changes least
* build(docker): remove seemingly unnecessary files
* fix: clean up docker metadata
remove annotations, it seems they're applied from the labels already, add description
* fix(ci): add back docker image annotations
* Update desktop-build.yml
* Update desktop-lint.yml
* Update desktop-build.yml
* Update docker-release.yml
* fix: remove run on master and add affected files to PR trigger
* metadata
* ci: run pipeline on main
this will ensure the container can always build and keep caches ready for release. push should only happen on tag triggers
It also removes some files from the PR trigger that should never break the build, and would just invalidate cache.
* Update docker-release.yml
---------
Co-authored-by: tooomm <tooomm@users.noreply.github.com>