blob: caaf86a89e4d939905f528467c904563b3dd368b [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.
################################################################################
# Orchestrate Java and PyPaimon packaging. Java signing and Nexus staging, plus
# the signed ASF source archives, remain Release Manager responsibilities.
name: Release
on:
push:
tags:
- "release-[0-9]+.[0-9]+.[0-9]+"
- "release-[0-9]+.[0-9]+.[0-9]+-rc[0-9]+"
workflow_dispatch:
concurrency:
group: release-${{ github.ref }}
cancel-in-progress: false
permissions:
actions: read
contents: read
jobs:
validation:
name: Validate release tag
runs-on: ubuntu-latest
outputs:
release_version: ${{ steps.release.outputs.release_version }}
release_kind: ${{ steps.release.outputs.release_kind }}
rc_number: ${{ steps.release.outputs.rc_number }}
steps:
- uses: actions/checkout@v6
- name: Set up JDK 8
uses: actions/setup-java@v5
with:
java-version: 8
distribution: temurin
cache: maven
- name: Set up Maven
uses: stCarolas/setup-maven@12eb41b233df95d49b0c11fc1b5bc8312e5d4ce0 # v5.1
with:
maven-version: 3.8.8
- name: Validate tag against project version
id: release
shell: bash
run: |
set -euo pipefail
if [[ "${GITHUB_REF}" != refs/tags/* ]]; then
echo "Release workflow must run from a tag, got ${GITHUB_REF}" >&2
exit 1
fi
release_version="$(
mvn -q -DforceStdout help:evaluate \
-Dexpression=project.version
)"
if [[ -z "${release_version}" || "${release_version}" == *-SNAPSHOT ]]; then
echo "Project release version is invalid: ${release_version:-missing}" >&2
exit 1
fi
python_release_version="$(
sed -n 's/^VERSION = "\(.*\)"/\1/p' \
paimon-python/setup.py
)"
if [[ "${python_release_version}" != "${release_version}" ]]; then
echo "PyPaimon version ${python_release_version:-missing} does not match Paimon ${release_version}" >&2
exit 1
fi
final_tag="release-${release_version}"
rc_prefix="${final_tag}-rc"
release_kind=""
rc_number=""
if [[ "${GITHUB_REF_NAME}" == "${final_tag}" ]]; then
release_kind="final"
elif [[ "${GITHUB_REF_NAME}" == "${rc_prefix}"* ]]; then
rc_number="${GITHUB_REF_NAME#"${rc_prefix}"}"
if [[ ! "${rc_number}" =~ ^[0-9]+$ ]]; then
echo "RC tag must be ${rc_prefix}N, got ${GITHUB_REF_NAME}" >&2
exit 1
fi
release_kind="rc"
else
echo "Tag must be ${final_tag} or ${rc_prefix}N, got ${GITHUB_REF_NAME}" >&2
exit 1
fi
echo "release_version=${release_version}" >> "${GITHUB_OUTPUT}"
echo "release_kind=${release_kind}" >> "${GITHUB_OUTPUT}"
echo "rc_number=${rc_number}" >> "${GITHUB_OUTPUT}"
echo "Validated ${release_kind} tag ${GITHUB_REF_NAME}"
java -version
mvn -version
java:
name: Java packages
if: >-
startsWith(github.ref, 'refs/tags/') &&
contains(github.ref_name, '-rc')
uses: ./.github/workflows/release-java.yml
python-package:
name: PyPaimon package
needs: validation
uses: ./.github/workflows/release-python.yml
with:
release_version: ${{ needs.validation.outputs.release_version }}
python-publish:
name: PyPaimon publish
needs: [validation, python-package]
if: >-
needs.validation.result == 'success' &&
startsWith(github.ref, 'refs/tags/') &&
needs.python-package.result == 'success'
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 }}