Files
buzz/.github/ci/minio/README.md
Tyler 99c2acf90c fix(ci): bootstrap the reusable MinIO image in GHCR (#7869)
Upstream MinIO image pulls are blocking CI (#7867). Add a separate
publisher for `ghcr.io/block/buzz-minio:latest`, so the reusable image
can be bootstrapped before CI adopts it in #7870.

- Build the checksummed official MinIO/mc release binaries from #7868 on
a digest-pinned Alpine base.
- Build only when image/workflow/Compose inputs change or on manual
dispatch. PRs build and smoke-test; only `block/buzz` main can publish.
- Run the real Compose healthcheck and initializer, object
upload/read/delete, and anonymous-access denial before publishing
`latest` plus a unique `sha-<commit>-run-<id>-<attempt>` tag.
- Manual dispatch disables Docker's layer cache to refresh Alpine
packages. Normal image builds retain caching; each maintenance rebuild
keeps its own tag.

### Rollout

This PR contains only the publisher and opt-in Compose override. **It
does not switch ordinary CI consumers**, so its checks do not require
the unpublished image. This is a separate PR from adoption, as required
by Buzz's squash-only merge rules.

1. Merge this PR; its main-branch workflow builds, tests, and publishes
the image.
2. Make the `buzz-minio` GHCR package public and verify an anonymous
pull of `ghcr.io/block/buzz-minio:latest`. New GHCR packages default to
private.
3. Rebase draft #7870 onto current main, retarget it to main, run its
integration checks, and merge it to switch all MinIO-backed CI jobs to
the published image.

### Validation

- Updated hosted [MinIO image build and smoke
test](https://github.com/block/buzz/actions/runs/36018177877) passed at
`700ab6d5346b37a64c9defde0016dc65c98aa790`; publication correctly
skipped on the PR.
- Hosted [ordinary
CI](https://github.com/block/buzz/actions/runs/36018178123) passed at
the same head. Its actual Git comparison detected only the five
publisher files, all application path filters were false, and the
MinIO-dependent integration checks were correctly skipped. Synced
current main before this run to eliminate an earlier stale-base
comparison that included unrelated ACP changes.
- Actual five changed paths were passed through the repo's pinned
`dorny/paths-filter`: all application domains were false. All 12
existing path-selection cases and the required-context isolation
contract also passed.
- Publisher actionlint, smoke-script shellcheck, and commit/push hooks
passed.
- Fresh local rebuild of `700ab6d5346b37a64c9defde0016dc65c98aa790`
passed with `docker buildx build --no-cache --platform linux/amd64
--load`. Logs confirm new Alpine index fetches and package installation
rather than a cached install layer. The committed smoke script passed
under local AMD64 emulation using the current merged Compose services
with isolated resource names and no published ports: healthcheck,
initializer/private bucket, object upload/read/delete, and anonymous
HTTP 403. Temporary containers, network, and volume were removed. Both
pinned binary checksums match the official release SHA-256 files.
- Full `just ci` was previously attempted: workspace formatting/Clippy,
desktop checks, and Tauri formatting passed; the run was stopped during
Tauri Clippy. No full local application-suite pass is claimed; hosted
application suites correctly skip this publisher-only change.

---------

Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
2026-09-24 11:36:10 -04:00

2.7 KiB

Buzz CI MinIO

ghcr.io/block/buzz-minio:latest contains MinIO and mc for the disposable Linux AMD64 CI runners. docker-compose.ci.yml selects it for both services; development and deployment defaults stay in docker-compose.yml.

The MinIO image workflow builds only when its inputs change, or on a manual dispatch. Pull requests build and smoke-test without publishing. On main, a successful smoke test publishes the same image as sha-<full commit>-run-<run id>-<attempt> and latest. The run-specific tag preserves each build, including package refreshes from the same source commit. Once consumers adopt the override, ordinary CI only pulls it; there is no build fallback or dependency on the publisher. latest deliberately floats, and Compose always pulls it. Docker's pull output records the resolved digest.

The Dockerfile uses the same upstream releases as the development services, with checksummed official GitHub release binaries and a digest-pinned Alpine base. MinIO and mc are AGPL-3.0; their corresponding source is available at the MinIO release and mc release.

First publication

The image must exist and be publicly pullable before the CI switch can pass. Use two separate PRs: Buzz only permits squash merges, so two commits in one PR cannot stage this rollout.

  1. Merge the publisher-only PR containing .github/ci/minio/, .github/workflows/minio-image.yml, and the opt-in docker-compose.ci.yml. Ordinary CI does not select the override yet, so it does not need this image to validate the publisher PR. The merge triggers the first publication.
  2. After publication succeeds, an org/package admin must make buzz-minio public in its GitHub package settings (new GHCR packages default to private, even for public repositories). Verify an anonymous pull of ghcr.io/block/buzz-minio:latest.
  3. Rebase the separate consumer PR onto main, run its integration checks, and merge it. That PR selects the override in relay and mesh lifecycle CI.

Subsequent publications preserve package visibility.

Updating or rebuilding

Update the release URLs/checksums or base digest in the Dockerfile and open a PR. Merging triggers publication. To rebuild the existing recipe (for example, to pick up Alpine package updates), dispatch MinIO image from main. Manual dispatch disables Docker's layer cache so the package installation runs again. Other refs can build and test but cannot publish latest.

To reproduce a CI run with a recorded version, set MINIO_CI_IMAGE to the published run-specific tag or digest while using COMPOSE_FILE=docker-compose.yml:docker-compose.ci.yml.