Hi Robert

Thanks for this !

I will take a look at the script, but the overall process looks good to me.

In order to use "comparison" (in the outputs), I propose:
1. To do 0.9.0 "manually", as I already started(I created
https://github.com/apache/polaris/pull/495 to fix what we need for the
0.9.0-incubating-rc2, I still have to include LICENSE.bin in
polaris-service distribution)
2. After review and 0.9.0-incabuting release, merge release script on main

I hope to have time to review during the weekend.

Regards
JB

On Thu, Nov 28, 2024 at 10:27 AM Robert Stupp <sn...@snazy.de> wrote:
>
> Hi all,
>
> (Sorry, big topic...)
>
> In this [1] draft pull request I have started a way to
> semi-automatically do releases, following the Apache rules (draft RC ->
> vote -> publish -> announce). It is intended to be run in Github actions
> and handles all the various manual steps, which can be time consuming
> and are not that easy to get right all the time.
>
> Building releases is in general a sensitive task that should be
> performed in a separate environment in a reproducible way. Doing
> releases in Github workflows and is a suitable environment for releases.
> The necessary secrets (credentials for GPG, dist.apache.org, Apache
> Sonatype and later for container registries) are only needed by the
> release related workflows. It also makes it easier for non-(P)PMC
> members to do releases.
>
> While the scripts in the mentioned PR are intended to be run in GH
> workflows, those can also be run locally for development and testing
> purposes. Local runs do intentionally not touch Apache's Sonatype nor
> dist.apache.org (SVN is simulated using local SVN repos, so the only
> difference is the checkout location).
>
> The "Git logic" is based on the principle to _not_ touch (change/push
> to) the 'main' branch (or a version branch). This is quite important for
> multiple reasons:
> * Doing releases based on a specific commit that's not the "head" of a
> branch
> * Relying on pushes to the source branch from the release process can
> easily race w/ concurrent commits/merges and let the release process fail
>
> Instead, the release script(s) create a new commit with the necessary
> changes (version.txt, generated release notes and some release meta
> information) and creates a Git tag on that one. As an example:
>
>           O   <-- Git tag 'apache-polaris-1.2.3-rc1'
>          /
> ---O---O---O---O---    <-- 'main' branch (or some version branch like
> polaris-1.2)
>
> Once the release has been drafted (all artifacts pushed/staged, the
> RC-commit/tag has been created and pushed, vote email proposal
> generated), the release vote can happen. If the vote fails, a new RC can
> be created - the scripts take care of incrementing the RC number
> (iteration). If the vote passes, the release can be published.
> Publishing means that the Sonatype staging repository is released (Maven
> artifacts published), a release Git tag is added to the RC Git tag (e.g.
> 'apache-polaris-1.2.3' - without the '-rcX' suffix), the source tarball
> files are "moved" to the releases-SVN, website updated with the new
> release, announcement-email proposal generated.
>
> All scripts have some help and validation and runtime check logic. This
> covers things like:
> * The Git worktree must not be dirty
> * Cannot create a draft (RC) for an already released version
> * Cannot publish an already released version
> * Automatically add the "-incubating" suffix to the version
> (conditional, checks the "podling" status in whimsy.apache.org)
> But also:
> * Automatically increment the patch version - for example trying to a
> version 1.2 release and 1.2.3 has already been released (Git tag
> exists), an 1.2.4-rc1 will be created
> * Automatically increment RC iteration (latest Git tag for a 1.2 release
> is already an RC) - is is the case when a release vote failed
>
> Noteworthy:
> * The (previous) content of the version.txt file does not matter. The
> release scripts overwrite the file with the "correct" version.
> * The Git tags do not have the "-incubating" suffix, because that makes
> handling the Git tags overly complex - especially when becoming a TLP.
> The version itself however gets the "-incubating" suffix
>
> How the scripts are actually invoked in production:
> * releases/bin/draft-release.sh --major 2 --minor 4
> * releases/bin/publish-release.sh --major 2 --minor 4
>
> For local tests, start with adding the '--dry-run' option. When trying
> it out without the '--dry-run' option, make sure your local
> 'versioned-docs' branch does NOT have 'apache/polaris' as its Git
> upstream (publish-release.sh would push to it!). Also note that
> artifacts will be signed, so you need to have gpg setup (uses the gpg
> agent locally).
>
>
> The release notes are generated from two major sources as markdown:
> * Git commits between the previous version and the released version
> * Contents of the (new) NEXT_RELEASE_NOTES.md file
> The generated release notes start with a "thank you" to the contributors
> for that release, followed by the content of the NEXT_RELEASE_NOTES.md
> (if not empty) and the Git commits (subject, author and body), which are
> enriched with links to GitHub (PR + commit)
>
>
> Sorry for the wall of text,
>
> Robert
>
>
> PS: On top of the actual release scripts, there are also scripts to
> handle version branches like 1.x, 1.0.x - those are not necessary for
> the release process though.
>
>
> [1] https://github.com/apache/polaris/pull/485
>
> --
> Robert Stupp
> @snazy
>

Reply via email to