This is an automated email from the ASF dual-hosted git repository.
yuxia pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss-rust.git
The following commit(s) were added to refs/heads/main by this push:
new f8ebc5e doc: introduce how to verify a release document (#282)
f8ebc5e is described below
commit f8ebc5ee83af5243ece863e3896a35d9afe2bc36
Author: yuxia Luo <[email protected]>
AuthorDate: Sun Feb 8 20:51:53 2026 +0800
doc: introduce how to verify a release document (#282)
---
bindings/cpp/README.md | 57 ++++++++++++++
bindings/python/README.md | 7 ++
crates/fluss/README.md | 43 ++++++++++
docs/creating-a-release.md | 16 ++--
docs/verifying-a-release-candidate.md | 142 ++++++++++++++++++++++++++++++++++
scripts/release.sh | 13 ++--
6 files changed, 265 insertions(+), 13 deletions(-)
diff --git a/bindings/cpp/README.md b/bindings/cpp/README.md
new file mode 100644
index 0000000..2556a4b
--- /dev/null
+++ b/bindings/cpp/README.md
@@ -0,0 +1,57 @@
+<!--
+ 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.
+-->
+
+# Apache Fluss™ C++ Bindings (Incubating)
+
+C++ bindings for Fluss, built on top of the [fluss-rust](../../crates/fluss)
client. The API is exposed via a C++ header
([include/fluss.hpp](include/fluss.hpp)) and implemented with Rust FFI.
+
+## Requirements
+
+- Rust (see [rust-toolchain.toml](../../rust-toolchain.toml) at repo root)
+- C++17-capable compiler
+- CMake 3.18+ and/or Bazel
+- Apache Arrow (for Arrow-based APIs)
+
+## Build
+
+From the repository root or from `bindings/cpp`:
+
+**With CMake:**
+
+```bash
+cd bindings/cpp
+mkdir build && cd build
+cmake ..
+cmake --build .
+```
+
+**With Bazel:**
+
+```bash
+cd bindings/cpp
+bazel build //...
+```
+See [ci.sh](ci.sh) for the CI build sequence.
+
+
+## TODO
+
+- [] How to introduce fluss-cpp in your own project,
https://github.com/apache/opendal/blob/main/bindings/cpp/README.md is a good
reference
+- [ ] Add CMake/Bazel install and packaging instructions.
+- [ ] Document API usage and minimal example in this README.
+- [ ] Add more C++ examples (log scan, upsert, etc.).
diff --git a/bindings/python/README.md b/bindings/python/README.md
index 44d6099..b097039 100644
--- a/bindings/python/README.md
+++ b/bindings/python/README.md
@@ -53,6 +53,8 @@ Used for writing data to tables, supports PyArrow and Pandas
Used for scanning table log data
+
+# todo: we may move the following part to DEVELOPMENT.md
## Development
## Requirements
@@ -143,6 +145,11 @@ bindings/python/
└── example.py
```
+## TODO
+
+- [ ] Add basic usage examples in API Overview (code snippets for Config,
FlussConnection, FlussAdmin, FlussTable).
+- [ ] Add a "Verifying a release" subsection with install-from-TestPyPI/PyPI
and smoke-test steps.
+
## License
Apache 2.0 License
diff --git a/crates/fluss/README.md b/crates/fluss/README.md
new file mode 100644
index 0000000..bee8ce8
--- /dev/null
+++ b/crates/fluss/README.md
@@ -0,0 +1,43 @@
+<!--
+ 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.
+-->
+
+# Apache Fluss™ Rust Client (Incubating)
+
+Rust client library for [Apache Fluss™](https://fluss.apache.org/). This crate
provides the core client used by the fluss-rust workspace and by the Python and
C++ bindings.
+
+# Todo: move how to use to the first, and how to build to the last,
https://github.com/apache/opendal/blob/main/core/README.md
+# is a good reference
+
+## Requirements
+
+- Rust (see [rust-toolchain.toml](../../rust-toolchain.toml) at repo root)
+- protobuf (for build)
+
+## Build
+
+From the repository root:
+
+```bash
+cargo build -p fluss-rs
+```
+
+## Quick start and examples
+
+## TODO
+- [ ] Expand API documentation and usage examples in this README.
+- [ ] Add more examples for table, log scan, and write flows.
diff --git a/docs/creating-a-release.md b/docs/creating-a-release.md
index 95714d9..164b64b 100644
--- a/docs/creating-a-release.md
+++ b/docs/creating-a-release.md
@@ -217,11 +217,13 @@ just release $RELEASE_VERSION
This creates under `dist/`:
-- `fluss-rust-${RELEASE_VERSION}.tar.gz`
-- `fluss-rust-${RELEASE_VERSION}.tar.gz.sha512`
-- `fluss-rust-${RELEASE_VERSION}.tar.gz.asc`
+- `fluss-rust-${RELEASE_VERSION}-incubating.tgz`
+- `fluss-rust-${RELEASE_VERSION}-incubating.tgz.sha512`
+- `fluss-rust-${RELEASE_VERSION}-incubating.tgz.asc`
-Verify with: `gpg --verify dist/fluss-rust-${RELEASE_VERSION}.tar.gz.asc
dist/fluss-rust-${RELEASE_VERSION}.tar.gz`
+(Incubator policy requires the word "incubating" in release artifact names.)
+
+Verify with: `gpg --verify
dist/fluss-rust-${RELEASE_VERSION}-incubating.tgz.asc
dist/fluss-rust-${RELEASE_VERSION}-incubating.tgz`
### 4. Stage artifacts to SVN (dist.apache.org dev)
@@ -231,7 +233,7 @@ From the **fluss-rust** repo root, check out the Fluss dev
area and add the rele
svn checkout https://dist.apache.org/repos/dist/dev/incubator/fluss
fluss-dist-dev --depth=immediates
cd fluss-dist-dev
mkdir $SVN_RC_DIR
-cp ../dist/fluss-rust-${RELEASE_VERSION}.* $SVN_RC_DIR/
+cp ../dist/fluss-rust-${RELEASE_VERSION}-incubating.* $SVN_RC_DIR/
svn add $SVN_RC_DIR
svn status
svn commit -m "Add fluss-rust ${RELEASE_VERSION} RC${RC_NUM}"
@@ -282,7 +284,7 @@ PyPI (release) / TestPyPI (RC):
* https://pypi.org/project/pyfluss/
* https://test.pypi.org/project/pyfluss/
-Please download, verify, and test. Verification steps are in the project docs
(todo: add how to verify release).
+Please download, verify, and test. Verification steps are in [How to Verify a
Release Candidate](verifying-a-release-candidate.md).
The vote will be open for at least 72 hours. It is adopted by majority
approval with at least 3 PPMC affirmative votes (or as per project policy).
@@ -449,5 +451,5 @@ After finishing the release, consider what could be
improved (simplifications, c
## See also
- [Release Manager
Preparation](https://fluss.apache.org/community/how-to-release/release-manager-preparation/)
— GPG and one-time setup
-- [Verifying a Fluss
Release](https://fluss.apache.org/community/how-to-release/verifying-a-fluss-release/)
— How to verify artifacts (adapt for fluss-rust source tarball)
+- [How to Verify a Release Candidate](verifying-a-release-candidate.md) —
Verify signatures, checksums, build, and tests for a release candidate
- [ASF Release Policy](https://www.apache.org/legal/release-policy.html)
diff --git a/docs/verifying-a-release-candidate.md
b/docs/verifying-a-release-candidate.md
new file mode 100644
index 0000000..e67d4ef
--- /dev/null
+++ b/docs/verifying-a-release-candidate.md
@@ -0,0 +1,142 @@
+<!--
+ 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.
+-->
+
+# How to Verify a Release Candidate
+
+This document describes how to verify a release candidate (RC) of the **Fluss
clients** (fluss-rust, fluss-python, fluss-cpp) from the
[fluss-rust](https://github.com/apache/fluss-rust) repository. It is intended
for anyone participating in the release vote (binding or non-binding) and is
based on [Verifying a Fluss
Release](https://fluss.apache.org/community/how-to-release/verifying-a-fluss-release/)
of the Apache Fluss project, adapted for the fluss-rust source distribution
and tooling [...]
+
+## Validating distributions
+
+The release vote email includes links to:
+
+- **Distribution archive:** source tarball
(`fluss-rust-${RELEASE_VERSION}-incubating.tgz`) on [dist.apache.org
dev](https://dist.apache.org/repos/dist/dev/incubator/fluss/)
+- **Signature file:** `fluss-rust-${RELEASE_VERSION}-incubating.tgz.asc`
+- **Checksum file:** `fluss-rust-${RELEASE_VERSION}-incubating.tgz.sha512`
+- **KEYS file:**
[https://downloads.apache.org/incubator/fluss/KEYS](https://downloads.apache.org/incubator/fluss/KEYS)
+
+Download the archive (`.tgz`), `.asc`, and `.sha512` from the RC directory
(e.g. `fluss-rust-0.1.0-rc1/`) and the KEYS file. Then follow the steps below
to verify signatures and checksums.
+
+## Verifying signatures
+
+First, import the keys into your local keyring:
+
+```bash
+curl https://downloads.apache.org/incubator/fluss/KEYS -o KEYS
+gpg --import KEYS
+```
+
+Next, verify all `.asc` files:
+
+```bash
+for i in *.tgz; do echo $i; gpg --verify $i.asc $i; done
+```
+
+If verification succeeds, you will see a message like:
+
+```text
+gpg: Signature made ...
+gpg: using RSA key ...
+gpg: Good signature from "Release Manager Name (CODE SIGNING KEY)
<[email protected]>"
+```
+
+## Verifying checksums
+
+Next, verify the tarball(s) using the provided `.sha512` file(s). Each
`.sha512` file lists the expected SHA-512 hash for the corresponding archive;
`-c` reads that file and checks the archive.
+
+**On macOS (shasum):**
+
+```bash
+shasum -a 512 -c fluss-rust-${RELEASE_VERSION}-incubating.tgz.sha512
+```
+
+**On Linux (sha512sum):**
+
+```bash
+sha512sum -c fluss-rust-${RELEASE_VERSION}-incubating.tgz.sha512
+```
+
+If you have multiple archives, run `-c` on each `.sha512` file (or use `shasum
-a 512 -c *.sha512` / `sha512sum -c *.sha512`).
+
+If the verification is successful, you will see a message like this:
+
+```text
+fluss-rust-0.1.0-incubating.tgz: OK
+```
+
+## Verifying build
+
+Extract the source release archive and verify that it builds (and optionally
that tests pass). You need **Rust** (see
[rust-toolchain.toml](https://github.com/apache/fluss-rust/blob/main/rust-toolchain.toml)
for the expected version) and, for full builds, **protobuf** and **Python
3.9+** for bindings.
+
+```bash
+tar -xzf fluss-rust-${RELEASE_VERSION}-incubating.tgz
+cd fluss-rust-${RELEASE_VERSION}-incubating
+```
+
+Build the workspace:
+
+```bash
+cargo build --workspace --release
+```
+
+For Python bindings, see the project
[README](https://github.com/apache/fluss-rust#readme) and [Development
Guide](https://github.com/apache/fluss-rust/blob/main/DEVELOPMENT.md). For C++
bindings, see `bindings/cpp/`.
+
+## Verifying LICENSE and NOTICE
+
+Unzip the source release archive and verify that:
+
+1. The **LICENSE** and **NOTICE** files in the root directory are correct and
refer to dependencies in the source release (e.g. files in the repository such
as fonts, CSS, JavaScript, images).
+2. All files that need it have ASF license headers.
+3. All dependencies have been checked for their license and the license is ASL
2.0 compatible ([ASF third-party license
policy](http://www.apache.org/legal/resolved.html#category-x)).
+4. Compatible non-ASL 2.0 licenses are documented (e.g. in NOTICE or in
dependency audit files such as `DEPENDENCIES*.tsv`).
+
+The project uses [cargo-deny](https://embarkstudios.github.io/cargo-deny/) for
license checks; see [Creating a Fluss Rust Client
Release](creating-a-release.md) for how the dependency list is generated before
a release.
+
+## Testing features
+
+For any user-facing feature included in a release, we aim to ensure it is
functional, usable, and well-documented. Release managers may create testing
issues that outline key scenarios to validate; these are open to all community
members.
+
+**Per-language verification:** For **Rust** and **C++**, build from the source
release and write your own test cases to verify. For **Python**, the RC is
published to **TestPyPI**; install the client from TestPyPI and write your own
test cases (e.g. connect, create table, read/write) to verify. Use the README
in each component as the entry point:
+
+- **Rust client:** You can depend on the RC via its git tag (e.g. in your
`Cargo.toml`: `fluss-rs = { git = "https://github.com/apache/fluss-rust", tag =
"v${RELEASE_VERSION}-rc${RC_NUM}" }`) and build your own test project to
verify. Alternatively, build from the source release; see
[crates/fluss/README.md](../crates/fluss/README.md).
+- **Python bindings:** See
[bindings/python/README.md](../bindings/python/README.md) for how to add the
Python client (for an RC, install from **TestPyPI**: `pip install -i
https://test.pypi.org/simple/ pyfluss==${RELEASE_VERSION}`); then write test
cases to verify.
+- **C++ bindings:** See [bindings/cpp/README.md](../bindings/cpp/README.md)
for how to build and link the C++ client; then write test cases to verify.
+
+## Incubator release checklist
+
+If the project is in incubation, the ASF Incubator provides a release
checklist. You can refer to it when verifying the release:
+
+- [Incubator Release
Checklist](https://cwiki.apache.org/confluence/display/INCUBATOR/Incubator+Release+Checklist)
+
+## Voting
+
+Votes are cast by replying to the vote email on the dev mailing list with
**+1**, **0**, or **-1**.
+
+In addition to your vote, it is customary to state whether your vote is
**binding** or **non-binding**. Only members of the PPMC and mentors have
formally binding votes (and the IPMC on the Incubator general list). If unsure,
you can state that your vote is non-binding. See [Apache Foundation
Voting](https://www.apache.org/foundation/voting.html).
+
+It is recommended to include a short list of what you verified (e.g.
signatures, checksums, build, tests, LICENSE/NOTICE). This helps the community
see what has been checked and what might still be missing.
+
+**Checklist you can reference in your vote:**
+
+- [ ] [Validating distributions](#validating-distributions)
+- [ ] [Verifying signatures](#verifying-signatures)
+- [ ] [Verifying checksums](#verifying-checksums)
+- [ ] [Verifying build](#verifying-build)
+- [ ] [Verifying LICENSE and NOTICE](#verifying-license-and-notice)
+- [ ] [Testing features](#testing-features)
+- [ ] [Incubator release checklist](#incubator-release-checklist) (if
applicable)
+
diff --git a/scripts/release.sh b/scripts/release.sh
index 8187d1f..e4e6b07 100755
--- a/scripts/release.sh
+++ b/scripts/release.sh
@@ -14,10 +14,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
#
-# Create ASF source release artifacts under dist/:
-# fluss-rust-{version}.tar.gz
-# fluss-rust-{version}.tar.gz.asc
-# fluss-rust-{version}.tar.gz.sha512
+# Create ASF source release artifacts under dist/ (aligned with Fluss release
package format):
+# fluss-rust-{version}-incubating.tgz
+# fluss-rust-{version}-incubating.tgz.asc
+# fluss-rust-{version}-incubating.tgz.sha512
+# (Incubator policy requires "incubating" in the artifact name.)
# Run from repo root. Check out the release tag first (e.g. git checkout
v0.1.0-rc1).
# Usage: ./scripts/release.sh [version]
# If version is omitted, it is read from Cargo.toml
(workspace.package.version).
@@ -37,9 +38,9 @@ else
fi
fi
-PREFIX="fluss-rust-${VERSION}"
+PREFIX="fluss-rust-${VERSION}-incubating"
DIST_DIR="${REPO_ROOT}/dist"
-TARBALL="${PREFIX}.tar.gz"
+TARBALL="${PREFIX}.tgz"
echo "Creating ASF source release for fluss-rust ${VERSION}"
mkdir -p "$DIST_DIR"