Python Package Release #12297
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
| name: Python Package Release | |
| on: | |
| workflow_dispatch: | |
| workflow_call: | |
| inputs: | |
| version: | |
| description: Version to release | |
| required: true | |
| type: string | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} | |
| cancel-in-progress: true | |
| permissions: | |
| id-token: write | |
| pull-requests: write | |
| contents: read | |
| packages: write | |
| jobs: | |
| get-version: | |
| name: Determine Version | |
| if: (github.event_name == 'workflow_call' && inputs.version != '') || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| outputs: | |
| version: ${{ steps.version.outputs.version }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Get and validate version | |
| id: version | |
| shell: bash | |
| run: | | |
| if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then | |
| VERSION=$(git describe --tags --abbrev=0 2>/dev/null || echo "v0.1.0") | |
| echo "Using latest tag for manual trigger: $VERSION" | |
| elif [[ "${{ github.event_name }}" == "workflow_call" && -n "${{ inputs.version }}" ]]; then | |
| VERSION="${{ inputs.version }}" | |
| echo "Using provided version from workflow_call: $VERSION" | |
| else | |
| echo "Error: No version provided for workflow_call" | |
| exit 1 | |
| fi | |
| # Validate version format | |
| if [[ ! $VERSION =~ ^v[0-9]+\.[0-9]+\.[0-9]+.*$ ]]; then | |
| echo "Warning: Version $VERSION may not follow semantic versioning (vX.Y.Z)" | |
| fi | |
| echo "Final version: $VERSION" | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| test: | |
| name: Run Tests | |
| if: (github.event_name == 'workflow_call' && inputs.version != '') || github.event_name == 'workflow_dispatch' | |
| needs: [get-version] | |
| runs-on: | |
| - self-hosted | |
| - X64 | |
| - Linux | |
| - 4c16g | |
| - aws | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - uses: ./.github/actions/build_bindings_python | |
| with: | |
| target: x86_64-unknown-linux-gnu | |
| # No version means development build with tests | |
| linux: | |
| name: Build Linux Wheels | |
| if: (github.event_name == 'workflow_call' && inputs.version != '') || github.event_name == 'workflow_dispatch' | |
| needs: [get-version, test] | |
| runs-on: | |
| - self-hosted | |
| - "${{ matrix.runner }}" | |
| - Linux | |
| - 4c16g | |
| - aws | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - { arch: x86_64, runner: X64 } | |
| - { arch: aarch64, runner: ARM64 } | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - uses: ./.github/actions/build_bindings_python | |
| with: | |
| target: ${{ matrix.arch }}-unknown-linux-gnu | |
| version: ${{ needs.get-version.outputs.version }} | |
| - name: Upload Linux wheel | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: python-linux-${{ matrix.arch }} | |
| path: src/bendpy/dist/*.whl | |
| retention-days: 7 | |
| macos: | |
| name: Build macOS Wheels | |
| if: (github.event_name == 'workflow_call' && inputs.version != '') || github.event_name == 'workflow_dispatch' | |
| needs: [get-version, test] | |
| runs-on: macos-latest | |
| continue-on-error: true | |
| strategy: | |
| matrix: | |
| target: [x86_64-apple-darwin, aarch64-apple-darwin] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - name: Install dependencies | |
| run: | | |
| # Install OpenSSL and necessary tools | |
| brew install openssl@3 | |
| # Use vendored OpenSSL to avoid cross-compilation issues | |
| echo "OPENSSL_STATIC=1" >> $GITHUB_ENV | |
| echo "OPENSSL_VENDORED=1" >> $GITHUB_ENV | |
| echo "PKG_CONFIG_ALLOW_CROSS=1" >> $GITHUB_ENV | |
| - uses: ./.github/actions/build_bindings_python | |
| with: | |
| target: ${{ matrix.target }} | |
| version: ${{ needs.get-version.outputs.version }} | |
| - name: Upload macOS wheel | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: python-macos-${{ matrix.target }} | |
| path: src/bendpy/dist/*.whl | |
| retention-days: 7 | |
| publish: | |
| name: Publish to PyPI | |
| if: (github.event_name == 'workflow_call' && inputs.version != '') || github.event_name == 'workflow_dispatch' | |
| needs: [get-version, test, linux] | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/download-artifact@v4 | |
| with: | |
| pattern: python-* | |
| merge-multiple: true | |
| path: src/bendpy/dist | |
| continue-on-error: true | |
| - name: Show packages to publish | |
| run: | | |
| echo "Publishing packages for version: ${{ needs.get-version.outputs.version }}" | |
| echo "Packages found:" | |
| ls -la src/bendpy/dist/ || echo "No packages found" | |
| echo "Total packages: $(ls src/bendpy/dist/*.whl 2>/dev/null | wc -l)" | |
| - name: Publish to PyPI | |
| timeout-minutes: 10 | |
| run: | | |
| pip install twine | |
| echo "Publishing to PyPI..." | |
| if [ -n "$(find src/bendpy/dist -name "*.whl" 2>/dev/null)" ]; then | |
| twine upload --skip-existing --verbose src/bendpy/dist/*.whl | |
| else | |
| echo "No wheel files found to publish" | |
| exit 1 | |
| fi | |
| env: | |
| TWINE_USERNAME: __token__ | |
| TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} |