27 KiB
Releasing
Tips, procedures and a glossary for hledger release managers and maintainers.
Tips
- Don't try to document, let alone automate, the perfect process; it's too much and too unstable.
- Keep making things a little better each time through. Better means simpler, more reliable, more automated, easier, faster, cheaper, higher quality.
- Practice releasing as often as possible.
- The different aspects of releasing have complex interdependencies and sequencing constraints.
Chunk and separate them as far as possible:
- Software - selecting changes, packages, release dates; coordinating contributions; ensuring release readiness
- Branch Management - coordinating main and release branch, local and remote repos, CI branches
- Version Bumping - choosing and applying new version numbers and related things like tags, github releases, urls, ghc and dep versions, stackage resolvers, everywhere needed
- Docs - command help, manuals, changelogs, release notes, github release notes, install page, install scripts, announcements, process docs
- Testing - local testing, CI testing, extra release-specific testing
- Artifacts - generating binaries, zip files, github releases etc.
- Publishing - uploading, pushing, making visible, finalising
- Announcing - various announcement stages and channels
- All releases must be made from a release branch, for uniformity and to avoid mishaps like uploading 1.24.99 dev code to hackage.
- Don't tag until the three main platform binaries have been produced from the same commit.
- Update and edit changelogs as early and often as possible. Eg before or right after merging a PR, and before creating a release branch. See also CHANGELOGS.
Current goals
- Update/consolidate release process docs
- Establish routine monthly release cadence
- Make releasing easy
hledger release types
Major release A.B |
Bugfix release A.B.C |
Fixup release A.B.C.D |
Preview release A.B.99.D |
---|---|---|---|
New features, breaking changes | Only bug fixes | Trivial packaging fixes, no software changes | Early snapshot of the next major release |
See also Glossary.
Cadence
hledger major releases happen in the third month of each quarter, normally at or close to the start of the month. Preview releases happen in the intervening months. Bugfix and fixup releases happen when needed (as seldom as possible).
Q1 | Q2 | Q3 | Q4 |
---|---|---|---|
Jan 1: preview 1 | Apr 1: preview 1 | Jul 1: preview 1 | Oct 1: preview 1 |
Feb 1: preview 2 | May 1: preview 2 | Aug 1: preview 2 | Nov 1: preview 2 |
Mar 1: major | Jun 1: major | Sep 1: major | Dec 1: major |
Deliverables
Major release | Bugfix release | Fixup release | Preview release | |
---|---|---|---|---|
Changelogs | Y | Y | Y | Y |
Github release | Y | Y | Y | Y |
Binaries | Y | Y | Y | Y |
Install page | Y | Y | Y | Y |
Hackage release | Y | Y | Y | |
hledger-install | Y | Y | Y | |
Release notes | Y | Y | ||
Announcements | Y | |||
Regression bounties | Y | Y | Y |
Prerequisites
- release-ready master or release branch:
- contains desired bugfixes
- contains desired PRs
- changelogs are up to date
- tests pass
- packages to be released
- release version
- release date
Procedures
Update release process docs
- when starting release work, make a copy of RELEASING.md(, CHANGELOGS.md)
- update that while working on the release (Obsidian works well)
- merge changes afterward, avoiding conflicts
Make a preview release
- check master is in releasable state
- clean and synced working copy
- no pending release-blocking issues/prs
- believed to be of appropriate quality
- appropriate timing and resources for release
- update Shake.hs
- check resolver matches stack.yaml
- check for other workarounds in stack.yaml
./Shake.hs
- commit any Shake.hs changes (
tools: shake: sync with stack.yaml
)
- update master changelogs (see CHANGELOGS)
- prepare release branch
tools/release prep OLDMA.JOR.99.PREVIEWNUM
(eg 1.24.99.1 for 1.25 preview 1)- cherry pick changes from master
- list changes in three side-by-side magit windows
-
- NEW IN MASTER:
l o MAJORVER-branch..master
,M-x magit-toggle-buffer-lock
,M-x toggle-window-dedicated
(C-c D
)
- NEW IN MASTER:
-
- HEAD: regular magit status view
-
- RELEASE BRANCH:
l o MAJORVER-branch
,M-x magit-toggle-buffer-lock
,M-x toggle-window-dedicated
- RELEASE BRANCH:
-
- in master window, working from bottom upward, cherry-pick all non-conflicting changes
- skip changes already in release branch
- skip changelog, command help, and manuals updates
- list changes in three side-by-side magit windows
./Shake cmdhelp -c
./Shake manuals -c
- update release & master changelogs (see CHANGELOGS)
- test
stack build
make functest
- check built-in manual dates
- check --version
- make CI binaries
tools/release bin
- babysit/fix/repeat the CI binary jobs until all succeed on the same commit
- download binary artifacts
make tag
- make github release
git push origin MA.JOR-branch && git push --tags
(or magitP p
,P t
)- draft
- edit previous similar release, eg https://github.com/simonmichael/hledger/releases/edit/1.24.99.1
- edit new release, https://github.com/simonmichael/hledger/releases/new
- copy/paste content
- title
- preamble
- cli/ui/web/lib changelogs
- deepen headings 2 steps and add package names
- upload binary artifacts
- test/preview
- publish
Make a major release
- as above, with MA.JOR
- other major release stuff - release notes, site updates, hackage, announce
- merge release changelog back to master
- bump version in master
Make a bugfix or fixup release
- switch to release branch
- cherry pick changes from master
- proceed as above, with MA.JOR.MINOR[.FIXUP]
On release day
In site repo:
-
update
release-notes.md
- copy template, uncomment
- replace date
- replace XX with NEW
- add new changelog sections, excluding hledger-lib
- remove any empty sections
- add contributors,
git shortlog -sn OLD..NEW
- add summary (major release) or remove it (bugfix release)
- check preview in vs code
- commit:
relnotes: NEW
-
update
install.md
- query-replace OLD -> NEW in
- "current hledger release"
- CI binaries badges/links, including linux-static-arm32v7 if built
- "building from source"
- stack install command
- cabal install command
- query-replace OLD-brightgreen -> OLD-red
- only after release binaries are built (preferably after release is published): update --version outputs (search: hledger --version)
- final output line from
hledger test
(run in terminal for normal speed) - Total count from
make functest
- commit:
download: NEW
- query-replace OLD -> NEW in
In release branch:
- update
doc/ANNOUNCE
(major release)- summary, contributors from release notes
- any other edits
- commit:
;doc: ANNOUNCE
In master:
-
cherry pick useful release branch changes
;doc: ANNOUNCE
-
update
hledger-install/hledger-install.sh
- HLEDGER_INSTALL_VERSION
- RESOLVER
- HLEDGER_*_VERSION
- EXTRA_DEPS
-
wait for CI binaries, https://ci.hledger.org
-
pre-release pause: take a break away from keyboard
-
announce
- push site download/relnotes updates
- push master hledger-install update
- share release notes link, then markdown content, in #hledger chat
- send ANNOUNCE to hledger@googlegroups.com, haskell-cafe@googlegroups.com (major release)
or brief announcement to hledger@googlegroups.com (bugfix release)
- ANN: hledger NEW
- release notes link, summary
- release notes html (copied from browser)
- tweet at https://twitter.com/simonkwmichael ?
- toot at https://fosstodon.org/web/accounts/106304084994827771 ?
Add major release to website
In site:
- js/site.js: add NEW, update currentrelease
- Makefile: add NEW, two places
- make snapshot-NEW
- (cd src; rm current; ln -s NEW current)
In hledger.org caddy config:
- add
path
andredir
s for NEW systemctl reload caddy
On hledger.org:
- make clean all
Post release
-
merge/check/update download page changes
- docker - expect/merge PR
- homebrew - expect badge to update soon
- nix - expect
make nix-hledger-version
to update after a few days, find and update to that commit hash - linux distros - once in a while, follow the links & search for newer versions, update
-
support
-
handle issues
-
update procedures, tools, docs
Update hledger-install
-
in master: hledger-install/hledger-install.sh
-
bump HLEDGER~INSTALLVERSION~
-
bump RESOLVER
-
bump HLEDGER~*VERSION~
-
check/update EXTRA~DEPS~
-
-
test
-
cd
-
bash ~/src/hledger/hledger-install/hledger-install.sh
-
Update homebrew formula
-
ref
-
helpers: chenrui & stack issue commenters on github, Athas on #haskell
-
doc
If a URL is specified, the SHA-256 checksum of the new download should also be specified. A best effort to determine the SHA-256 and formula name will be made if either or both values are not supplied by the user.
If a tag is specified, the Git commit revision corresponding to that tag must also be specified.
Note: this command cannot be used to transition a formula from a URL-and-SHA-256 style specification into a tag-and-revision style specifi- cation, nor vice versa. It must use whichever style specification the for- mula already uses.
-
-
update homebrew working copy
-
cd ~/src/DEVTOOLS/homebrew-core
-
git reset --hard HEAD~1 && git fetch origin && git merge origin/master && git push -f
-
-
get release tarball checksums
export V=X.Y; for P in -lib "" -ui -web; do curl -sO https://hackage.haskell.org/package/hledger$P-$V/hledger$P-$V.tar.gz; done && shasum -a256 *.gz
-
update Formula/hledger.rb
-
update tarball urls, shas
-
update other version references
-
maybe update stackage snapshot
-
possible new process, see: https://docs.brew.sh/How-To-Open-a-Homebrew-Pull-Request#create-your-pull-request-from-a-new-branch
-
test (if possible without too many mac/brew hassles)
-
brew audit --strict Formula/hledger.rb # some tests are post-install, try also after brew upgrade
-
brew upgrade Formula/hledger.rb -s -n -v # [scrub download cache, dry run, verbose]
-
super slow, how to speed up ?
-
comment out stack update
-
add , "--stack-root=/Users/simon/.stack" to stack install # fails on permissions
-
-
-
brew test Formula/hledger.rb
-
-
commit with name "hledger X.Y" and description "Update to hledger X.Y."
-
-
get merged
-
git push -f simonmichael
-
gh pr create -f
-
monitor: PR CI, PR merge, https://formulae.brew.sh/formula/hledger page
-
ping brew contributors/maintainers if necessary: @chenrui, @carlocab, @SMillerDev
-
Update nix install command
-
Wait for the new hledger version to land in nixpkgs
- make nix-hledger-version
-
Find the nixpkgs haskell-packages commit post-dating the hledger release:
-
Test the nix-env install command with that commit hash
-
if it fails with "SSL peer certificate or SSH remote key was not OK"
-
. Users/simon.nix-profile/etc/profile.d/nix.sh
-
or re-install:
-
curl -sO https://nixos.org/nix/install
-
less install
-
sh install
-
. Users/simon.nix-profile/etc/profile.d/nix.sh
-
-
-
on linux
-
on mac
-
Update stackage
-
update https://github.com/fpco/stackage/blob/master/build-constraints.yaml if needed
-
monitor for new package versions in nightly: check https://www.stackage.org/package/hledger
Glossary
Here are terms and concepts related to the hledger release process as of 2022, in sufficient detail to guide release management and release automation.
General concepts | |
release | A snapshot of the software and related artifacts like executable binaries, which is named, tagged, documented, announced, and usually picked up by packaging systems on various platforms. |
version control system, VCS | A tool used for storing and sharing and viewing the history and different lines of development of a software project, or other set of files. hledger uses Git. |
repository, repo | A set of files being stored and managed by a VCS. Often published on a repository hosting service, such as Github. |
working copy, clone | A local copy of a repository's files. Typically each developer has one or more of these, and can share changes easily with the official public repository. |
branch | Some VCS's, including Git, can store multiple branching lines of development within one repository. A working copy can be quickly switched to a different branch to show its content. |
master, main | The main branch in a repo, usually named master or main . Pull requests are usually relative to this. |
pull request, PR | A request to merge a development branch with master, and any related discussion. On Github, these are kept alongside issues in the issue tracker. |
continuous integration, CI | Automated actions that run when new code is pushed to a shared repo, such as running tests or producing binaries. On Github this is called Github Actions and action scripts are called workflows. |
hledger concepts | |
package | A releasable unit of Haskell software. hledger has several core packages usually released together: hledger-lib, hledger, hledger-ui, hledger-web. |
hledger version number | A 2-4 part dotted number naming a hledger release or hledger package version: MA.JOR[.MINOR[.FIXUP]] or MA.JOR.99[.PREVIEW] where 99 means "unreleased (MAJOR+1)". See examples below. |
hledger version string | A line of text describing a hledger binary, shown by --version . It contains program name, version number, commit hash and date, machine architecture etc. Eg: hledger 1.24.1-g7799d526b-20211210, mac-x86_64 |
Complete, partial, mixed releases | A release of all the core hledger packages (hledger-lib, hledger, hledger-ui, hledger-web) is called complete. A release of only some of the core packages is called partial. A release where some packages have different versions (because of a previous partial release) is called mixed. Major and preview releases are always complete, bugfix and fixup releases can be partial and/or mixed. |
changelog | A CHANGES.md file listing the release history and the changes in each release. There is one for each hledger package and one for the hledger project as a whole. |
release notes | The Release Notes page on the hledger website: the combined release history of the core hledger packages, showing user visible changes only. |
hledger release/build types | |
Major release | Major releases include new features and incompatible API changes, and normally happen at the start of each quarter's third month (3/1, 6/1, 9/1, 12/1). Example version number: 1.25 |
Bugfix release | Bugfix releases include only bug fixes, without API changes. These happen when needed, to fix significant bugs in the previous major release. Example version number: 1.25.2 ("second bugfix release for 1.25") |
Fixup release | Fixup releases fix packaging errors, with no changes to the hledger software. These should be rare. Example version number: 1.25.0.1 or 1.25.2.1 ("first fixup release for 1.25 / 1.25.2") |
Preview release | A preview of the upcoming major release for testers/early adopters, and a test of the release process, published on Github. Not a formal hledger release, eg not published on Hackage, usually not packaged, no bugfix releases, no regression bounties, not shown in release notes. These typically appear in the quarter's first and second month if needed. Example version number: 1.25.99.1 ("preview 1 of 1.26") |
CI binaries | Temporary downloadable binaries produced by a run of the linux /mac /windows workflows in the hledger repo. This may happen periodically, eg weekly. Downloading requires a Github login. |
Dev build | A local developer build of unreleased code. This is typically in master or a development/PR branch. Example version number: 1.25.99 ("unreleased 1.26-dev") |
hledger repos and branches | |
hledger repo | The hledger git repository, containing the hledger software, reference manuals, and developer docs. https://github.com/simonmichael/hledger |
site repo | The hledger_website git repository, containing most of the hledger website which appears at https://hledger.org. Usually checked out under the hledger repo as site/ . https://github.com/simonmichael/hledger_website |
master | The branch named master in the hledger repo; the main line of hledger development. Pull requests are usually relative to this. |
release branch | Branches named MA.JOR-branch in the hledger repo, eg 1.25-branch . Releases and release previews are always made from a release branch. |