Github Action to: Check version / Test / git tag / GitHub Release / Deploy to PyPI
APACHE-2.0 License
This is a GitHub Action to automate deployment of a new version of a Python project.
This action will:
Requires a Linux runner.
Assumes that your project uses a pyproject.toml
file; the project.name
and project.version
fields will be accessed. In particular the latter must not be dynamic. (You should put __version__ = importlib.metadata.version(your_package_name)
in your top-level __init__.py
file to get the version at runtime.)
name: Release
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Release
uses: patrick-kidger/action_update_python_project@v1
with:
python-version: "3.11"
test-script: |
python -m pip install pytest
cp -r ${{ github.workspace }}/test ./test
pytest
pypi-token: ${{ secrets.pypi_token }}
github-user: your-username-here
github-token: ${{ github.token }} # automatically created token
This will run every time the main
branch is updated. If the version has updated, then it will trigger things as described above.
The following are options for passing to with
:
python-version
: What Python version to run everything with. Must be at least 3.11.test-script
: What test script to run.pypi-user
: What username to use when pushing to PyPI. Defaults to __token__
, corresponding to the use of a PyPI token.pypi-token
: What password or token to use when pushing to PyPI.github-user
: What GitHub user to use when authenticating the release with GitHub.github-token
: What GitHub token to use when authenticating the release with GitHub.Notes on test-script
:
"
characters must be escaped as \"
.0
is a pass; everything else is a failure.I'm getting a random/spurious failure.
If you call this action shortly (<5 minutes?) after it triggers (and has pushed an update to PyPI) then sometimes the second invocation won't see that the updated version exists yet, so it will think that it has a new version -- and will attempt to start the update process itself. This should just be a harmless failure.