Python CI and library release #905
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # This file is autogenerated by maturin v1.7.1 | |
| # To update, run | |
| # | |
| # maturin generate-ci github --pytest | |
| # | |
| name: Python CI and library release | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| pypi_release: | |
| description: 'Make a PyPI release' | |
| required: true | |
| default: false | |
| type: boolean | |
| use_git_version: | |
| description: 'Use git-based version for nightly builds' | |
| required: true | |
| default: true | |
| type: boolean | |
| branch: | |
| description: 'Branch to build/release (for manual builds only)' | |
| type: choice | |
| options: | |
| - main | |
| - support/v1.x | |
| default: support/v1.x | |
| schedule: | |
| # run every day at 4am | |
| - cron: '0 4 * * *' | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| defaults: | |
| run: | |
| working-directory: ./icechunk-python | |
| jobs: | |
| version: | |
| name: Generate dynamic version | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| working-directory: . | |
| outputs: | |
| version-main: ${{ steps.version-main.outputs.version }} | |
| version-v1: ${{ steps.version-v1.outputs.version }} | |
| # Note: The version generation logic is duplicated below for main and support/v1.x branches. | |
| # This is intentional because: | |
| # 1. GitHub Actions doesn't support reusable bash script blocks within a workflow | |
| # 2. Each branch needs its own checkout step to access its specific git history | |
| # 3. Alternatives would be: | |
| # - Extract to .github/scripts/generate-version.sh (more complex, needs git checkout action first) | |
| # - Create composite action in .github/actions/generate-version/ (overkill for simple logic) | |
| # If updating the logic, ensure BOTH steps are updated identically. | |
| steps: | |
| # Checkout main branch (skip if only building support/v1.x) | |
| - name: Checkout main | |
| if: ${{ github.event_name == 'schedule' || inputs.branch != 'support/v1.x' }} | |
| uses: actions/checkout@v5 | |
| with: | |
| ref: main | |
| fetch-depth: 0 | |
| - name: Generate version for main | |
| if: ${{ github.event_name == 'schedule' || inputs.branch != 'support/v1.x' }} | |
| id: version-main | |
| run: | | |
| # Version generation logic for main (v2.x) | |
| if [[ "${{ github.event_name }}" == "schedule" ]] || [[ "${{ inputs.use_git_version }}" == "true" ]]; then | |
| # Match only v2.* tags to avoid confusion with v1.x tags | |
| if ! git describe --tags --match "v2.*" >/dev/null 2>&1; then | |
| echo "❌ ERROR: No v2.* tags found. Please create v2.0.0-alpha.0 tag first." | |
| exit 1 | |
| fi | |
| TAG=$(git describe --tags --match 'v2.*' --abbrev=0 | sed 's/^v//') | |
| DISTANCE=$(git rev-list $(git describe --tags --match 'v2.*' --abbrev=0)..HEAD --count) | |
| HASH=$(git rev-parse --short HEAD) | |
| VERSION="${TAG}-dev${DISTANCE}+g${HASH}" | |
| echo "main: $VERSION (${TAG}, +${DISTANCE}, ${HASH})" | |
| else | |
| VERSION=$(grep '^version = ' icechunk-python/Cargo.toml | sed 's/version = "\(.*\)"/\1/') | |
| echo "main: $VERSION (from Cargo.toml)" | |
| fi | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| # Checkout support/v1.x branch (skip if only building main) | |
| - name: Checkout support/v1.x | |
| if: ${{ github.event_name == 'schedule' || inputs.branch == 'support/v1.x' }} | |
| uses: actions/checkout@v5 | |
| with: | |
| ref: support/v1.x | |
| fetch-depth: 0 | |
| - name: Generate version for support/v1.x | |
| if: ${{ github.event_name == 'schedule' || inputs.branch == 'support/v1.x' }} | |
| id: version-v1 | |
| run: | | |
| # Version generation logic for support/v1.x (v1.x) | |
| if [[ "${{ github.event_name }}" == "schedule" ]] || [[ "${{ inputs.use_git_version }}" == "true" ]]; then | |
| # Match only v1.* tags to avoid confusion with v2.x tags | |
| if ! git describe --tags --match "v1.*" >/dev/null 2>&1; then | |
| echo "❌ ERROR: No v1.* tags found" | |
| exit 1 | |
| fi | |
| TAG=$(git describe --tags --match 'v1.*' --abbrev=0 | sed 's/^v//') | |
| DISTANCE=$(git rev-list $(git describe --tags --match 'v1.*' --abbrev=0)..HEAD --count) | |
| HASH=$(git rev-parse --short HEAD) | |
| VERSION="${TAG}-dev${DISTANCE}+g${HASH}" | |
| echo "v1.x: $VERSION (${TAG}, +${DISTANCE}, ${HASH})" | |
| else | |
| VERSION=$(grep '^version = ' icechunk-python/Cargo.toml | sed 's/version = "\(.*\)"/\1/') | |
| echo "v1.x: $VERSION (from Cargo.toml)" | |
| fi | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| linux: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| # Dynamic branch selection: | |
| # - schedule: Build both main and support/v1.x for nightly releases | |
| # - manual: Build only the selected branch (main or support/v1.x) | |
| # Note: fromJSON converts JSON string to array since GH Actions doesn't support array literals in expressions | |
| branch: ${{ github.event_name == 'schedule' && fromJSON('["main", "support/v1.x"]') || fromJSON(format('["{0}"]', inputs.branch)) }} | |
| platform: | |
| - runner: ubuntu-latest | |
| target: x86_64 | |
| manylinux: auto | |
| # - runner: ubuntu-latest | |
| # target: x86 | |
| - runner: ubuntu-latest | |
| target: aarch64 | |
| manylinux: 2_28 | |
| - runner: ubuntu-latest | |
| target: armv7 | |
| manylinux: 2_28 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| ref: ${{ matrix.branch }} | |
| fetch-depth: 0 | |
| - name: Stand up docker services | |
| run: | | |
| docker compose up -d | |
| - name: Wait for MinIO to be ready | |
| run: | | |
| for _ in {1..10}; do | |
| if curl --silent --fail http://localhost:9000/minio/health/live; then | |
| break | |
| fi | |
| sleep 3 | |
| done | |
| docker compose exec -T minio mc alias set minio http://minio:9000 minio123 minio123 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: '3.11' | |
| - name: Update version in Cargo.toml | |
| if: ${{ github.event_name == 'schedule' || inputs.use_git_version == true }} | |
| run: | | |
| VERSION="${{ matrix.branch == 'main' && needs.version.outputs.version-main || needs.version.outputs.version-v1 }}" | |
| echo "Using version: $VERSION for branch ${{ matrix.branch }}" | |
| sed -i 's/^version = ".*"/version = "'$VERSION'"/' Cargo.toml | |
| - name: Build wheels | |
| uses: PyO3/maturin-action@v1 | |
| with: | |
| working-directory: icechunk-python | |
| target: ${{ matrix.platform.target }} | |
| args: --release --out dist --find-interpreter | |
| manylinux: ${{ matrix.platform.manylinux }} # https://github.com/PyO3/maturin-action/issues/245 | |
| - name: Upload wheels | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: wheels-linux-${{ matrix.branch == 'main' && 'main' || 'support-v1.x' }}-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| musllinux: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| branch: ${{ github.event_name == 'schedule' && fromJSON('["main", "support/v1.x"]') || fromJSON(format('["{0}"]', inputs.branch)) }} | |
| platform: | |
| - runner: ubuntu-latest | |
| target: x86_64 | |
| - runner: ubuntu-latest | |
| target: x86 | |
| - runner: ubuntu-latest | |
| target: aarch64 | |
| - runner: ubuntu-latest | |
| target: armv7 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| ref: ${{ matrix.branch }} | |
| fetch-depth: 0 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: 3.x | |
| - name: Update version in Cargo.toml | |
| if: ${{ github.event_name == 'schedule' || inputs.use_git_version == true }} | |
| run: | | |
| VERSION="${{ matrix.branch == 'main' && needs.version.outputs.version-main || needs.version.outputs.version-v1 }}" | |
| echo "Using version: $VERSION for branch ${{ matrix.branch }}" | |
| sed -i 's/^version = ".*"/version = "'$VERSION'"/' Cargo.toml | |
| - name: Build wheels | |
| uses: PyO3/maturin-action@v1 | |
| with: | |
| working-directory: icechunk-python | |
| target: ${{ matrix.platform.target }} | |
| args: --release --out dist --find-interpreter | |
| manylinux: musllinux_1_2 | |
| - name: Upload wheels | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: wheels-musllinux-${{ matrix.branch == 'main' && 'main' || 'support-v1.x' }}-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| windows: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| branch: ${{ github.event_name == 'schedule' && fromJSON('["main", "support/v1.x"]') || fromJSON(format('["{0}"]', inputs.branch)) }} | |
| platform: | |
| - runner: windows-latest | |
| target: x64 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| ref: ${{ matrix.branch }} | |
| fetch-depth: 0 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: 3.x | |
| architecture: ${{ matrix.platform.target }} | |
| - name: Update version in Cargo.toml | |
| if: ${{ github.event_name == 'schedule' || inputs.use_git_version == true }} | |
| run: | | |
| $VERSION = "${{ matrix.branch == 'main' && needs.version.outputs.version-main || needs.version.outputs.version-v1 }}" | |
| Write-Host "Using version: $VERSION for branch ${{ matrix.branch }}" | |
| (Get-Content Cargo.toml) -replace '^version = ".*"', "version = `"$VERSION`"" | Set-Content Cargo.toml | |
| shell: powershell | |
| - name: Build wheels | |
| uses: PyO3/maturin-action@v1 | |
| with: | |
| working-directory: icechunk-python | |
| target: ${{ matrix.platform.target }} | |
| args: --release --out dist --find-interpreter | |
| - name: Upload wheels | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: wheels-windows-${{ matrix.branch == 'main' && 'main' || 'support-v1.x' }}-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| macos: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| branch: ${{ github.event_name == 'schedule' && fromJSON('["main", "support/v1.x"]') || fromJSON(format('["{0}"]', inputs.branch)) }} | |
| platform: | |
| - runner: macos-13 | |
| target: x86_64 | |
| - runner: macos-14 | |
| target: aarch64 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| ref: ${{ matrix.branch }} | |
| fetch-depth: 0 | |
| - uses: actions/setup-python@v6 | |
| with: | |
| python-version: 3.x | |
| - name: Update version in Cargo.toml | |
| if: ${{ github.event_name == 'schedule' || inputs.use_git_version == true }} | |
| run: | | |
| VERSION="${{ matrix.branch == 'main' && needs.version.outputs.version-main || needs.version.outputs.version-v1 }}" | |
| echo "Using version: $VERSION for branch ${{ matrix.branch }}" | |
| sed -i '' 's/^version = ".*"/version = "'$VERSION'"/' Cargo.toml | |
| - name: Build wheels | |
| uses: PyO3/maturin-action@v1 | |
| with: | |
| working-directory: icechunk-python | |
| target: ${{ matrix.platform.target }} | |
| args: --release --out dist --find-interpreter | |
| - name: Upload wheels | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: wheels-macos-${{ matrix.branch == 'main' && 'main' || 'support-v1.x' }}-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| sdist: | |
| runs-on: ubuntu-latest | |
| needs: version | |
| strategy: | |
| matrix: | |
| branch: ${{ github.event_name == 'schedule' && fromJSON('["main", "support/v1.x"]') || fromJSON(format('["{0}"]', inputs.branch)) }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| ref: ${{ matrix.branch }} | |
| fetch-depth: 0 | |
| - name: Update version in Cargo.toml | |
| if: ${{ github.event_name == 'schedule' || inputs.use_git_version == true }} | |
| run: | | |
| VERSION="${{ matrix.branch == 'main' && needs.version.outputs.version-main || needs.version.outputs.version-v1 }}" | |
| echo "Using version: $VERSION for branch ${{ matrix.branch }}" | |
| sed -i 's/^version = ".*"/version = "'$VERSION'"/' Cargo.toml | |
| - name: Build sdist | |
| uses: PyO3/maturin-action@v1 | |
| with: | |
| working-directory: icechunk-python | |
| command: sdist | |
| args: --out dist | |
| - name: Upload sdist | |
| uses: actions/upload-artifact@v5 | |
| with: | |
| name: wheels-sdist-${{ matrix.branch == 'main' && 'main' || 'support-v1.x' }} | |
| path: icechunk-python/dist | |
| release: | |
| name: Release | |
| runs-on: ubuntu-latest | |
| permissions: | |
| id-token: write # IMPORTANT: this permission is mandatory for trusted publishing | |
| if: ${{ github.event_name == 'workflow_dispatch' && inputs.pypi_release }} | |
| needs: [linux, musllinux, windows, macos, sdist] | |
| steps: | |
| - uses: actions/download-artifact@v6 | |
| - name: Publish to PyPI | |
| uses: PyO3/maturin-action@v1 | |
| with: | |
| command: upload | |
| args: --non-interactive --skip-existing wheels-*/* | |
| nightly: | |
| name: Upload nightly wheels | |
| runs-on: ubuntu-latest | |
| if: ${{ github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' }} | |
| needs: [linux, musllinux, windows, macos, sdist] | |
| steps: | |
| - uses: actions/download-artifact@v6 | |
| with: | |
| path: dist | |
| merge-multiple: true | |
| - name: Upload nightly wheels | |
| uses: scientific-python/upload-nightly-action@b36e8c0c10dbcfd2e05bf95f17ef8c14fd708dbf | |
| with: | |
| artifacts_path: dist | |
| anaconda_nightly_upload_token: ${{ secrets.ANACONDA_ORG_UPLOAD_TOKEN }} |