As I get older I feel less inclined to spend a lot of time every time I release one of my projects on GitHub, especially since I have a lot of projects that are currently maintained. As I write this I have 59 repositories. Most of them are my own projects, and a handful of them are under active development with frequent new releases.
Compiling a release of something like NextApp is a complex task that takes several days. Parts of the build run on Jenkins on my own infrastructure, other parts run on GitHub Actions, and when everything is ready I still have to create the actual release with appropriate release notes. That is not something I do very often.
Small libraries and utilities are different. Those are updated and released frequently, so I have gradually moved towards the most convenient workflow I could come up with for GitHub releases.
For most of my projects I use GitHub Actions to build release binaries on every commit to the main branch whenever there are code changes or changes to the build scripts. My C++ projects all use CMake, and the project version is defined in the root CMake file.
When I want to publish a release, I simply trigger a release workflow manually from GitHub. The workflow checks out the project, extracts the version from the root CMake file, and creates a tag using that version. If a release with the same version already exists, it aborts. I never want to re-publish a releases with the same version number. If I make a mistake, I delete the release and its tag manually before trying again.

The workflow then generates release notes from the commits since the previous release and takes the latest successful build from the main branch and attaches it to the GitHub release.
For example, if I build a Flatpak for one of my utilities, the artifact generated by GitHub Actions will disappear after a few days. When I create a release, that same build is copied into the release assets where it remains until I delete the release or the project.
Instead of spending one, two, or even three hours preparing a release, I now spend one or two minutes at most. I trigger the workflow and let it do the work.
I like that. It gives me more time to work on things I actually enjoy, like writing blog posts about the changes, working on the code itself, and not least walking my dogs. I definitely prefer walking my dogs to spending time on trivial office work.
An example: OneRss release workflow.
