Try Hanzo

hanzo.ai/ci

A Go module. This address is where its documentation lives; the source is on GitHub.

go get hanzo.ai/ci

Hanzo CI

One pipeline builds, tests and publishes every Hanzo repo. A repo says what it makes; the pipeline makes it the same way everywhere.

hanzo.yml

One file at the root of a repo names its images, the tests that gate them, and the static site it publishes, if it has one. The repo carries no build logic of its own.

images:
  - { name: api, context: ., repo: ghcr.io/acme/api }
test:
  - { name: unit, run: go test ./... }

The shared workflow

A short workflow imports the pipeline from hanzoai/ci, so every repo runs the same steps from one definition. Tests run first, and a commit that fails them publishes nothing.

jobs:
  cicd:
    uses: hanzoai/ci/.github/workflows/build.yml@v2
    secrets: inherit

Runners

Jobs run on Hanzo's runner fleet. To run them on your own machines, pass your runners' labels as runner.

The build door

With mode: delegate, a job hands each image to the build door, POST /v1/build on api.hanzo.ai. It builds every declared architecture on a native node and pushes one multi-architecture image, only into registries your organization owns. It reads the organization from the job's Hanzo identity, so it needs no secret of its own.

A build ends at a published image. What runs where is declared separately, and applied from that declaration.

Build what’s next.