blob: 0dc5112821845c4116231cd225955b32d850fd5d [file]
################################################################################
# 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.
################################################################################
# Build the PyPaimon source distribution and universal wheel. Publishing is
# handled by release-python-publish.yml after this package job passes.
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 }}
cancel-in-progress: false
permissions:
contents: read
jobs:
package:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Set up Python
uses: actions/setup-python@v6
with:
python-version: "3.11"
cache: pip
cache-dependency-path: paimon-python/dev/requirements.txt
- name: Set package version
id: package_version
shell: bash
run: |
set -euo pipefail
source_version="$(
sed -n 's/^VERSION = "\(.*\)"/\1/p' \
paimon-python/setup.py
)"
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="${release_version}"
if [[ "${GITHUB_REF}" == refs/tags/*-rc* ]]; then
rc_number="${GITHUB_REF_NAME##*-rc}"
package_version="${release_version}rc${rc_number}"
sed -i \
"s/^VERSION = \".*\"/VERSION = \"${package_version}\"/" \
paimon-python/setup.py
fi
echo "version=${package_version}" >> "${GITHUB_OUTPUT}"
echo "Building PyPaimon ${package_version}"
- name: Build distributions
working-directory: paimon-python
run: |
python -m pip install --upgrade pip setuptools wheel twine
python setup.py sdist bdist_wheel
python -m twine check dist/*
- name: Verify distribution contents
working-directory: paimon-python
env:
EXPECTED_VERSION: ${{ steps.package_version.outputs.version }}
run: |
python - <<'PY'
import glob
import os
import tarfile
import zipfile
expected = os.environ["EXPECTED_VERSION"]
sdist = "dist/pypaimon-{}.tar.gz".format(expected)
wheels = glob.glob("dist/pypaimon-{}-*.whl".format(expected))
if not os.path.isfile(sdist):
raise SystemExit("Missing expected sdist: {}".format(sdist))
if len(wheels) != 1:
raise SystemExit("Expected one wheel, found: {}".format(wheels))
with tarfile.open(sdist, "r:gz") as archive:
names = archive.getnames()
prefix = "pypaimon-{}/".format(expected)
for required in ("LICENSE", "NOTICE", "README.md", "setup.py"):
if prefix + required not in names:
raise SystemExit("Missing {} from sdist".format(required))
sample_data = "pypaimon/sample/data/data.jsonl"
if prefix + sample_data not in names:
raise SystemExit("Missing sample data from sdist")
for forbidden in ("pypaimon/tests/", "pypaimon/acceptance/"):
if any(name.startswith(prefix + forbidden) for name in names):
raise SystemExit(
"Test content must not be packaged: {}".format(forbidden)
)
with zipfile.ZipFile(wheels[0]) as archive:
names = archive.namelist()
license_files = [
name for name in names
if ".dist-info/" in name and name.endswith("/LICENSE")
]
notice_files = [
name for name in names
if ".dist-info/" in name and name.endswith("/NOTICE")
]
if not license_files or not notice_files:
raise SystemExit("Wheel is missing LICENSE or NOTICE")
if "pypaimon/sample/data/data.jsonl" not in names:
raise SystemExit("Wheel is missing sample data")
for forbidden in ("pypaimon/tests/", "pypaimon/acceptance/"):
if any(name.startswith(forbidden) for name in names):
raise SystemExit(
"Test content must not be packaged: {}".format(forbidden)
)
PY
- name: Upload PyPaimon distributions
uses: actions/upload-artifact@v6
with:
name: pypaimon-distributions
path: |
paimon-python/dist/*.tar.gz
paimon-python/dist/*.whl
if-no-files-found: error