| # | |
| # 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: "Python Build Release Candidate" | |
| on: | |
| push: | |
| tags: | |
| # Trigger this workflow when tag follows the versioning format: pyiceberg-<major>.<minor>.<patch>rc<release_candidate> | |
| # Example valid tags: pyiceberg-0.8.0rc2, pyiceberg-1.0.0rc1 | |
| - 'pyiceberg-[0-9]+.[0-9]+.[0-9]+rc[0-9]+' | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: 'Version (e.g., 0.8.0)' | |
| type: string | |
| required: true | |
| rc: | |
| description: 'Release Candidate (RC) (e.g., 1)' | |
| type: number | |
| required: true | |
| permissions: | |
| contents: read | |
| jobs: | |
| validate-inputs: | |
| runs-on: ubuntu-latest | |
| outputs: | |
| VERSION: ${{ steps.validate-inputs.outputs.VERSION }} # e.g. 0.8.0 | |
| RC: ${{ steps.validate-inputs.outputs.RC }} # e.g. 1 | |
| steps: | |
| - name: Validate and Extract Version and RC | |
| id: validate-inputs | |
| run: | | |
| if [ "$GITHUB_EVENT_NAME" = "push" ]; then | |
| echo "Workflow triggered by tag push." | |
| TAG=${GITHUB_REF#refs/tags/} # Extract the tag name | |
| VERSION_AND_RC=${TAG#pyiceberg-} # Remove the 'pyiceberg-' prefix | |
| VERSION=${VERSION_AND_RC%rc*} # Extract VERSION by removing everything after 'rc' | |
| RC=${VERSION_AND_RC#*rc} # Extract RC by keeping everything after 'rc' | |
| if [[ -z "$VERSION" || -z "$RC" ]]; then | |
| echo "Error: Unable to parse VERSION or RC from tag ($TAG). Ensure the tag format is correct." | |
| exit 1 | |
| fi | |
| else | |
| echo "Workflow triggered manually via workflow_dispatch." | |
| VERSION="${GITHUB_EVENT_INPUTS_VERSION}" | |
| RC="${GITHUB_EVENT_INPUTS_RC}" | |
| # Validate version (e.g., 1.0.0) | |
| if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then | |
| echo "Error: version ($VERSION) must be in the format: <number>.<number>.<number>" | |
| exit 1 | |
| fi | |
| # Validate rc (e.g., 1) | |
| if [[ ! "$RC" =~ ^[0-9]+$ ]]; then | |
| echo "Error: rc ($RC) must be in the format: <number>" | |
| exit 1 | |
| fi | |
| fi | |
| # Export variables for future steps | |
| echo "VERSION=$VERSION" >> $GITHUB_OUTPUT | |
| echo "RC=$RC" >> $GITHUB_OUTPUT | |
| shell: bash | |
| env: | |
| GITHUB_EVENT_INPUTS_VERSION: ${{ github.event.inputs.version }} | |
| GITHUB_EVENT_INPUTS_RC: ${{ github.event.inputs.rc }} | |
| - name: Display Extracted Version and RC | |
| run: | | |
| echo "Using Version: ${STEPS_VALIDATE_INPUTS_OUTPUTS_VERSION}" | |
| echo "Using RC: ${STEPS_VALIDATE_INPUTS_OUTPUTS_RC}" | |
| shell: bash | |
| env: | |
| STEPS_VALIDATE_INPUTS_OUTPUTS_VERSION: ${{ steps.validate-inputs.outputs.VERSION }} | |
| STEPS_VALIDATE_INPUTS_OUTPUTS_RC: ${{ steps.validate-inputs.outputs.RC }} | |
| validate-library-version: | |
| runs-on: ubuntu-latest | |
| needs: | |
| - validate-inputs | |
| steps: | |
| - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 | |
| with: | |
| fetch-depth: 1 | |
| persist-credentials: false | |
| - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 | |
| with: | |
| python-version: 3.12 | |
| - name: Install UV | |
| uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0 | |
| with: | |
| enable-cache: false | |
| - name: Validate current pyiceberg version | |
| shell: bash | |
| env: | |
| VERSION: ${{ needs.validate-inputs.outputs.VERSION }} | |
| run: | | |
| # Extract the current version from UV | |
| current_pyiceberg_version=$(uv version --short) | |
| echo "Detected UV version: $current_pyiceberg_version" | |
| # Compare the input version with the UV version | |
| if [[ "$VERSION" != "$current_pyiceberg_version" ]]; then | |
| echo "Error: Input version ($VERSION) does not match the UV version ($current_pyiceberg_version)" | |
| exit 1 | |
| fi | |
| # SVN | |
| svn-build-artifacts: | |
| needs: | |
| - validate-inputs | |
| - validate-library-version | |
| uses: ./.github/workflows/svn-build-artifacts.yml | |
| with: | |
| version: ${{ needs.validate-inputs.outputs.VERSION }}rc${{ needs.validate-inputs.outputs.RC }} | |
| # PyPi | |
| pypi-build-artifacts: | |
| needs: | |
| - validate-inputs | |
| - validate-library-version | |
| uses: ./.github/workflows/pypi-build-artifacts.yml | |
| with: | |
| version: ${{ needs.validate-inputs.outputs.VERSION }}rc${{ needs.validate-inputs.outputs.RC }} |