GitHub Action for continuous draft release generation.
- Creates or updates a single draft release per branch (or per branch + directory).
- Uses merged PR titles as release notes.
- Resolves version numbers from language archetypes (e.g. Rust
Cargo.toml). - Optional
breezy.ymlconfig for grouping, templating, and tag/name formats.
- Rust
- NodeJS
Please raise an issue to request support for your language/framework of choice. PRs also very welcome :)
language(optional): Language archetype(s) for version detection. If omitted,breezy.ymlis used.github-token(required): GitHub token used to create/update releases.tag-prefix(optional): Prefix for tags when notag-templateis set. Defaultv.config-file(optional): Path to abreezy.ymlconfig.directory(optional): Repo-relative directory containing the manifest to read (scopes drafts per branch + directory).
Use directory when your repo has multiple sub-projects/manifests and you want independent draft releases per sub-project on the same branch.
By default, Breezy looks for .github/breezy.yml in the repo, or $HOME/.github/breezy.yml inside the container. You can also pass config-file explicitly.
Example:
language: rust
tag-template: $DIRECTORY-$VERSION
name-template: $DIRECTORY-$VERSION
categories:
- title: Features
labels:
- feature
- enhancement
- title: Bug Fixes
labels:
- fix
- bugfix
- bug
- title: Maintenance
label: chore
exclude-labels:
- skip-log
change-template: "* $TITLE @$AUTHOR ($NUMBER)"
template: |
# Changes
$CHANGESTemplate variables:
$VERSION: Resolved version.$DIRECTORY: Directory input (empty when not set).$TITLE: PR title.$AUTHOR: PR author login.$NUMBER: PR URL.$CHANGES: Rendered change list (only for the top-leveltemplate).
name: Release Breezy
on:
push:
branches: [main]
jobs:
draft:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: read
steps:
- uses: actions/checkout@v4
- uses: ./
with:
language: rustname: Release Breezy
on:
push:
branches: [main]
jobs:
draft:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: read
strategy:
matrix:
directory:
- crates/app
- crates/worker
steps:
- uses: actions/checkout@v4
- uses: ./
with:
language: rust
directory: ${{ matrix.directory }}This action is heavily inspired by release-drafter. There are a few key differences:
breezydoes not attempt to increment the version number - it reads directly from the appropriate manifestbreezycreates a single release draft per branch by defaultbreezysupports multiple sub-projects with separate releases for each