Remarque
Les exécuteurs hébergés sur GitHub ne sont pas pris en charge sur GitHub Enterprise Server.
Introduction
Ce guide explique comment générer, tester et publier un package Python.
Les exĂ©cuteurs hĂ©bergĂ©s dans GitHub ont un cache dâoutils oĂč sont prĂ©installĂ©s des logiciels, notamment Python ou PyPy. Vous nâavez donc rien Ă installer ! Pour obtenir la liste complĂšte des logiciels les plus rĂ©cents et des versions prĂ©installĂ©es de Python et PyPy, consultez « ExĂ©cuteurs hĂ©bergĂ©s par GitHub ».
Prérequis
Vous devez ĂȘtre familiarisĂ© avec YAML et la syntaxe GitHub Actions. Pour plus dâinformations, consultez « Ăcriture de workflows ».
Il est recommandĂ© de connaĂźtre les bases de Python et pip. Pour plus dâinformations, consultez lâarticle suivant :
Utilisation dâexĂ©cuteurs auto-hĂ©bergĂ©s sur GitHub Enterprise Server
Quand vous utilisez des actions de configuration (comme actions/setup-LANGUAGE
) sur GitHub Enterprise Server avec des exĂ©cuteurs auto-hĂ©bergĂ©s, vous pouvez ĂȘtre amenĂ© Ă configurer le cache des outils sur les exĂ©cuteurs qui nâont pas accĂšs Ă Internet. Pour plus dâinformations, consultez « Configuration du cache dâoutils sur les exĂ©cuteurs auto-hĂ©bergĂ©s sans accĂšs Ă Internet ».
Utilisation dâun modĂšle de workflow Python
Pour démarrer rapidement, ajoutez un modÚle de workflow au répertoire .github/workflows
de votre référentiel.
GitHub fournit un modÚle de workflow pour Python qui devrait fonctionner si votre référentiel contient déjà au moins un fichier .py
. Les sections suivantes de ce guide donnent des exemples de la maniĂšre dont vous pouvez personnaliser ce modĂšle de workflow.
-
Sur GitHub, accédez à la page principale du référentiel.
-
Sous le nom de votre dépÎt, cliquez sur Actions.
-
Si vous disposez dĂ©jĂ dâun workflow dans votre dĂ©pĂŽt, cliquez sur Nouveau workflow.
-
La page « Choisir un workflow » présente une sélection de modÚles de workflow recommandés. Recherchez « application Python ».
-
Dans le flux de travail « Application Python », cliquez sur Configurer.
Si vous ne trouvez pas le modÚle de workflow « Application Python », copiez le code de workflow suivant dans un nouveau fichier appelé
python-app.yml
dans le répertoire.github/workflows
de votre référentiel.YAML name: Python application on: push: branches: [ "main" ] pull_request: branches: [ "main" ] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python 3.13 uses: actions/setup-python@v5 with: python-version: "3.13" - name: Install dependencies run: | python -m pip install --upgrade pip pip install ruff pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint and format Python code with ruff run: | # Lint with the default set of ruff rules with GitHub Annotations ruff check --format=github --target-version=py39 # Verify the code is properly formatted ruff format --diff --target-version=py39 - name: Test with pytest run: | pytest
name: Python application on: push: branches: [ "main" ] pull_request: branches: [ "main" ] permissions: contents: read jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python 3.13 uses: actions/setup-python@v5 with: python-version: "3.13" - name: Install dependencies run: | python -m pip install --upgrade pip pip install ruff pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint and format Python code with ruff run: | # Lint with the default set of ruff rules with GitHub Annotations ruff check --format=github --target-version=py39 # Verify the code is properly formatted ruff format --diff --target-version=py39 - name: Test with pytest run: | pytest
-
Modifiez le workflow en fonction des besoins. Par exemple, modifiez la version de Python.
-
Cliquez sur Valider les changements.
SpĂ©cification dâune version de Python
Pour utiliser une version prĂ©installĂ©e de Python ou de PyPy sur un exĂ©cuteur hĂ©bergĂ© dans GitHub, utilisez lâaction setup-python
. Cette action recherche une version spĂ©cifique de Python ou de PyPy dans le cache dâoutils de chaque exĂ©cuteur, et ajoute les fichiers binaires nĂ©cessaires Ă PATH
, qui est conservĂ© pour la suite du travail. Si une version spĂ©cifique de Python nâest pas prĂ©installĂ©e dans le cache dâoutils, lâaction setup-python
télécharge et configure la version appropriée à partir du dépÎt python-versions
.
Lâaction setup-python
est recommandĂ©e pour utiliser Python avec GitHub Actions, car cela garantit un comportement cohĂ©rent sur tous les exĂ©cuteurs et toutes les versions de Python. Si vous utilisez un exĂ©cuteur auto-hĂ©bergĂ©, vous devez installer Python et lâajouter Ă PATH
. Pour plus dâinformations, consultez lâaction setup-python
.
Le tableau ci-dessous dĂ©crit les emplacements du cache dâoutils pour chaque exĂ©cuteur hĂ©bergĂ© dans GitHub.
Ubuntu | Mac | Windows | |
---|---|---|---|
RĂ©pertoire du cache dâoutils | /opt/hostedtoolcache/* | /Users/runner/hostedtoolcache/* | C:\hostedtoolcache\windows\* |
Cache dâoutils Python | /opt/hostedtoolcache/Python/* | /Users/runner/hostedtoolcache/Python/* | C:\hostedtoolcache\windows\Python\* |
Cache dâoutils PyPy | /opt/hostedtoolcache/PyPy/* | /Users/runner/hostedtoolcache/PyPy/* | C:\hostedtoolcache\windows\PyPy\* |
Si vous utilisez un exĂ©cuteur auto-hĂ©bergĂ©, vous pouvez configurer lâexĂ©cuteur afin quâil utilise lâaction setup-python
pour gĂ©rer vos dĂ©pendances. Pour plus dâinformations, consultez Utilisation de setup-python avec un exĂ©cuteur auto-hĂ©bergĂ© dans le fichier README setup-python
.
GitHub prend en charge la syntaxe du versioning sĂ©mantique. Pour plus dâinformations, consultez « Utilisation du versioning sĂ©mantique » et « SpĂ©cification du versioning sĂ©mantique ».
Utilisation de plusieurs versions de Python
L'exemple suivant utilise une matrice pour le travail de configuration de plusieurs versions de Python. Pour plus dâinformations, consultez « ExĂ©cution de variantes de tĂąches dans un workflow ».
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["pypy3.10", "3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)"
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["pypy3.10", "3.9", "3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
# You can test your matrix by printing the current Python version
- name: Display Python version
run: python -c "import sys; print(sys.version)"
Utilisation dâune version spĂ©cifique de Python
Vous pouvez configurer une version spécifique de Python. Par exemple, 3.12. Vous pouvez également utiliser la syntaxe de versioning sémantique pour obtenir la derniÚre version mineure. Cet exemple utilise la derniÚre version mineure de Python 3.
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python # This is the version of the action for setting up Python, not the Python version. uses: actions/setup-python@v5 with: # Semantic version range syntax or exact version of a Python version python-version: '3.x' # Optional - x64 or x86 architecture, defaults to x64 architecture: 'x64' # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)"
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
# This is the version of the action for setting up Python, not the Python version.
uses: actions/setup-python@v5
with:
# Semantic version range syntax or exact version of a Python version
python-version: '3.x'
# Optional - x64 or x86 architecture, defaults to x64
architecture: 'x64'
# You can test your matrix by printing the current Python version
- name: Display Python version
run: python -c "import sys; print(sys.version)"
Exclusion dâune version
Si vous spĂ©cifiez une version de Python qui nâest pas disponible, setup-python
échoue avec une erreur comme celle-ci : ##[error]Version 3.7 with arch x64 not found
. Le message dâerreur mentionne les versions disponibles.
Vous pouvez également utiliser le mot clé exclude
dans votre workflow sâil existe une configuration de Python que vous ne souhaitez pas exĂ©cuter. Pour plus dâinformations, consultez « Workflow syntax for GitHub Actions ».
name: Python package on: [push] jobs: build: runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] python-version: ["3.9", "3.11", "3.13", "pypy3.10"] exclude: - os: macos-latest python-version: "3.11" - os: windows-latest python-version: "3.11"
name: Python package
on: [push]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ["3.9", "3.11", "3.13", "pypy3.10"]
exclude:
- os: macos-latest
python-version: "3.11"
- os: windows-latest
python-version: "3.11"
Utilisation de la version par défaut de Python
Nous vous recommandons dâutiliser setup-python
pour configurer la version de Python qui est utilisĂ©e dans vos workflows, car cela permet de rendre vos dĂ©pendances explicites. Si vous nâutilisez pas setup-python
, la version par défaut de Python qui est définie dans PATH
sera utilisĂ©e dans nâimporte quel interprĂ©teur de commandes lorsque vous appellerez python
. La version par dĂ©faut de Python varie en fonction de lâexĂ©cuteur hĂ©bergĂ© dans GitHub, ce qui peut entraĂźner des modifications inattendues ou lâutilisation dâune version plus ancienne que prĂ©vu.
Exécuteur hébergé dans GitHub | Description |
---|---|
Ubuntu | Plusieurs versions de Python systĂšme sont installĂ©es sur les exĂ©cuteurs Ubuntu, sous /usr/bin/python et /usr/bin/python3 . Les versions Python fournies avec Ubuntu viennent sâajouter aux versions que GitHub installe dans le cache dâoutils. |
Windows | Ă lâexception des versions de Python qui se trouvent dans le cache dâoutils, Windows nâest pas fourni avec une version Ă©quivalente de Python systĂšme. Pour maintenir un comportement cohĂ©rent avec les autres exĂ©cuteurs et permettre Ă Python dâĂȘtre utilisĂ© immĂ©diatement sans lâaction setup-python , GitHub ajoute quelques versions Ă PATH Ă partir du cache dâoutils. |
macOS | Plusieurs versions de Python systĂšme sont installĂ©es sur les exĂ©cuteurs macOS, en plus des versions qui se trouvent dans le cache dâoutils. Les versions de Python systĂšme se trouvent dans le rĂ©pertoire /usr/local/Cellar/python/* . |
Installer les dépendances
Le gestionnaire de package pip est installĂ© sur les exĂ©cuteurs hĂ©bergĂ©s dans GitHub. Vous pouvez utiliser pip pour installer des dĂ©pendances Ă partir du registre de package PyPI avant de gĂ©nĂ©rer et de tester votre code. Par exemple, le code YAML ci-dessous installe ou met Ă niveau le programme dâinstallation du package pip
, ainsi que les packages setuptools
et wheel
.
Vous pouvez Ă©galement mettre en cache vos dĂ©pendances pour accĂ©lĂ©rer vos exĂ©cutions de workflow. Pour plus dâinformations, consultez « RĂ©fĂ©rence sur la mise en cache des dĂ©pendances ».
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies run: python -m pip install --upgrade pip setuptools wheel
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: python -m pip install --upgrade pip setuptools wheel
Fichier de spécifications
AprĂšs avoir mis Ă jour pip
, Une étape suivante typique est l'installation des dépendances à partir de requirements.txt
. Pour plus dâinformations, consultez pip.
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
Mise en cache des dépendances
Vous pouvez mettre en cache et restaurer les dĂ©pendances Ă lâaide de lâaction setup-python
.
Lâexemple suivant met en cache les dĂ©pendances pour pip.
steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.12' cache: 'pip' - run: pip install -r requirements.txt - run: pip test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
- run: pip install -r requirements.txt
- run: pip test
Par dĂ©faut, lâaction setup-python
recherche le fichier de dépendances (requirements.txt
pour pip, Pipfile.lock
pour pipenv ou poetry.lock
pour poetry) dans lâensemble du dĂ©pĂŽt. Pour plus dâinformations, consultez « Mise en cache des dĂ©pendances de packages » dans le fichier LISEZ-MOI de setup-python
.
Si vous avez une exigence particuliĂšre ou si vous avez besoin dâun contrĂŽle plus prĂ©cis pour la mise en cache, vous pouvez utiliser lâaction cache
. Pip met en cache les dĂ©pendances Ă diffĂ©rents emplacements, selon le systĂšme dâexploitation de lâexĂ©cuteur. Le chemin que vous devez mettre en cache peut diffĂ©rer de celui de lâexemple Ubuntu ci-dessus, selon le systĂšme dâexploitation que vous utilisez. Pour plus dâinformations, consultez les exemples de mise en cache Python dans le dĂ©pĂŽt de lâaction cache
.
Test de votre code
Vous pouvez utiliser les mĂȘmes commandes que celles que vous utilisez localement pour gĂ©nĂ©rer et tester votre code.
Effectuer des tests avec pytest et pytest-cov
Cet exemple installe ou met Ă niveau pytest
et pytest-cov
. Les tests sont ensuite exĂ©cutĂ©s et une sortie est gĂ©nĂ©rĂ©e au format JUnit pendant que les rĂ©sultats de couverture du code sont gĂ©nĂ©rĂ©s dans Cobertura. Pour plus dâinformations, consultez JUnit et Cobertura.
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Test with pytest run: | pip install pytest pytest-cov pytest tests.py --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Test with pytest
run: |
pip install pytest pytest-cov
pytest tests.py --doctest-modules --junitxml=junit/test-results.xml --cov=com --cov-report=xml --cov-report=html
Utilisation de Ruff pour le linting et/ou la mise en forme du code
Lâexemple suivant installe ou met Ă niveau ruff
, et lâutilise pour effectuer le linting de tous les fichiers. Pour plus dâinformations, consultez Ruff.
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x' - name: Install the code linting and formatting tool Ruff run: pipx install ruff - name: Lint code with Ruff run: ruff check --output-format=github --target-version=py39 - name: Check code formatting with Ruff run: ruff format --diff --target-version=py39 continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install the code linting and formatting tool Ruff
run: pipx install ruff
- name: Lint code with Ruff
run: ruff check --output-format=github --target-version=py39
- name: Check code formatting with Ruff
run: ruff format --diff --target-version=py39
continue-on-error: true
LâĂ©tape de mise en forme a dĂ©fini continue-on-error: true
. Cela empĂȘche le workflow dâĂ©chouer si lâĂ©tape de mise en forme ne rĂ©ussit pas. Une fois que vous avez rĂ©solu toutes les erreurs de mise en forme, vous pouvez supprimer cette option afin que le workflow intercepte de nouveaux problĂšmes.
Exécution de tests avec tox
Avec GitHub Actions, vous pouvez exĂ©cuter des tests avec tox et rĂ©partir les tĂąches entre plusieurs travaux. Vous devez appeler tox Ă lâaide de lâoption -e py
pour choisir la version de Python de votre PATH
, plutĂŽt que de spĂ©cifier une version. Pour plus dâinformations, consultez tox.
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python: ["3.9", "3.11", "3.13"] steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.python }} - name: Install tox and any other packages run: pip install tox - name: Run tox # Run tox using the version of Python in `PATH` run: tox -e py
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python: ["3.9", "3.11", "3.13"]
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python }}
- name: Install tox and any other packages
run: pip install tox
- name: Run tox
# Run tox using the version of Python in `PATH`
run: tox -e py
Empaquetage des donnĂ©es de workflow en tant quâartefacts
Vous pouvez charger des artefacts Ă afficher une fois un workflow terminĂ©. Par exemple, vous devrez peut-ĂȘtre enregistrer des fichiers journaux, des vidages principaux, des rĂ©sultats de test ou des captures dâĂ©cran. Pour plus dâinformations, consultez « Stocker et partager des donnĂ©es avec les artefacts de workflow ».
Lâexemple suivant montre comment utiliser lâaction upload-artifact
pour archiver les rĂ©sultats des tests obtenus par lâexĂ©cution de pytest
. Pour plus dâinformations, consultez lâaction upload-artifact
.
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - uses: actions/checkout@v4 - name: Setup Python # Set Python version uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} # Install pip and pytest - name: Install dependencies run: | python -m pip install --upgrade pip pip install pytest - name: Test with pytest run: pytest tests.py --doctest-modules --junitxml=junit/test-results-${{ matrix.python-version }}.xml - name: Upload pytest test results uses: actions/upload-artifact@v3 with: name: pytest-results-${{ matrix.python-version }} path: junit/test-results-${{ matrix.python-version }}.xml # Use always() to always run this step to publish test results when there are test failures if: ${{ always() }}
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
steps:
- uses: actions/checkout@v4
- name: Setup Python # Set Python version
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
# Install pip and pytest
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
- name: Test with pytest
run: pytest tests.py --doctest-modules --junitxml=junit/test-results-${{ matrix.python-version }}.xml
- name: Upload pytest test results
uses: actions/upload-artifact@v3
with:
name: pytest-results-${{ matrix.python-version }}
path: junit/test-results-${{ matrix.python-version }}.xml
# Use always() to always run this step to publish test results when there are test failures
if: ${{ always() }}
Publication sur PyPI
Vous pouvez configurer votre workflow pour publier votre package Python sur PyPI une fois vos tests CI rĂ©ussis. Cette section montre comment utiliser GitHub Actions pour charger votre package sur PyPI chaque fois que vous publiez une version. Pour plus dâinformations, consultez « Gestion des mises en production dans un rĂ©fĂ©rentiel ».
Lâexemple de flux de travail ci-dessous utilise lâĂ©diteur approuvĂ© pour sâauthentifier auprĂšs de PyPI, ce qui Ă©limine la nĂ©cessitĂ© dâun jeton dâAPI configurĂ© manuellement.
# Ce workflow utilise des actions qui ne sont pas certifiĂ©es par GitHub. # Elles sont fournies par un tiers et rĂ©gies par # des conditions dâutilisation du service, une politique de confidentialitĂ© et un support distincts. # documentation en ligne. # GitHub recommande dâĂ©pingler les actions Ă un SHA de commit. # Pour obtenir une version plus rĂ©cente, vous devez mettre Ă jour le SHA. # Vous pouvez Ă©galement rĂ©fĂ©rencer une balise ou une branche, mais lâaction peut changer sans avertissement. name: Upload Python Package on: release: types: [published] permissions: contents: read jobs: release-build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.x" - name: Build release distributions run: | # NOTE: put your own distribution build steps here. python -m pip install build python -m build - name: Upload distributions uses: actions/upload-artifact@v3 with: name: release-dists path: dist/ pypi-publish: runs-on: ubuntu-latest needs: - release-build permissions: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write # Dedicated environments with protections for publishing are strongly recommended. environment: name: pypi # OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status: # url: https://pypi.org/p/YOURPROJECT steps: - name: Retrieve release distributions uses: actions/download-artifact@v3 with: name: release-dists path: dist/ - name: Publish release distributions to PyPI uses: pypa/gh-action-pypi-publish@6f7e8d9c0b1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d
# Ce workflow utilise des actions qui ne sont pas certifiées par GitHub.
# Elles sont fournies par un tiers et régies par
# des conditions dâutilisation du service, une politique de confidentialitĂ© et un support distincts.
# documentation en ligne.
# GitHub recommande dâĂ©pingler les actions Ă un SHA de commit.
# Pour obtenir une version plus récente, vous devez mettre à jour le SHA.
# Vous pouvez Ă©galement rĂ©fĂ©rencer une balise ou une branche, mais lâaction peut changer sans avertissement.
name: Upload Python Package
on:
release:
types: [published]
permissions:
contents: read
jobs:
release-build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.x"
- name: Build release distributions
run: |
# NOTE: put your own distribution build steps here.
python -m pip install build
python -m build
- name: Upload distributions
uses: actions/upload-artifact@v3
with:
name: release-dists
path: dist/
pypi-publish:
runs-on: ubuntu-latest
needs:
- release-build
permissions:
# IMPORTANT: this permission is mandatory for trusted publishing
id-token: write
# Dedicated environments with protections for publishing are strongly recommended.
environment:
name: pypi
# OPTIONAL: uncomment and update to include your PyPI project URL in the deployment status:
# url: https://pypi.org/p/YOURPROJECT
steps:
- name: Retrieve release distributions
uses: actions/download-artifact@v3
with:
name: release-dists
path: dist/
- name: Publish release distributions to PyPI
uses: pypa/gh-action-pypi-publish@6f7e8d9c0b1a2c3d4e5f6a7b8c9d0e1f2a3b4c5d