Skip to content

Publish to PyPI

Publish to PyPI #7

Workflow file for this run

name: Publish to PyPI
on:
release:
types: [published]
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
target:
description: 'Publish target'
required: true
default: 'testpypi'
type: choice
options:
- testpypi
- pypi
ref:
description: 'Git ref to build from (tag like v0.1.6, or leave empty for default branch)'
required: false
type: string
# Prevent duplicate runs when release creates a tag
concurrency:
group: publish-${{ github.ref }}
cancel-in-progress: false
jobs:
build:
uses: ./.github/workflows/build-wheels.yml
with:
ref: ${{ inputs.ref || github.ref }}
build_sdist:
name: Build source distribution
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
ref: ${{ inputs.ref || github.ref }}
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"
- name: Install build dependencies
run: |
python -m pip install --upgrade pip
pip install "build>=1.0" setuptools-scm
- name: Build sdist
run: |
python -m build --sdist
# Verify sdist filename uses underscores (PEP 625)
ls -la dist/
if ls dist/cfd-python-*.tar.gz 1> /dev/null 2>&1; then
echo "ERROR: sdist has hyphenated name, renaming..."
for f in dist/cfd-python-*.tar.gz; do
mv "$f" "${f/cfd-python/cfd_python}"
done
fi
ls -la dist/
- name: Upload sdist
uses: actions/upload-artifact@v4
with:
name: sdist
path: dist/*.tar.gz
publish_testpypi:
name: Publish to TestPyPI
needs: [build, build_sdist]
runs-on: ubuntu-latest
if: github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'testpypi'
environment:
name: testpypi
url: https://test.pypi.org/p/cfd-python
permissions:
id-token: write
contents: read
steps:
- name: Download wheels
uses: actions/download-artifact@v4
with:
pattern: wheel-*
path: dist
merge-multiple: true
- name: Download sdist
uses: actions/download-artifact@v4
with:
name: sdist
path: dist
- name: Validate artifacts
run: |
echo "=== Artifacts ==="
ls -la dist/
WHEELS=$(ls dist/*.whl 2>/dev/null | wc -l)
SDIST=$(ls dist/*.tar.gz 2>/dev/null | wc -l)
echo "Found $WHEELS wheel(s) and $SDIST sdist(s)"
if [ "$WHEELS" -lt 3 ]; then
echo "ERROR: Expected at least 3 wheels (linux, macos, windows), found $WHEELS"
exit 1
fi
if [ "$SDIST" -lt 1 ]; then
echo "ERROR: Expected at least 1 sdist, found $SDIST"
exit 1
fi
- name: Publish to TestPyPI
uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4
with:
repository-url: https://test.pypi.org/legacy/
skip-existing: true
publish_pypi:
name: Publish to PyPI
needs: [build, build_sdist]
runs-on: ubuntu-latest
if: github.event_name == 'release' || (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || (github.event_name == 'workflow_dispatch' && github.event.inputs.target == 'pypi')
environment:
name: pypi
url: https://pypi.org/p/cfd-python
permissions:
id-token: write
contents: read
steps:
- name: Download wheels
uses: actions/download-artifact@v4
with:
pattern: wheel-*
path: dist
merge-multiple: true
- name: Download sdist
uses: actions/download-artifact@v4
with:
name: sdist
path: dist
- name: Validate artifacts
run: |
echo "=== Artifacts ==="
ls -la dist/
WHEELS=$(ls dist/*.whl 2>/dev/null | wc -l)
SDIST=$(ls dist/*.tar.gz 2>/dev/null | wc -l)
echo "Found $WHEELS wheel(s) and $SDIST sdist(s)"
if [ "$WHEELS" -lt 3 ]; then
echo "ERROR: Expected at least 3 wheels (linux, macos, windows), found $WHEELS"
exit 1
fi
if [ "$SDIST" -lt 1 ]; then
echo "ERROR: Expected at least 1 sdist, found $SDIST"
exit 1
fi
- name: Publish to PyPI
uses: pypa/gh-action-pypi-publish@76f52bc884231f62b9a034ebfe128415bbaabdfc # v1.12.4
with:
skip-existing: true