leaves12138 commented on code in PR #26: URL: https://github.com/apache/paimon-mosaic/pull/26#discussion_r3278859585
########## docs/creating-a-release.html: ########## @@ -0,0 +1,352 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Creating a Release - Paimon Mosaic</title> + <link rel="stylesheet" href="css/style.css"> + <script src="js/main.js"></script> +</head> +<body> + <button class="menu-toggle" aria-label="Menu">☰</button> + <div class="overlay"></div> + + <aside class="sidebar"> + <div class="sidebar-header"> + <h2>Paimon Mosaic</h2> + <p>Columnar-bucket hybrid format</p> + </div> + <nav> + <ul> + <li><a href="index.html">Home</a></li> + <li><a href="design.html">Design</a></li> + <li><a href="java-api.html">Java API</a></li> + <li><a href="python-api.html">Python API</a></li> + <li><a href="cpp-api.html">C++ API</a></li> + <li><a href="releases.html">Releases</a></li> + </ul> + </nav> + <div class="sidebar-footer"> + <button class="theme-toggle">Dark Mode</button> + </div> + </aside> + + <main class="main"> + <div class="content"> + <h1>Creating a Release</h1> + <p class="subtitle">Guide for Release Managers of Apache Paimon Mosaic, following <a href="https://www.apache.org/legal/release-policy.html">ASF Release Policy</a>.</p> + + <!-- ============================================================ --> + <h2>Overview</h2> + <p>The release process consists of:</p> + <ol> + <li><a href="#decide-to-release">Decide to release</a></li> + <li><a href="#prepare-for-the-release">Prepare for the release</a></li> + <li><a href="#build-a-release-candidate">Build a release candidate</a></li> + <li><a href="#vote-on-the-release-candidate">Vote on the release candidate</a></li> + <li><a href="#fix-any-issues">If necessary, fix any issues and go back to step 3</a></li> + <li><a href="#finalize-the-release">Finalize the release</a></li> + <li><a href="#promote-the-release">Promote the release</a></li> + </ol> + + <h3>Automated Publishing</h3> + <p>When a version tag is pushed, GitHub Actions automatically publishes language-specific artifacts:</p> + <table> + <thead> + <tr><th>Component</th><th>Tag Pattern</th><th>Published To</th><th>Pre-release (<code>-rc</code>) Behavior</th></tr> + </thead> + <tbody> + <tr><td>Rust crate</td><td><code>v0.1.0</code></td><td>crates.io</td><td>Dry-run only</td></tr> + <tr><td>Java binding</td><td><code>v0.1.0</code></td><td>Apache Nexus staging</td><td>Deploys to staging</td></tr> + <tr><td>Python binding</td><td><code>v0.1.0</code></td><td>PyPI</td><td>Publishes to TestPyPI</td></tr> + </tbody> + </table> + <p>The Release Manager's primary responsibility is managing the <strong>source release</strong> (tarball + signature) and coordinating the community vote. Language artifact publishing is handled by CI once the tag is pushed.</p> + + <!-- ============================================================ --> + <h2 id="decide-to-release">Decide to Release</h2> + <p>Anybody can propose a release on the dev <a href="https://lists.apache.org/[email protected]">mailing list</a>, giving a short rationale and nominating a committer as Release Manager (including themselves).</p> + <p><strong>Checklist:</strong></p> + <ul> + <li>Community agrees to release</li> + <li>A Release Manager is selected</li> + </ul> + + <!-- ============================================================ --> + <h2 id="prepare-for-the-release">Prepare for the Release</h2> + + <h3>One-time Release Manager Setup</h3> + + <h4>GPG Key</h4> + <ol> + <li> + <p>Install GnuPG:</p> +<pre><code># macOS +brew install gnupg + +# Ubuntu / Debian +sudo apt install gnupg2</code></pre> + </li> + <li> + <p>Generate a key pair (RSA 4096, does not expire, use your <code>@apache.org</code> email):</p> +<pre><code>gpg --full-gen-key</code></pre> + </li> + <li> + <p>Find your key ID:</p> +<pre><code>gpg --list-keys --keyid-format short</code></pre> + </li> + <li> + <p>Upload to key server:</p> +<pre><code>gpg --keyserver hkps://keyserver.ubuntu.com --send-keys <YOUR_KEY_ID></code></pre> + </li> + <li> + <p>Append to the project <a href="https://downloads.apache.org/paimon/KEYS">KEYS</a> file:</p> +<pre><code>svn co https://dist.apache.org/repos/dist/release/paimon/ paimon-dist-release --depth=files +cd paimon-dist-release +(gpg --list-sigs <YOUR_KEY_ID> && gpg --armor --export <YOUR_KEY_ID>) >> KEYS +svn ci -m "Add <YOUR_NAME>'s public key"</code></pre> + </li> + <li> + <p>Configure Git to sign tags:</p> +<pre><code>git config --global user.signingkey <YOUR_KEY_ID></code></pre> + </li> + </ol> + + <h4>GitHub Actions Secrets</h4> + <p>Ensure the following repository secrets are configured:</p> + <table> + <thead> + <tr><th>Secret</th><th>Purpose</th></tr> + </thead> + <tbody> + <tr><td><code>CARGO_REGISTRY_TOKEN</code></td><td>crates.io publishing</td></tr> + <tr><td><code>NEXUS_STAGE_DEPLOYER_USER</code></td><td>Apache Nexus staging</td></tr> + <tr><td><code>NEXUS_STAGE_DEPLOYER_PW</code></td><td>Apache Nexus staging</td></tr> + <tr><td><code>GPG_SECRET_KEY</code></td><td>Java artifact signing</td></tr> + <tr><td><code>GPG_PASSPHRASE</code></td><td>Java artifact signing</td></tr> + <tr><td><code>PYPI_API_TOKEN</code></td><td>PyPI publishing</td></tr> + <tr><td><code>TEST_PYPI_API_TOKEN</code></td><td>TestPyPI publishing</td></tr> + </tbody> + </table> + + <h3>Clone into a Fresh Workspace</h3> +<pre><code>git clone https://github.com/apache/paimon-mosaic.git +cd paimon-mosaic</code></pre> + + <h3>Set Up Environment Variables</h3> +<pre><code>RELEASE_VERSION="0.1.0" +NEXT_VERSION="0.2.0" +RC_NUM="1"</code></pre> + + <h3>Create a Release Branch</h3> +<pre><code>cd tools +RELEASE_VERSION=${RELEASE_VERSION} RELEASE_CANDIDATE=${RC_NUM} ./releasing/create_release_branch.sh</code></pre> + <p>This creates a branch named <code>release-${RELEASE_VERSION}-rc${RC_NUM}</code> from the current HEAD.</p> + + <h3>Bump Version on Main</h3> + <p>After cutting the release branch, bump <code>main</code> to the next version:</p> +<pre><code>git checkout main +cd tools +OLD_VERSION=${RELEASE_VERSION} NEW_VERSION=${NEXT_VERSION} ./releasing/update_branch_version.sh</code></pre> Review Comment: This main-branch bump command still leaves the Java artifact at the old SNAPSHOT version. I simulated the documented command from the current tree: `OLD_VERSION=0.1.0 NEW_VERSION=0.2.0 ./releasing/update_branch_version.sh` updates `core/Cargo.toml` and `python/pyproject.toml` to `0.2.0`, but `java/pom.xml` remains `0.1.0-SNAPSHOT` because the script only replaces exact `<version>0.1.0</version>` entries in POMs. Please either document/use `NEXT_VERSION=0.2.0-SNAPSHOT` for the Java POM path, or make `update_branch_version.sh` handle both `${OLD_VERSION}` and `${OLD_VERSION}-SNAPSHOT` consistently for POMs. -- 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]
