This is an automated email from the ASF dual-hosted git repository.
JingsongLi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new c8987fc021 [release] Use a single release version
c8987fc021 is described below
commit c8987fc0218063befe654fde50bbbf2a64b97e01
Author: JingsongLi <[email protected]>
AuthorDate: Fri Jul 31 21:35:16 2026 +0800
[release] Use a single release version
---
.github/workflows/release-python-publish.yml | 16 +++++--
.github/workflows/release-python.yml | 20 ++++++---
.github/workflows/release.yml | 4 ++
docs/docs/project/creating-a-release.md | 49 +++++++++++-----------
docs/docs/project/verifying-a-release-candidate.md | 15 ++++---
5 files changed, 63 insertions(+), 41 deletions(-)
diff --git a/.github/workflows/release-python-publish.yml
b/.github/workflows/release-python-publish.yml
index a38eb34a09..d2c226d188 100644
--- a/.github/workflows/release-python-publish.yml
+++ b/.github/workflows/release-python-publish.yml
@@ -20,6 +20,10 @@ name: Release PyPaimon Publish
on:
workflow_call:
+ inputs:
+ release_version:
+ required: true
+ type: string
secrets:
TEST_PYPI_API_TOKEN:
required: true
@@ -55,13 +59,19 @@ jobs:
run: |
set -euo pipefail
- base_version="$(
+ source_version="$(
sed -n 's/^VERSION = "\(.*\)"/\1/p' \
paimon-python/setup.py
)"
- expected_version="${base_version}"
+ release_version="${{ inputs.release_version }}"
+ if [[ "${source_version}" != "${release_version}" ]]; then
+ echo "PyPaimon version ${source_version:-missing} does not match
Paimon ${release_version}" >&2
+ exit 1
+ fi
+
+ expected_version="${release_version}"
if [[ "${GITHUB_REF_NAME}" == *-rc* ]]; then
- expected_version="${base_version}rc${GITHUB_REF_NAME##*-rc}"
+ expected_version="${release_version}rc${GITHUB_REF_NAME##*-rc}"
fi
test -f "dist/pypaimon-${expected_version}.tar.gz"
diff --git a/.github/workflows/release-python.yml
b/.github/workflows/release-python.yml
index 5f264aa137..7b2aca7ad1 100644
--- a/.github/workflows/release-python.yml
+++ b/.github/workflows/release-python.yml
@@ -23,7 +23,16 @@ name: Release PyPaimon Package
on:
workflow_call:
+ inputs:
+ release_version:
+ required: true
+ type: string
workflow_dispatch:
+ inputs:
+ release_version:
+ description: Paimon release version
+ required: true
+ type: string
concurrency:
group: release-python-${{ github.ref }}
@@ -51,19 +60,20 @@ jobs:
run: |
set -euo pipefail
- base_version="$(
+ source_version="$(
sed -n 's/^VERSION = "\(.*\)"/\1/p' \
paimon-python/setup.py
)"
- if [[ -z "${base_version}" || "${base_version}" == *dev* ||
"${base_version}" == *rc* ]]; then
- echo "PyPaimon release base version is invalid:
${base_version:-missing}" >&2
+ release_version="${{ inputs.release_version }}"
+ if [[ "${source_version}" != "${release_version}" ]]; then
+ echo "PyPaimon version ${source_version:-missing} does not match
Paimon ${release_version}" >&2
exit 1
fi
- package_version="${base_version}"
+ package_version="${release_version}"
if [[ "${GITHUB_REF}" == refs/tags/*-rc* ]]; then
rc_number="${GITHUB_REF_NAME##*-rc}"
- package_version="${base_version}rc${rc_number}"
+ package_version="${release_version}rc${rc_number}"
sed -i \
"s/^VERSION = \".*\"/VERSION = \"${package_version}\"/" \
paimon-python/setup.py
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 85461490ba..0e81743deb 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -124,6 +124,8 @@ jobs:
name: PyPaimon package
needs: validation
uses: ./.github/workflows/release-python.yml
+ with:
+ release_version: ${{ needs.validation.outputs.release_version }}
python-publish:
name: PyPaimon publish
@@ -136,6 +138,8 @@ jobs:
(needs.java.result == 'success' ||
needs.validation.outputs.release_kind == 'final')
uses: ./.github/workflows/release-python-publish.yml
+ with:
+ release_version: ${{ needs.validation.outputs.release_version }}
secrets:
TEST_PYPI_API_TOKEN: ${{ secrets.TEST_PYPI_API_TOKEN }}
PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
diff --git a/docs/docs/project/creating-a-release.md
b/docs/docs/project/creating-a-release.md
index bba87c010f..0ac9049017 100644
--- a/docs/docs/project/creating-a-release.md
+++ b/docs/docs/project/creating-a-release.md
@@ -46,8 +46,8 @@ Maven project version and `paimon-python/setup.py` version
must be equal.
| --- | --- | --- |
| Paimon source | `apache-paimon-PAIMON_VERSION-src.tgz`, `.asc`, `.sha512` |
ASF distribution |
| Java convenience artifacts | Maven artifacts built in the JDK 8, 11, and 17
lanes | Apache Nexus staging, then Maven Central |
-| PyPaimon source | `pypaimon-PYPAIMON_VERSION.tar.gz`, `.asc`, `.sha512` |
ASF distribution |
-| Python convenience package | `pypaimon==PYPAIMON_VERSIONrcRC_NUMBER` for an
RC | TestPyPI, then `pypaimon==PYPAIMON_VERSION` on PyPI |
+| PyPaimon source | `pypaimon-PAIMON_VERSION.tar.gz`, `.asc`, `.sha512` | ASF
distribution |
+| Python convenience package | `pypaimon==PAIMON_VERSIONrcRC_NUMBER` for an RC
| TestPyPI, then `pypaimon==PAIMON_VERSION` on PyPI |
A combined release vote covers both signed source candidates. This guide does
not define an independent PyPaimon release. Before releasing PyPaimon
@@ -98,7 +98,7 @@ The Java jobs use `-Dgpg.skip=true` and never receive Nexus
credentials or a
GPG private key. Their artifacts are build evidence, not the Maven staging
repositories used for the vote. The Python RC job uses the
`TEST_PYPI_API_TOKEN` repository Actions secret to publish
-`PYPAIMON_VERSIONrcRC_NUMBER` to TestPyPI. The final job uses the
+`PAIMON_VERSIONrcRC_NUMBER` to TestPyPI. The final job uses the
`PYPI_API_TOKEN` repository Actions secret to publish to PyPI. The release
workflow passes only these two secrets to the reusable publishing workflow.
@@ -142,7 +142,6 @@ For the 2.0.0 release, use matching Java and Python
versions:
```shell
PAIMON_VERSION="2.0.0"
-PYPAIMON_VERSION="2.0.0"
RC_NUMBER="1"
RC_REF="release-${PAIMON_VERSION}-rc${RC_NUMBER}"
@@ -186,7 +185,7 @@ NEW_VERSION="${PAIMON_VERSION}" \
```
Set `VERSION` in `paimon-python/setup.py` to the final
-`PYPAIMON_VERSION`, without `.dev` or an RC suffix. The release workflow
+`PAIMON_VERSION`, without `.dev` or an RC suffix. The release workflow
derives the TestPyPI version by appending `rcRC_NUMBER`; the source candidate
keeps the final version.
@@ -212,7 +211,7 @@ same-named local RC branch. Use an explicit tag ref when
pushing:
```shell
git tag -s "${RC_REF}" \
- -m "Apache Paimon ${PAIMON_VERSION} and PyPaimon ${PYPAIMON_VERSION}
RC${RC_NUMBER}"
+ -m "Apache Paimon ${PAIMON_VERSION} and PyPaimon ${PAIMON_VERSION}
RC${RC_NUMBER}"
git tag -v "${RC_REF}"
git push origin \
@@ -291,17 +290,17 @@ RELEASE_VERSION="${PAIMON_VERSION}" \
cd paimon-python
python3 setup.py sdist
gpg --armor --detach-sig \
- "dist/pypaimon-${PYPAIMON_VERSION}.tar.gz"
+ "dist/pypaimon-${PAIMON_VERSION}.tar.gz"
if command -v sha512sum >/dev/null 2>&1; then
- sha512sum "dist/pypaimon-${PYPAIMON_VERSION}.tar.gz" \
- > "dist/pypaimon-${PYPAIMON_VERSION}.tar.gz.sha512"
+ sha512sum "dist/pypaimon-${PAIMON_VERSION}.tar.gz" \
+ > "dist/pypaimon-${PAIMON_VERSION}.tar.gz.sha512"
else
- shasum -a 512 "dist/pypaimon-${PYPAIMON_VERSION}.tar.gz" \
- > "dist/pypaimon-${PYPAIMON_VERSION}.tar.gz.sha512"
+ shasum -a 512 "dist/pypaimon-${PAIMON_VERSION}.tar.gz" \
+ > "dist/pypaimon-${PAIMON_VERSION}.tar.gz.sha512"
fi
-cp "dist/pypaimon-${PYPAIMON_VERSION}.tar.gz"* ../release/
+cp "dist/pypaimon-${PAIMON_VERSION}.tar.gz"* ../release/
cd ..
```
@@ -316,15 +315,15 @@ mkdir
"paimon-dist-dev/paimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
cp "release/apache-paimon-${PAIMON_VERSION}-src.tgz"* \
"paimon-dist-dev/paimon-${PAIMON_VERSION}-rc${RC_NUMBER}/"
-mkdir "paimon-dist-dev/pypaimon-${PYPAIMON_VERSION}-rc${RC_NUMBER}"
-cp "release/pypaimon-${PYPAIMON_VERSION}.tar.gz"* \
- "paimon-dist-dev/pypaimon-${PYPAIMON_VERSION}-rc${RC_NUMBER}/"
+mkdir "paimon-dist-dev/pypaimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
+cp "release/pypaimon-${PAIMON_VERSION}.tar.gz"* \
+ "paimon-dist-dev/pypaimon-${PAIMON_VERSION}-rc${RC_NUMBER}/"
svn add \
"paimon-dist-dev/paimon-${PAIMON_VERSION}-rc${RC_NUMBER}" \
- "paimon-dist-dev/pypaimon-${PYPAIMON_VERSION}-rc${RC_NUMBER}"
+ "paimon-dist-dev/pypaimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
svn commit -m \
- "Stage Paimon ${PAIMON_VERSION} and PyPaimon ${PYPAIMON_VERSION}
RC${RC_NUMBER}" \
+ "Stage Paimon ${PAIMON_VERSION} and PyPaimon ${PAIMON_VERSION}
RC${RC_NUMBER}" \
paimon-dist-dev
```
@@ -341,12 +340,12 @@ Send a plain-text vote to `[email protected]`. Keep
it open for at least
binding `+1` than binding `-1` votes.
```text
-Subject: [VOTE] Release Apache Paimon ${PAIMON_VERSION} and PyPaimon
${PYPAIMON_VERSION} (RC${RC_NUMBER})
+Subject: [VOTE] Release Apache Paimon ${PAIMON_VERSION} and PyPaimon
${PAIMON_VERSION} (RC${RC_NUMBER})
Hi everyone,
Please review and vote on Apache Paimon ${PAIMON_VERSION} and
-PyPaimon ${PYPAIMON_VERSION}, release candidate ${RC_NUMBER}.
+PyPaimon ${PAIMON_VERSION}, release candidate ${RC_NUMBER}.
[ ] +1 Approve
[ ] 0 No opinion
@@ -356,7 +355,7 @@ Paimon source candidate:
https://dist.apache.org/repos/dist/dev/paimon/paimon-${PAIMON_VERSION}-rc${RC_NUMBER}/
PyPaimon source candidate:
-https://dist.apache.org/repos/dist/dev/paimon/pypaimon-${PYPAIMON_VERSION}-rc${RC_NUMBER}/
+https://dist.apache.org/repos/dist/dev/paimon/pypaimon-${PAIMON_VERSION}-rc${RC_NUMBER}/
Signed Git tag:
release-${PAIMON_VERSION}-rc${RC_NUMBER}
@@ -376,7 +375,7 @@ Closed Java staging repositories:
<JDK_17_NEXUS_URL>
PyPaimon RC:
-https://test.pypi.org/project/pypaimon/${PYPAIMON_VERSION}rc${RC_NUMBER}/
+https://test.pypi.org/project/pypaimon/${PAIMON_VERSION}rc${RC_NUMBER}/
Verification guide:
https://github.com/apache/paimon/blob/release-${PAIMON_VERSION}-rc${RC_NUMBER}/docs/docs/project/verifying-a-release-candidate.md
@@ -425,9 +424,9 @@ svn mv -m "Release Apache Paimon ${PAIMON_VERSION}" \
"https://dist.apache.org/repos/dist/dev/paimon/paimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
\
"https://dist.apache.org/repos/dist/release/paimon/paimon-${PAIMON_VERSION}"
-svn mv -m "Release PyPaimon ${PYPAIMON_VERSION}" \
-
"https://dist.apache.org/repos/dist/dev/paimon/pypaimon-${PYPAIMON_VERSION}-rc${RC_NUMBER}"
\
-
"https://dist.apache.org/repos/dist/release/paimon/pypaimon-${PYPAIMON_VERSION}"
+svn mv -m "Release PyPaimon ${PAIMON_VERSION}" \
+
"https://dist.apache.org/repos/dist/dev/paimon/pypaimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
\
+
"https://dist.apache.org/repos/dist/release/paimon/pypaimon-${PAIMON_VERSION}"
```
### Promote convenience artifacts
@@ -437,7 +436,7 @@ svn mv -m "Release PyPaimon ${PYPAIMON_VERSION}" \
2. Release those exact closed repositories to Maven Central. Do not run Maven
deploy again.
3. Confirm that the final tag's PyPI publish job builds
- `pypaimon==PYPAIMON_VERSION` from the approved tag commit and does not
change
+ `pypaimon==PAIMON_VERSION` from the approved tag commit and does not change
project source.
4. Verify Maven Central and PyPI before announcing the release.
diff --git a/docs/docs/project/verifying-a-release-candidate.md
b/docs/docs/project/verifying-a-release-candidate.md
index 1beece391c..9853d9cbea 100644
--- a/docs/docs/project/verifying-a-release-candidate.md
+++ b/docs/docs/project/verifying-a-release-candidate.md
@@ -36,14 +36,13 @@ Take all values and URLs from the vote email:
```shell
PAIMON_VERSION="2.0.0"
-PYPAIMON_VERSION="2.0.0"
RC_NUMBER="1"
RC_TAG="release-${PAIMON_VERSION}-rc${RC_NUMBER}"
PAIMON_RC_DIR="paimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
PAIMON_ARCHIVE="apache-paimon-${PAIMON_VERSION}-src.tgz"
-PYPAIMON_RC_DIR="pypaimon-${PYPAIMON_VERSION}-rc${RC_NUMBER}"
-PYPAIMON_ARCHIVE="pypaimon-${PYPAIMON_VERSION}.tar.gz"
+PYPAIMON_RC_DIR="pypaimon-${PAIMON_VERSION}-rc${RC_NUMBER}"
+PYPAIMON_ARCHIVE="pypaimon-${PAIMON_VERSION}.tar.gz"
```
Download the candidates from ASF dist dev, not from a third-party mirror:
@@ -115,7 +114,7 @@ Check at least the following:
- The Paimon archive has exactly one top-level directory named
`paimon-PAIMON_VERSION`.
- The PyPaimon archive has exactly one top-level directory named
- `pypaimon-PYPAIMON_VERSION`.
+ `pypaimon-PAIMON_VERSION`.
- `LICENSE`, `NOTICE`, README files, build files, dependency declarations, and
required source files are present and correct.
- No Git metadata, IDE state, credentials, Maven `target` directories, Python
@@ -125,7 +124,7 @@ Check at least the following:
and is recorded in `LICENSE` or `NOTICE` where required.
- Maven POMs use `PAIMON_VERSION` without `-SNAPSHOT`.
- `paimon-python/setup.py` and PyPaimon package metadata use
- `PYPAIMON_VERSION` without `.dev`.
+ `PAIMON_VERSION` without `.dev`.
Extract the Paimon candidate:
@@ -285,9 +284,9 @@ python3 -m venv pypaimon-rc-venv
. pypaimon-rc-venv/bin/activate
python -m pip install --upgrade pip setuptools wheel
-cd "pypaimon-${PYPAIMON_VERSION}"
+cd "pypaimon-${PAIMON_VERSION}"
python setup.py sdist bdist_wheel
-python -m pip install "dist/pypaimon-${PYPAIMON_VERSION}"*.whl
+python -m pip install "dist/pypaimon-${PAIMON_VERSION}"*.whl
python -c "import pypaimon; print('PyPaimon import OK')"
cd ..
```
@@ -326,7 +325,7 @@ python3 -m venv pypaimon-testpypi-venv
python -m pip install \
--index-url https://test.pypi.org/simple/ \
--extra-index-url https://pypi.org/simple/ \
- "pypaimon==${PYPAIMON_VERSION}rc${RC_NUMBER}"
+ "pypaimon==${PAIMON_VERSION}rc${RC_NUMBER}"
python -c "import pypaimon; print('TestPyPI package OK')"
```