RussellSpitzer opened a new pull request, #3548: URL: https://github.com/apache/parquet-java/pull/3548
Includes 85 bats unit tests covering all shared libraries. <!-- Thanks for opening a pull request! If you're new to Parquet-Java, information on how to contribute can be found here: https://parquet.apache.org/docs/contribution-guidelines/contributing Please open a GitHub issue for this pull request: https://github.com/apache/parquet-java/issues/new/choose and format pull request title as below: GH-${GITHUB_ISSUE_ID}: ${SUMMARY} or simply use the title below if it is a minor issue: MINOR: ${SUMMARY} --> ### Rationale for this change Adds a release automation framework modeled after Apache Polaris, adapted for Parquet's Maven-based build. Replaces the manual maven-release-plugin workflow with explicit, scriptable steps that support both CI (GitHub Actions) and local execution, with dry-run by default. ### What changes are included in this PR? Scripts (release/bin/): - prepare-rc.sh: full pre-vote flow (branch, version, tag, Nexus, SVN, GitHub pre-release, vote email) - publish-release.sh: full post-vote flow (SVN promotion, final tag, Nexus release, GitHub release, version bump, announce email) - cancel-rc.sh: rollback a failed RC (Nexus drop, SVN cleanup) Shared libraries (release/libs/): - _constants.sh, _log.sh, _exec.sh, _version.sh - _github.sh, _nexus.sh, _maven.sh GitHub Actions workflows: - release-prepare-rc.yml, release-publish.yml, release-cancel-rc.yml - ci-release-scripts.yml (bats unit tests on PR/push) ### Are these changes tested? Only locally and with fake commands. **To actually make this work we also have to raise an Infra ticket to get appropriate secrets applied to the parquet-java repo.** ### Are there any user-facing changes? No, just for contributors ---- ## Release Workflow This PR replaces the manual release process (documented in [How to Release](https://parquet.apache.org/docs/contribution-guidelines/releasing/) and the existing `dev/` scripts: `prepare-release.sh`, `source-release.sh`, `finalize-release`) with three GitHub Actions workflows backed by locally-runnable Bash scripts. All workflows default to **dry-run mode**. ### 1. Prepare RC (Pre-Vote) The release manager launches the **"Prepare Release Candidate"** workflow (`release-prepare-rc.yml`) via `workflow_dispatch` with: - **version** — release version (e.g. `1.18.0`) - **rc_number** *(optional)* — override RC number (auto-detected if empty) - **dry_run** — defaults to `true`; set to `false` for real execution | # | Step in `prepare-rc.sh` | Replaces (docs / existing script) | |---|-------------------------|-----------------------------------| | 0 | Validate inputs | *New* — checks version format, verifies `gpg`/`svn`/`mvnw` | | 1 | Create release branch | Manual `git branch parquet-X.Y.x` | | 2 | Auto-detect RC number | Manual decision by release manager | | 3 | Verify CI checks | Manual check of GitHub Actions UI | | 4 | Set POM versions | `dev/prepare-release.sh` (`mvn release:prepare`) | | 5 | Create RC tag and push | `dev/prepare-release.sh` (`mvn release:prepare`) | | 6 | Deploy to Nexus | Manual `mvn release:perform` (prompted by `prepare-release.sh`) | | 7 | Build source tarball | `dev/source-release.sh` (`git archive`, `gpg`, `shasum`) | | 8 | Stage to SVN dist/dev | `dev/source-release.sh` (`svn co`, `svn add`, `svn ci`) | | 9 | Create GitHub pre-release | *New* — creates a GitHub pre-release with auto-generated notes | The script also generates a `[VOTE]` email template with all links and hashes. The release manager copies this and **manually sends it** to `[email protected]`. ### 2. Vote The release manager waits 72 hours for the community vote and tallies the results manually. --- ### If the vote fails → Cancel RC The release manager launches the **"Cancel Release Candidate"** workflow (`release-cancel-rc.yml`) via `workflow_dispatch` with: - **version** — release version (e.g. `1.18.0`) - **rc_number** — the RC number to cancel (e.g. `1`) - **staging_repo_id** — Nexus staging repository ID (e.g. `orgapacheparquet-1234`) - **dry_run** — defaults to `true` | # | Step in `cancel-rc.sh` | Replaces (docs / existing script) | |---|------------------------|-----------------------------------| | 1 | Drop Nexus staging repo | Manual Nexus UI operation | | 2 | Delete SVN artifacts from dist/dev | Manual `svn rm` | The script also generates a `[RESULT][VOTE]` failure email template. The release manager fills in the failure reason and **manually sends it**. --- ### If the vote passes → Publish Release The release manager launches the **"Publish Release"** workflow (`release-publish.yml`) via `workflow_dispatch` with: - **version** — release version (e.g. `1.18.0`) - **rc_number** *(optional)* — RC that passed the vote (auto-detects latest if empty; rejects older RCs) - **staging_repo_id** — Nexus staging repository ID (e.g. `orgapacheparquet-1234`) - **next_dev_version** — next development version without `-SNAPSHOT` (e.g. `1.18.1`) - **dry_run** — defaults to `true` | # | Step in `publish-release.sh` | Replaces (docs / existing script) | |---|------------------------------|-----------------------------------| | 1 | SVN Promotion | Manual `svn mv` from `dist/dev` to `dist/release` | | 2 | Old Release Cleanup | Manual `svn rm` of prior versions | | 3 | Create final release tag | `dev/finalize-release` (`git tag`) | | 4 | Release Nexus staging repo | Manual Nexus UI "Release" button | | 5 | Create GitHub Release | Manual GitHub UI release creation | | 6 | Bump to next dev version | `dev/finalize-release` (`mvn release:update-versions`, `versions:set-property`, `git commit`) | ### 3. Manual Follow-ups After the publish workflow completes, the release manager must: 1. **Send the `[ANNOUNCE]` email** (generated by step 7 of `publish-release.sh`) to `[email protected]` and `[email protected]` 2. **Create a PR against [`apache/parquet-site`](https://github.com/apache/parquet-site)** on the `staging` branch with the blog post template (generated by step 8 of `publish-release.sh`) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected] --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
