releaser
semantic-release without the plugins, the config, or node_modules. One static
Go binary, zero dependencies.
On every push to main, it reads your
Conventional Commits, picks the next
version, writes CHANGELOG.md, bumps package.json, commits, tags, and creates
the GitHub release. Two optional modes, usable together: artifact (attach
files to the release) and docker (build and push the image). Trunk-based?
Ship a canary per push and cut stable releases through a release PR.
on:
push:
branches: [main]
jobs:
release:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write # docker mode only
steps:
- uses: actions/checkout@v7
- uses: orochibraru/releaser@v1
with: # all optional
prepare: ./build.sh ${version} # builds dist/app.zip
artifacts: dist/app.zip=app-${version}.zip
docker: true # builds ./DockerfileDocumentation
- Getting started
- Inputs and flags
- Migrating from semantic-release
- Release flows
- Versioning
- Artifact mode
- Docker mode
- Canaries and release PR
- Architecture
Runnable examples: Python, Go, TypeScript, JavaScript, Rust, Java, Kotlin, C, Bun, and Docker mode.
Development
mise install # go and prek, pinned in mise.toml
prek install # gofmt, go mod tidy, go vet, go test, prettier, markdownlint
go test ./... # unit + integration, incl. the artifact and Docker examples (Docker needs Docker)
# the other examples run in the Examples workflowThis guide lives in the project repo: edit it there, and this page follows within a day.