Nota: Actualmente los ejecutores hospedados en GitHub no se admiten en GitHub Enterprise Server. Puede ver más información sobre la compatibilidad futura planeada en GitHub public roadmap.
Introducción
Esta guía te muestra cómo construir, probar y publicar un paquete de Python.
Los ejecutores hospedados en GitHub tienen un caché de herramientas con software pre-instalado, lo cual incluye a Python y PyPy. ¡No tienes que instalar nada! Para obtener una lista completa de software actualizado y las versiones preinstaladas de Python y PyPy, consulta "Utilizar los ejecutores hospedados en GitHub".
Requisitos previos
Deberías estar familiarizado con YAML y la sintaxis para las GitHub Actions. Para obtener más información, vea «Más información sobre las Acciones de GitHub».
Te recomendamos que tengas una comprensión básica de Python y pip. Para más información, vea:
Utilizar ejecutores auto-hospedados en GitHub Enterprise Server
Cuando use acciones de configuración, (como actions/setup-LANGUAGE
) en GitHub Enterprise Server con ejecutores autohospedados, es posible que necesite configurar la caché de herramientas en los ejecutores que no tienen acceso a Internet. Para obtener más información, vea «Configurar el caché de la herramienta en ejecutores auto-hospedados sin acceso a internet».
Utilizar un flujo de trabajo inicial de Python
Para comenzar rápidamente, agrega un flujo de trabajo de inicio al directorio .github/workflows
del repositorio.
GitHub proporciona un flujo de trabajo de inicio para Python que debe funcionar si el repositorio ya contiene al menos un archivo .py
. En las secciones siguientes de esta guía se proporcionan ejemplos de cómo puedes personalizar este flujo de trabajo de inicio.
-
En tu instancia de GitHub Enterprise Server, navega a la página principal del repositorio.
-
En el nombre del repositorio, haz clic en Acciones.
-
Si ya tiene un flujo de trabajo en su repositorio, haga clic en New workflow (Nuevo flujo de trabajo).
-
La página "Elegir un flujo de trabajo" muestra una selección de flujos de trabajo de inicio recomendados. Busca «aplicación Python».
-
En el flujo de trabajo "aplicación Python", haga clic en Configurar.
Si no encuentras el flujo de trabajo de inicio "aplicación Python", copia el siguiente código de flujo de trabajo en un nuevo archivo llamado
python-app.yml
en el directorio.github/workflows
de tu repositorio.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.10 uses: actions/setup-python@v4 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - 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.10 uses: actions/setup-python@v4 with: python-version: "3.10" - name: Install dependencies run: | python -m pip install --upgrade pip pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi - name: Lint with flake8 run: | # stop the build if there are Python syntax errors or undefined names flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics - name: Test with pytest run: | pytest
-
Edita el flujo de trabajo según sea necesario. Por ejemplo, cambia la versión de Python.
-
Haga clic en Commit changes (Confirmar cambios).
Especificar una versión de Python
Para usar una versión preinstalada de Python o PyPy en un ejecutor hospedado en GitHub, use la acción setup-python
. Esta acción busca una versión específica de Python o PyPy en la caché de herramientas de cada ejecutor y agrega los archivos binarios necesarios a PATH
, que se conserva para el resto del trabajo. Si una versión específica de Python no está preinstalada en la memoria caché de herramientas, la acción setup-python
descargará y configurará la versión adecuada del repositorio python-versions
.
El uso de la acción setup-python
es la forma recomendada de usar Python con GitHub Actions, ya que garantiza que tenga lugar un comportamiento uniforme en los distintos ejecutores y versiones de Python. Si va a usar un ejecutor autohospedado, debe instalar Python y agregarlo a PATH
. Para más información, vea la acción setup-python
.
La tabla que aparece a continuación describe las ubicaciones de la caché de herramientas en cada ejecutor alojado GitHub.
Ubuntu | Mac | Windows | |
---|---|---|---|
Directorio de caché de herramientas | /opt/hostedtoolcache/* | /Users/runner/hostedtoolcache/* | C:\hostedtoolcache\windows\* |
Caché de herramientas de Python | /opt/hostedtoolcache/Python/* | /Users/runner/hostedtoolcache/Python/* | C:\hostedtoolcache\windows\Python\* |
Caché de herramientas de PyPy | /opt/hostedtoolcache/PyPy/* | /Users/runner/hostedtoolcache/PyPy/* | C:\hostedtoolcache\windows\PyPy\* |
Si está utilizando un ejecutor autohospedado, puede configurarlo para utilizar la acción setup-python
para administrar sus dependencias. Para obtener más información, consulte uso de setup-python con un ejecutor autohospedado en el archivo README de setup-python
.
GitHub admite la sintaxis de control de versiones semántico. Para obtener más información, consulte "Uso del control de versiones semántico" y "Especificación del control de versiones semántico".
Usar múltiples versiones de Python
En el ejemplo siguiente se usa una matriz para el trabajo que sirve para configurar varias versiones de Python. Para obtener más información, vea «Uso de una matriz para tus trabajos».
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["pypy3.9", "pypy3.10", "3.9", "3.10", "3.11", "3.12"] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 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.9", "pypy3.10", "3.9", "3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
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)"
Usar una versión de Python específica
Puedes configurar una versión específica de Python. Por ejemplo, 3.10. Como alternativa, puedes utilizar una sintaxis de versión semántica para obtener el último lanzamiento menor. En este ejemplo se usa el último lanzamiento menor 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@v4 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@v4
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)"
Excluir una versión
Si especifica una versión de Python que no esté disponible, se produce un error en setup-python
como: ##[error]Version 3.6 with arch x64 not found
. El mensaje de error incluye las versiones disponibles.
También puede usar la palabra clave exclude
en el flujo de trabajo si hay una configuración de Python que no desea ejecutar. Para obtener más información, vea «Sintaxis del flujo de trabajo para Acciones de GitHub».
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.10", "3.11", "pypy3.9", "pypy3.10"] exclude: - os: macos-latest python-version: "3.9" - os: windows-latest python-version: "3.9"
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.10", "3.11", "pypy3.9", "pypy3.10"]
exclude:
- os: macos-latest
python-version: "3.9"
- os: windows-latest
python-version: "3.9"
Usar la versión de Python predeterminada
Recomendamos usar setup-python
para configurar la versión de Python que se usa en sus flujos de trabajo porque permite que las dependencias sean explícitas. Si no usa setup-python
, la versión predeterminada de Python establecida en PATH
se usa en cualquier shell cuando llama a python
. La versión predeterminada de Python varía entre los ejecutores alojados GitHub, que pueden causar cambios inesperados o usar una versión anterior a la esperada.
Ejecutor alojado de GitHub | Descripción |
---|---|
Ubuntu | Los ejecutores de Ubuntu tienen varias versiones del sistema Python instaladas en /usr/bin/python y /usr/bin/python3 . Las versiones de Python que vienen empaquetadas con Ubuntu se suman a las versiones que GitHub instala en la caché de herramientas. |
Windows | Excluyendo las versiones de Python que están en la caché de herramientas, Windows no se envía con una versión equivalente de Python del sistema. Para mantener un comportamiento uniforme con otros ejecutores y para permitir que Python se use de forma integrada sin la acción setup-python , GitHub agrega algunas versiones desde la caché de herramientas a PATH . |
macOS | Los ejecutores de macOS tienen más de una versión de Python del sistema instalada, además de las versiones que son parte de la caché de las herramientas. Las versiones de Python del sistema se encuentran en el directorio /usr/local/Cellar/python/* . |
Instalación de dependencias
Los ejecutores alojados GitHub tienen instalado el administrador del paquete pip. Puedes usar pip para instalar dependencias desde el registro del paquete de PyPI antes de construir y probar tu código. Por ejemplo, el YAML siguiente instala o actualiza el instalador de paquetes pip
y los paquetes setuptools
y wheel
.
También puedes almacenar en caché las dependencias para acelerar el flujo de trabajo. Para más información, consulta "Almacenar en caché las dependencias para agilizar los flujos de trabajo".
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 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@v4
with:
python-version: '3.x'
- name: Install dependencies
run: python -m pip install --upgrade pip setuptools wheel
Archivo de requisitos
Después de actualizar pip
, el siguiente paso típico consiste en instalar dependencias desde requirements.txt. Para obtener más información, consulte pip.
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 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@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
Dependencias de almacenamiento en caché
Puedes almacenar en caché y restaurar las dependencias mediante la acción setup-python
.
El siguiente ejemplo guarda las dependencias en caché para pip.
steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v4 with: python-version: '3.11' cache: 'pip' - run: pip install -r requirements.txt - run: pip test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v4
with:
python-version: '3.11'
cache: 'pip'
- run: pip install -r requirements.txt
- run: pip test
De manera predeterminada, la acción setup-python
busca el archivo de dependencias (requirements.txt
para pip, Pipfile.lock
para pipenvo o poetry.lock
para poetry) en todo el repositorio. Para obtener más información, consulta "Almacenamiento en caché de dependencias de paquetes" en el archivo README de setup-python
.
Si tiene una necesidad específica o necesita controles más precisos para el almacenamiento en caché, puede usar la acción cache
. Pip almacena en caché las dependencias en diferentes ubicaciones, en función del sistema operativo del ejecutor. La ruta que necesitarás para almacenar en caché puede diferir del ejemplo de Ubuntu que se muestra anteriormente, según el sistema operativo que uses. Para obtener más información, consulte Ejemplos de almacenamiento en caché de Python en el repositorio de acciones de cache
.
Probar el código
Puedes usar los mismos comandos que usas de forma local para construir y probar tu código.
Pruebas con pytest y pytest-cov
En este ejemplo se instalan o actualizan pytest
y pytest-cov
. A continuación, se ejecutan y se emiten pruebas en formato JUnit, mientras que los resultados de la cobertura de código se emiten en Cobertura. Para obtener más información, consulte JUnit y Cobertura.
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 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@v4
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
Uso de Ruff para código de lint
En el ejemplo siguiente se instala o actualiza ruff
y se usa para ejecutar el linting en todos los archivos. Para más información, consulta Ruff.
steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Lint with Ruff run: | pip install ruff ruff --output-format=github . continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Lint with Ruff
run: |
pip install ruff
ruff --output-format=github .
continue-on-error: true
El paso de linting tiene establecido continue-on-error: true
. Esto prevendrá que el flujo de trabajo falle si el paso de limpieza de código no tiene éxito. Una vez que hayas abordado todos los errores de limpieza de código, puedes eliminar esta opción para que el flujo de trabajo atrape propuestas nuevas.
Ejecutar pruebas con tox
Con GitHub Actions, puedes ejecutar pruebas con tox y repartir el trabajo a través de múltiples trabajos. Deberá invocar tox mediante la opción -e py
para elegir la versión de Python en PATH
lugar de especificar una versión concreta. Para obtener más información, consulte tox.
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python: ["3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v4 - name: Setup Python uses: actions/setup-python@v4 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.10", "3.11"]
steps:
- uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
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
Empaquetar datos de flujo de trabajo como artefactos
Puedes cargar artefactos para ver después de que se complete un flujo de trabajo. Por ejemplo, es posible que debas guardar los archivos de registro, los vaciados de memoria, los resultados de las pruebas o las capturas de pantalla. Para obtener más información, vea «Almacenar los datos de los flujos de trabajo como artefactos».
En el ejemplo siguiente se muestra cómo puede usar la acción upload-artifact
para archivar los resultados de la prueba después de ejecutar pytest
. Para más información, vea la acción upload-artifact
.
name: Python package on: [push] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v4 - name: Setup Python # Set Python version uses: actions/setup-python@v4 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.7", "3.8", "3.9", "3.10", "3.11"]
steps:
- uses: actions/checkout@v4
- name: Setup Python # Set Python version
uses: actions/setup-python@v4
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() }}
Publicar en registros de paquetes
Puedes configurar tu flujo de trabajo para publicar tu paquete de Python a un registro de paquetes una vez que pasen tus pruebas de IC. En esta sección se muestra cómo puede usar GitHub Actions para cargar el paquete en PyPI cada vez que publique una versión.
En este ejemplo, deberá crear dos tokens de API de PyPI. Puedes utilizar secretos para almacenar los tokens de acceso o las credenciales que se necesitan publicar en tu paquete. Para obtener más información, vea «Uso de secretos en Acciones de GitHub».
# Este flujo de trabajo usa acciones que no GitHub no certifica. # Estas las proporcionan entidades terceras y las gobiernan # condiciones de servicio, políticas de privacidad y documentación de soporte # en línea. # GitHub recomienda anclar acciones a un SHA de confirmación. # Para obtener una versión más reciente, debes actualizar el SHA. # También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia. name: Upload Python Package on: release: types: [published] jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install dependencies run: | python -m pip install --upgrade pip pip install build - name: Build package run: python -m build - name: Publish package uses: pypa/gh-action-pypi-publish@release/v1 with: password: ${{ secrets.PYPI_API_TOKEN }}
# Este flujo de trabajo usa acciones que no GitHub no certifica.
# Estas las proporcionan entidades terceras y las gobiernan
# condiciones de servicio, políticas de privacidad y documentación de soporte
# en línea.
# GitHub recomienda anclar acciones a un SHA de confirmación.
# Para obtener una versión más reciente, debes actualizar el SHA.
# También puedes hacer referencia a una etiqueta o rama, pero la acción puede cambiar sin ninguna advertencia.
name: Upload Python Package
on:
release:
types: [published]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install build
- name: Build package
run: python -m build
- name: Publish package
uses: pypa/gh-action-pypi-publish@release/v1
with:
password: ${{ secrets.PYPI_API_TOKEN }}
Para obtener más información sobre el flujo de trabajo de inicio, consulte python-publish
.