change(release): Automatically split CHANGELOG entries into categories (#5203)

* Update release-drafter.yml

* Explain where we got the workflow from

* Automatically add "trivial" label to dependabot updates

* Add categories and auto-labels to release drafter

* Update release PR template for automatic release drafter versions

* Also strip PR series numbers and leading spaces from changelog entries

* Update release note version check

* Update label names

* Add missing ! in conventional commits regex

Co-authored-by: Marek <mail@marek.onl>

* Make versioning steps more specific

Co-authored-by: Marek <mail@marek.onl>

* Remove conflicting detailed versioning explanations

Co-authored-by: Marek <mail@marek.onl>
Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
This commit is contained in:
teor 2022-09-27 22:41:55 +10:00 committed by GitHub
parent a6ceba7314
commit b0e60d7c11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 210 additions and 71 deletions

View File

@ -9,66 +9,25 @@ assignees: ''
## Versioning
### Which Crates to Increment
### How to Increment Versions
To check if any of the top-level crates need version increments:
Zebra follows [semantic versioning](https://semver.org).
Look for the [draft `zebrad` changelog](https://github.com/ZcashFoundation/zebra/releases) for the automatic version bump.
This version is based on [the labels on the PRs in the release](https://github.com/ZcashFoundation/zebra/blob/main/.github/release-drafter.yml).
Check that the automatic `zebrad` version increment is correct:
1. If we're releasing a mainnet network upgrade, increment the `major` version of all Zebra crates
2. If we're not releasing a mainnet network upgrade, check for features, major changes, deprecations, and removals. If this release has any, it is a `minor` release
If we're not doing a `major` release, you need to check which crates have changed:
1. Go to the zebra GitHub code page: https://github.com/ZcashFoundation/zebra
2. Check if the last commit was a Zebra version bump, or something else
<details>
Alternatively you can:
- Use the github compare tool and check the `main` branch against the last tag ([Example](https://github.com/ZcashFoundation/zebra/compare/v1.0.0-alpha.15...main))
- Use `git diff --stat <previous-release-tag> origin/main`
</details>
2. Check if the last commit to each crate is a Zebra version bump. If it is a version bump, the crate has not changed since the last release.
Once you know which crates have changed:
- [ ] Increment the crates that have new commits since the last version update
- [ ] Increment any crates that depend on crates that have changed
- [ ] Keep a list of the crates that haven't been incremented, to include in the PR
### How to Increment Versions
Zebra follows [semantic versioning](https://semver.org).
Semantic versions look like: MAJOR`.`MINOR`.`PATCH[`-`TAG`.`PRE-RELEASE]
<details>
#### Pre-Release Crates
Pre-Release versions have a `TAG` like "alpha" or "beta". For example: `1.0.0-alpha.0`
1. Increment the `PRE-RELEASE` version for the crate.
#### Unstable Crates
Unstable versions have a `MAJOR` version of zero. For example: `0.1.0`
1. Follow stable crate versioning, but increment the `MINOR` version for breaking changes
#### Stable Crates
For example: `1.0.0`
Increment the first version component in this list, and reset the other components to zero:
1. MAJOR versions for breaking public API changes and removals
* check for types from dependencies that appear in the public API
2. MINOR versions for new features
3. PATCH versions for bug fixes
* includes dependency updates that don't impact the public API
### Reviewing Version Bumps
Check for missed changes by going to:
`https://github.com/ZcashFoundation/zebra/tree/<commit-hash>/`
Where `<commit-hash>` is the hash of the last commit in the version bump PR.
If any Zebra or Tower crates have commit messages that are **not** a version bump, we have missed an update.
Also check for crates that depend on crates that have changed. They should get a version bump as well.
</details>
### Version Locations

View File

@ -7,8 +7,9 @@ updates:
timezone: America/New_York
open-pull-requests-limit: 10
labels:
- 'A-dependencies'
- 'C-trivial'
- 'A-rust'
- 'A-dependencies'
- 'P-Low :snowflake:'
- package-ecosystem: github-actions
directory: '/'
@ -17,6 +18,7 @@ updates:
timezone: America/New_York
open-pull-requests-limit: 10
labels:
- 'C-trivial'
- 'A-infrastructure'
- 'A-dependencies'
- 'P-Low :snowflake:'

View File

@ -1,19 +1,177 @@
prerelease: true
categories:
- title: 'Features'
labels:
- 'feature'
- 'enhancement'
- title: 'Bug Fixes'
labels:
- 'fix'
- 'bugfix'
- 'bug'
- title: 'Maintenance'
label: 'chore'
change-template: '- $TITLE (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
template: |
## Changes
# Configuration for automatic Zebra CHANGELOGs and PR tagging
#
# Based on:
# https://github.com/marketplace/actions/release-drafter#example
# Automatically label PRs based on their branch, title, or changed files.
# This helps categorise PRs in the CHANGELOG.
autolabeler:
- label: 'C-security'
branch:
- '/secur/i'
title:
- '/secur/i'
- label: 'C-removed'
branch:
- '/remov/i'
title:
- '/remov/i'
- label: 'C-deprecated'
branch:
- '/deprecat/i'
title:
- '/deprecat/i'
- label: 'C-feature'
branch:
- '/add/i'
- '/feat/i'
title:
- '/add/i'
- '/feat/i'
- label: 'C-enhancement'
branch:
- '/chang/i'
title:
- '/chang/i'
- label: 'C-bug'
branch:
- '/fix/i'
- '/bug/i'
title:
- '/fix/i'
- '/bug/i'
# Changes that are almost always trivial for users
- label: 'C-trivial'
branch:
- '/clean/i'
- '/chore/i'
- '/clippy/i'
title:
- '/clean/i'
- '/chore/i'
- '/clippy/i'
files:
# Regular changes that don't need to go in the CHANGELOG
- 'CHANGELOG.md'
- 'zebra-consensus/src/checkpoint/*-checkpoints.txt'
# Developer-only changes
- 'zebra-utils'
- '.gitignore'
# Test-only changes
- 'zebra-test'
- '.cargo/config.toml'
- 'clippy.toml'
# CI-only changes
- '.github'
- '.codespellrc'
- 'codecov.yml'
- 'deny.toml'
# The release name, tag, and settings for the draft CHANGELOG.
name-template: 'Zebra $RESOLVED_VERSION'
tag-template: 'v$RESOLVED_VERSION'
tag-prefix: 'v'
prerelease: true
# Categories in rough order of importance to users.
# Based on https://keepachangelog.com/en/1.0.0/
category-template: '### $TITLE'
categories:
- title: 'Security'
labels:
- 'C-security'
# Other labels that are usually security issues
- 'I-bad-code'
- 'I-bad-data'
- 'I-consensus'
- 'I-crash'
- 'I-destructive'
- 'I-hang'
- 'I-lose-funds'
- 'I-privacy'
- 'I-remote-node-overload'
- 'I-unbounded-growth'
- 'I-unsound'
- title: 'Removed'
labels:
- 'C-removal'
- 'C-breaking'
- title: 'Deprecated'
labels:
- 'C-deprecation'
# TODO: when release drafter has per-category templates, add this to the Deprecated category template:
# 'These features might be removed in Zebra $NEXT_MINOR_VERSION'
- title: 'Added'
labels:
- 'C-feature'
- title: 'Changed'
labels:
- 'C-enhancement'
- title: 'Fixed'
labels:
- 'C-bug'
# Other labels that are usually bugs
- 'I-build-fail'
- 'I-integration-fail'
- 'I-panic'
# TODO: if we're happy with the trivial PRs, use "exclude-labels:" instead
- title: 'Trivial *TODO:* put this in a PR comment, not the CHANGELOG'
labels:
- 'C-trivial'
- 'C-cleanup'
# The next release's $RESOLVED_VERSION, based on the labels of the PRs in the release.
#
# In Zebra, we use major versions for mainnet network upgrades,
# and minor versions for less significant breaking changes.
version-resolver:
major:
labels:
# We increment the major release version manually
minor:
labels:
- 'C-feature'
- 'C-breaking'
- 'C-removal'
- 'C-deprecation'
# We increment the patch version for every release
default: patch
# How PR names get turned into CHANGELOG entries.
change-template: '- $TITLE ([#$NUMBER]($URL))'
sort-by: title
sort-direction: ascending
# Characters escaped when converting PR titles to CHANGELOG entries.
# Add ` to disable code blocks.
change-title-escapes: '\<*_&#@'
# Strip PR series numbers, leading spaces, and conventional commit prefixes from PR titles.
replacers:
- search: '/- [0-9\. ]*([a-zA-Z0-9\(\)!]+:)?/'
replace: '- '
# The list of contributors to each release.
exclude-contributors:
- 'dependabot' # 'dependabot[bot]'
- 'mergifyio' # 'mergify[bot]'
# The template for the draft CHANGELOG.
template: |
## [Zebra $RESOLVED_VERSION](https://github.com/ZcashFoundation/zebra/releases/tag/v$RESOLVED_VERSION) - *TODO*: date
This release *TODO*: a summary of the significant user-visible changes in the release
### Breaking Changes
This release has the following breaking changes:
- *TODO*: Check the `Removed` section for any breaking changes
- *TODO*: Add a short description of the user impact of each breaking change, and any actions users need to take
$CHANGES
### Contributors
Thank you to everyone who contributed to this release, we couldn't make Zebra without you:
$CONTRIBUTORS
# the trailing newlines in the template are deliberate

View File

@ -1,5 +1,8 @@
# Creates a draft release with all the PR names since the last release.
# https://github.com/ZcashFoundation/zebra/releases
#
# Workflow is based on:
# https://github.com/marketplace/actions/release-drafter#usage
name: Release Drafter
on:
@ -7,16 +10,33 @@ on:
push:
branches:
- main
# pull_request event is required only for autolabeler
pull_request:
# Only following types are handled by the action, but one can default to all as well
#types: [opened, reopened, synchronize]
# pull_request_target event is required for autolabeler to support PRs from forks
pull_request_target:
#types: [opened, reopened, synchronize]
# Manually update the draft release without waiting for a PR to merge
workflow_dispatch:
permissions:
contents: read
jobs:
update_release_draft:
permissions:
# write permission is required to create a github release
contents: write
# write permission is required for autolabeler
# otherwise, read permission is required at least
pull-requests: write
runs-on: ubuntu-latest
steps:
# Drafts your next Release notes
- uses: release-drafter/release-drafter@v5
with:
config-name: release-drafter.yml
#disable-autolabeler: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}