Skip to content

Releasing

Rafael Fragoso edited this page Jun 8, 2026 · 3 revisions

Releasing

Releases are fully CI-driven by goreleaser. Publishing is essentially "push a tag."

How it works

Pushing a tag matching v* triggers .github/workflows/release.yml, which runs goreleaser release --clean on a macos-latest runner, builds archives + checksums, generates grouped release notes from Conventional Commits, and publishes a GitHub Release.

Because every target is cgo (tree-sitter + SQLite are C), the toolchain is split:

  • darwin (amd64 + arm64) builds natively with the runner's Apple clang + SDK. zig cannot cross-compile darwin reliably — macOS needs Apple system libraries (libresolv, frameworks) it doesn't bundle, which surfaces as AccessDenied or unable to find dynamic system library 'resolv'.
  • linux (amd64 + arm64) builds via zig cc, which ships a self-contained C toolchain and needs no macOS SDK.

Native dependencies for semantic search

Three native pieces, handled in the pipeline:

  • sqlite-vec (vec0) is statically linked — nothing to ship.
  • libtokenizers.a is fetched per target and linked at build time.
  • onnxruntime is loaded at runtime (dlopen), so it is bundled in each archive beside the binary; the loader finds it next to the executable or via COLUMBUS_ORT_LIB. Pinned to a version exposing the API the Go binding needs.

goreleaser fetches the model weights (//go:embed) before building, stages the libs per target via scripts/fetch-native.sh, and adds the onnxruntime lib plus LICENSE/THIRD_PARTY.md to every archive.

Publishing uses a repo secret, RELEASER_TOKEN, exposed to goreleaser as GITHUB_TOKEN.

Artifacts produced:

  • columbus_<version>_{darwin,linux}_{amd64,arm64}.tar.gz (binary + onnxruntime lib + licenses)
  • checksums.txt
  • Auto-generated changelog (grouped: Features, Bug Fixes, Performance, …)

Cut a release

# 1. Make sure main is green and your changes are merged.
# 2. Tag (annotated) and push:
git tag -a v0.1.0 -m "v0.1.0"
git push origin v0.1.0

Watch it:

gh run watch
gh release view v0.1.0

Validate locally first (optional)

make release-check   # = goreleaser check — lint the config
make release-test    # = goreleaser release --snapshot --clean — full dry run

make release-test runs the same four-target cross-compile the CI release does but publishes nothing; artifacts land in dist/. Run it on macOS with zig installed so it mirrors the CI runner (darwin native + linux via zig). On Linux the darwin targets will fail — that's expected, and exactly why CI uses a macOS runner.

Pre-releases

prerelease: auto means a tag like v0.1.0-rc.1 is published as a pre-release; plain v0.1.0 is a full release.

Redo a botched release

gh release delete v0.1.0 --yes
git push --delete origin v0.1.0
git tag -d v0.1.0
# fix, then re-tag

Related

Development & Testing · Command: version

Clone this wiki locally