blob: 9ae869a590c7b1b99de87ea72cef77c86cb8de08 [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.
################################################################################
name: Release PyPaimon Publish
on:
workflow_call:
inputs:
release_version:
required: true
type: string
secrets:
TEST_PYPI_API_TOKEN:
required: true
PYPI_API_TOKEN:
required: true
concurrency:
group: release-python-publish-${{ github.ref }}
cancel-in-progress: false
permissions:
actions: read
contents: read
jobs:
publish:
name: Publish PyPaimon
if: >-
github.repository == 'apache/paimon' &&
startsWith(github.ref, 'refs/tags/')
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/download-artifact@v6
with:
name: pypaimon-distributions
path: dist
- name: Verify package versions
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
expected_version="${release_version}"
if [[ "${GITHUB_REF_NAME}" == *-rc* ]]; then
expected_version="${release_version}rc${GITHUB_REF_NAME##*-rc}"
fi
test -f "dist/pypaimon-${expected_version}.tar.gz"
compgen -G "dist/pypaimon-${expected_version}-*.whl" > /dev/null
shopt -s nullglob
distributions=(dist/*)
if [[ "${#distributions[@]}" -ne 2 ]]; then
echo "Expected one sdist and one wheel, found ${#distributions[@]} files" >&2
printf '%s\n' "${distributions[@]}" >&2
exit 1
fi
echo "version=${expected_version}" >> "${GITHUB_OUTPUT}"
- name: Reject existing TestPyPI RC version
if: contains(github.ref_name, '-rc')
shell: bash
env:
EXPECTED_VERSION: ${{ steps.package_version.outputs.version }}
run: |
set -euo pipefail
status="$(
curl --silent --show-error --output /dev/null \
--write-out '%{http_code}' \
"https://test.pypi.org/pypi/pypaimon/${EXPECTED_VERSION}/json"
)"
case "${status}" in
404)
;;
200)
echo "pypaimon ${EXPECTED_VERSION} already exists on TestPyPI; create a new RC" >&2
exit 1
;;
*)
echo "TestPyPI version check returned HTTP ${status}; refusing to publish" >&2
exit 1
;;
esac
- name: Publish RC to TestPyPI
if: contains(github.ref_name, '-rc')
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e
with:
repository-url: https://test.pypi.org/legacy/
skip-existing: false
packages-dir: dist
password: ${{ secrets.TEST_PYPI_API_TOKEN }}
- name: Publish final release to PyPI
if: ${{ !contains(github.ref_name, '-rc') }}
uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e
with:
packages-dir: dist
password: ${{ secrets.PYPI_API_TOKEN }}