Python CI and library release #840
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 | |
| 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 | |
| outputs: | |
| version: ${{ steps.version.outputs.version }} | |
| steps: | |
| - uses: actions/checkout@v5 | |
| with: | |
| fetch-depth: 0 # Need full history for git describe | |
| - name: Generate version | |
| id: version | |
| run: | | |
| if [[ "${{ github.event_name }}" == "schedule" ]] || [[ "${{ inputs.use_git_version }}" == "true" ]]; then | |
| # For nightly builds, use component-based git describe approach | |
| # Verify we have proper git tags | |
| if ! git describe --tags --match "v*" >/dev/null 2>&1; then | |
| echo "❌ ERROR: No version tags found. Please create a tag like 'v1.0.0' first." | |
| exit 1 | |
| fi | |
| # Get components from git (much simpler than parsing) | |
| TAG=$(git describe --tags --match 'v*' --abbrev=0 | sed 's/^v//') | |
| DISTANCE=$(git rev-list $(git describe --tags --match 'v*' --abbrev=0)..HEAD --count) | |
| HASH=$(git rev-parse --short HEAD) | |
| # Build SemVer compliant version for Cargo.toml (use -dev instead of .dev) | |
| # maturin will normalize the - to a . | |
| # prepend HASH with g to follow convention from git describe | |
| VERSION="${TAG}-dev${DISTANCE}+g${HASH}" | |
| echo "Git version: ${TAG}, distance: ${DISTANCE}, hash: ${HASH}" | |
| echo "Using git-based version: $VERSION" | |
| else | |
| # For regular releases, use version from Cargo.toml | |
| VERSION=$(grep '^version = ' icechunk-python/Cargo.toml | sed 's/version = "\(.*\)"/\1/') | |
| echo "Using Cargo.toml version: $VERSION" | |
| fi | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| linux: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| 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 | |
| - 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://minio: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: | | |
| sed -i 's/^version = ".*"/version = "${{ needs.version.outputs.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@v4 | |
| with: | |
| name: wheels-linux-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| musllinux: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| 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 | |
| - 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: | | |
| sed -i 's/^version = ".*"/version = "${{ needs.version.outputs.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@v4 | |
| with: | |
| name: wheels-musllinux-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| windows: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| platform: | |
| - runner: windows-latest | |
| target: x64 | |
| - runner: windows-latest | |
| target: x86 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - 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: | | |
| (Get-Content Cargo.toml) -replace '^version = ".*"', 'version = "${{ needs.version.outputs.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@v4 | |
| with: | |
| name: wheels-windows-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| macos: | |
| runs-on: ${{ matrix.platform.runner }} | |
| needs: version | |
| strategy: | |
| matrix: | |
| platform: | |
| - runner: macos-13 | |
| target: x86_64 | |
| - runner: macos-14 | |
| target: aarch64 | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - 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: | | |
| sed -i '' 's/^version = ".*"/version = "${{ needs.version.outputs.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@v4 | |
| with: | |
| name: wheels-macos-${{ matrix.platform.target }} | |
| path: icechunk-python/dist | |
| sdist: | |
| runs-on: ubuntu-latest | |
| needs: version | |
| steps: | |
| - uses: actions/checkout@v5 | |
| - name: Update version in Cargo.toml | |
| if: ${{ github.event_name == 'schedule' || inputs.use_git_version == true }} | |
| run: | | |
| sed -i 's/^version = ".*"/version = "${{ needs.version.outputs.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@v4 | |
| with: | |
| name: wheels-sdist | |
| 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@v5 | |
| - 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@v5 | |
| 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 }} |