Skip to content

Release and Publish Python distribution to PyPI #12

Release and Publish Python distribution to PyPI

Release and Publish Python distribution to PyPI #12

name: Release and Publish Python distribution to PyPI
on: workflow_dispatch
jobs:
checks:
name: Checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Check date-released in CITATION.cff
run: |
DATE=$(cat CITATION.cff | perl -nle"print $& while m{(?<=date-released: ').*(?=')}g")
if [ "$DATE" != "$(date +%Y-%m-%d)" ]; then
echo "CITATION.cff date-released is not today. Please update it."
exit 1
fi
build:
name: Build distribution
runs-on: ubuntu-latest
needs:
- checks
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Install pypa/build
run: >-
python3 -m
pip install
build
--user
- name: Build a binary wheel and a source tarball
run: python3 -m build
- name: Store the distribution packages
uses: actions/upload-artifact@v4
with:
name: python-package-distributions
path: dist/
publish-to-pypi:
name: >-
Publish Python distribution to PyPI
needs:
- build
runs-on: ubuntu-latest
environment:
name: pypi
url: https://pypi.org/p/saveable-objects
permissions:
id-token: write # IMPORTANT: mandatory for trusted publishing
steps:
- name: Download all the dists
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/
- name: Publish distribution to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
github-release:
name: >-
Sign the Python distribution with Sigstore
and upload them to GitHub Release
needs:
- publish-to-pypi
runs-on: ubuntu-latest
permissions:
contents: write # IMPORTANT: mandatory for making GitHub Releases
id-token: write # IMPORTANT: mandatory for sigstore
steps:
- uses: actions/checkout@v4
- name: Download all the dists
uses: actions/download-artifact@v4
with:
name: python-package-distributions
path: dist/
- name: Sign the dists with Sigstore
uses: sigstore/gh-action-sigstore-python@v3.0.0
with:
inputs: >-
./dist/*.tar.gz
./dist/*.whl
- name: Get Version
run: |
echo "VERSION=$(cat "CITATION.cff" | perl -nle'print $& while m{(?<=^version:\s).*}g')" >> $GITHUB_OUTPUT
id: version
- name: Create GitHub Release
env:
GITHUB_TOKEN: ${{ github.token }}
run: |
RELEASE_NOTES=$(cat ChangeLog.md | grep -Pzo '(?<=##\sRelease\s${{ steps.version.outputs.VERSION }})[\S\s]*?(?=##|$)' | tr -d '\0')
if [ -z "$RELEASE_NOTES" ]; then
echo "No release notes found."
exit 1
fi
gh release create "v${{ steps.version.outputs.VERSION }}" --repo "$GITHUB_REPOSITORY" --title "v${{ steps.version.outputs.VERSION }}" --notes "${RELEASE_NOTES}"
- name: Upload artifact signatures to GitHub Release
env:
GITHUB_TOKEN: ${{ github.token }}
# Upload to GitHub Release using the `gh` CLI.
# `dist/` contains the built packages, and the
# sigstore-produced signatures and certificates.
run: >-
gh release upload "v${{ steps.version.outputs.VERSION }}" dist/**
--repo "$GITHUB_REPOSITORY"