Release automation for GitHub, GitLab, and Azure DevOps, driven by conventional commits.
yeet analyzes commit history, calculates the next version (semver or calver), generates changelogs, opens a release PR/MR, and tags the release when it merges. It ships as a single static binary with no runtime dependencies.
Inspired by release-please.
If you want release-please's release-PR workflow but your code lives on GitLab or Azure DevOps, or you want it without a Node.js runtime in your pipeline, that is the gap yeet fills.
| yeet | release-please | semantic-release | |
|---|---|---|---|
| Providers | GitHub, GitLab, Azure DevOps | GitHub | GitHub, GitLab |
| Self-hosted instances | GitHub Enterprise, self-managed GitLab, Azure DevOps Server | GitHub Enterprise | GitHub Enterprise, self-managed GitLab |
| Workflow | release PR/MR, tag on merge | release PR, tag on merge | publishes directly on push |
| Auto-merge release PR/MR | built in (auto/squash/rebase/merge) | external automation | no release PR |
| Release PR/MR reviewers | built in (release.reviewers, validated per provider) |
not supported (use CODEOWNERS) | no release PR |
| Runtime | single binary or container image | Node.js | Node.js plus plugins |
| Versioning | semver and calver | semver | semver |
| Prerelease channels | branch-scoped channels (semver) | prerelease versioning strategy, no branch channels | branch-based channels built in |
| Exact version override | Release-As commit footer (semver) |
Release-As commit footer or config |
not supported |
| Commit type to bump mapping | configurable (bump_types) |
fixed strategies only | configurable (releaseRules) |
| Version updates in arbitrary files | comment markers and JSON pointers | comment markers and typed extra-files | plugins only |
| Issue tracker links in changelog | built in (regex patterns and footers) | not supported | preset passthrough or community plugin |
| Commit message overrides | PR/MR body override block | PR body override block (squash only) | not supported |
| Monorepo | built in (targets) | built in (manifest) | third-party plugins |
| Configuration | one YAML file with a JSON schema | JSON config plus manifest | plugin config in .releaserc |
Self-hosted setup is covered in Authentication.
brew install monkescience/tap/yeetOr on Windows with Scoop:
scoop bucket add monkescience https://github.com/monkescience/scoop-bucket
scoop install yeetOr with Go:
go install github.com/monkescience/yeet/cmd/yeet@v0.10.14 # x-yeet-versionOr use the published container image:
docker run --rm ghcr.io/monkescience/yeet:v0.10.14 --help # x-yeet-versionShell completions are available via yeet completion bash|zsh|fish|powershell.
Release archives and the container image are signed with Sigstore keyless signing, and both carry GitHub build provenance attestations.
Verify an archive against the .sigstore.json bundle published next to it:
cosign verify-blob \
--bundle yeet_linux_amd64.tar.gz.sigstore.json \
--certificate-identity-regexp 'https://github.com/monkescience/yeet/.github/workflows/binaries.yaml@.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
yeet_linux_amd64.tar.gzVerify the container image signature:
cosign verify \
--certificate-identity-regexp 'https://github.com/monkescience/yeet/.github/workflows/image.yaml@.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
ghcr.io/monkescience/yeet:v0.10.14 # x-yeet-versionVerify build provenance (which workflow and commit produced the artifact) with the GitHub CLI:
gh attestation verify yeet_linux_amd64.tar.gz --repo monkescience/yeet
gh attestation verify oci://ghcr.io/monkescience/yeet:v0.10.14 --repo monkescience/yeet # x-yeet-versionyeet talks to the provider API, so export a token first (GITHUB_TOKEN, GITLAB_TOKEN, or AZURE_DEVOPS_EXT_PAT, see Authentication).
# Initialize config in your repo
yeet init
# Preview what the next release would look like
yeet release --dry-run
# Create a release PR/MR
yeet release
# Auto-merge and finalize in the same run
yeet release --auto-mergeRun yeet --help for the full list of commands and flags.
yeet release does slightly different work depending on repository state:
- Before a release PR/MR exists, it scans conventional commits, calculates the next version,
updates the changelog/version files, and opens a release PR/MR labeled
autorelease: pending. - While that PR/MR is open, rerunning
yeet releaseupdates the same release branch instead of creating a second pending release. - After the release PR/MR is merged, the next
yeet releaserun on the base branch creates the tag/provider release from the committed changelog entry and flips the label toautorelease: tagged.
Final release notes are read from the matching CHANGELOG.md entry. To customize
release notes, edit that changelog entry on the release PR/MR branch. The PR/MR body itself is
regenerated by yeet release and should not be used for final release-note edits.
That label lifecycle is operational, not decorative: yeet uses autorelease: pending to discover
merged releases that still need tagging, and it expects only one open pending release PR/MR per
base branch. If multiple pending PRs/MRs exist, yeet release fails and prints the conflicting
URLs so you can close or relabel stale entries.
When auto-merge is enabled (--auto-merge or release.auto_merge in config), yeet merges the
release PR/MR and finalizes the release in the same run. Force mode (--auto-merge-force) skips
yeet's own readiness gates but does not bypass provider branch protections, required checks,
approvals, or missing permissions.
Getting started:
- Authentication: tokens and self-hosted setup per provider
- CI setup: GitHub Actions, GitLab CI, and Azure Pipelines examples, performance tuning
- Migrating from release-please: config mapping and switch-over steps
- Troubleshooting: error categories and debug logging
Customization:
- Configuration: config file, repository targeting, monorepo targets, bump types, version files
- Versioning: semver, calver, and
Release-Asoverrides - Changelog generation: sections, issue tracker references, commit overrides
- Release PRs/MRs: PR/MR body and merge settings, release notes, prerelease channels