Skip to main content

Création et test du code Python

DĂ©couvrez comment crĂ©er un flux de travail d’intĂ©gration continue (CI) pour gĂ©nĂ©rer et tester votre projet Python.

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.

  1. Sur GitHub, accédez à la page principale du référentiel.

  2. Sous le nom de votre dépÎt, cliquez sur Actions.

    Capture d’écran des onglets du rĂ©fĂ©rentiel « github/docs Â». L’onglet « Actions Â» est mis en surbrillance avec un encadrĂ© orange.

  3. Si vous disposez dĂ©jĂ  d’un workflow dans votre dĂ©pĂŽt, cliquez sur Nouveau workflow.

  4. La page « Choisir un workflow Â» prĂ©sente une sĂ©lection de modĂšles de workflow recommandĂ©s. Recherchez « application Python Â».

  5. 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
    
  6. Modifiez le workflow en fonction des besoins. Par exemple, modifiez la version de Python.

  7. 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.

UbuntuMacWindows
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 Â».

YAML
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.

YAML
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 Â».

YAML
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 GitHubDescription
UbuntuPlusieurs 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.
macOSPlusieurs 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 Â».

YAML
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.

YAML
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.

YAML
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.

YAML
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.

YAML
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.

YAML
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.

YAML
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.

YAML
# 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