Compartir vía


Personalización de canalizaciones de Python

En este artículo se describe cómo personalizar la compilación, las pruebas, el empaquetado y la entrega de aplicaciones y código de Python en Azure Pipelines. Para crear la primera canalización con Python, consulte el inicio rápido de Python.

Con los agentes hospedados por Microsoft en Azure Pipelines, puede compilar sus aplicaciones de Python sin tener que configurar su propia infraestructura. Las herramientas que se usan normalmente para compilar, probar y ejecutar aplicaciones de Python, incluidas pip, están preinstaladas.

Es posible que tenga que solicitar la concesión gratuita de trabajos paralelos o comprar un trabajo paralelo para ejecutar las canalizaciones.

Para compilar aplicaciones de Python con Azure Pipelines, necesita un agente autohospedado con Python instalado. Para instalar Python en el agente, consulte UsePythonVersion.

Uso de una versión específica de Python

Para usar una versión específica de Python en la canalización, agregue la tarea Usar versión de Python para azure-pipelines.yml. En el ejemplo siguiente, la definición de canalización YAML establece la canalización para usar Python 3.11.

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.11'

Uso de varias versiones de Python

Para ejecutar una canalización con varias versiones de Python, por ejemplo para probar un paquete con esas versiones, defina un job con una matrix de las versiones de Python. A continuación, establezca la tarea UsePythonVersion para que haga referencia a la variable matrix. Por ejemplo:

jobs:
- job: 'Test'
  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python38:
        python.version: '3.8'
      Python39:
        python.version: '3.9'
      Python310:
        python.version: '3.10'

  steps:
  - task: UsePythonVersion@0
    inputs:
      versionSpec: '$(python.version)'

Puede agregar tareas que usen cada versión de Python en la matriz.

Ejecución de scripts de Python

Para ejecutar scripts de Python desde el repositorio, use un script elemento y especifique un nombre de archivo. Por ejemplo:

- script: python src/example.py

También puede usar la tarea de script de Python para ejecutar scripts de Python insertados.

- task: PythonScript@0
  inputs:
    scriptSource: 'inline'
    script: |
      print('Hello world 1')
      print('Hello world 2')

Para parametrizar la ejecución del script, use la PythonScript tarea con arguments valores para pasar argumentos al proceso en ejecución. Puede usar sys.argv o la biblioteca más sofisticada argparse para analizar los argumentos.

- task: PythonScript@0
  inputs:
    scriptSource: inline
    script: |
      import sys
      print ('Executing script file is:', str(sys.argv[0]))
      print ('The arguments are:', str(sys.argv))
      import argparse
      parser = argparse.ArgumentParser()
      parser.add_argument("--world", help="Provide the name of the world to greet.")
      args = parser.parse_args()
      print ('Hello ', args.world)
    arguments: --world Venus

Instalar dependencias

Puede usar scripts para instalar paquetes PyPI específicos con pip. En el ejemplo siguiente se instalan o actualizan pip y los setuptools paquetes y wheel .

- script: python -m pip install --upgrade pip setuptools wheel
  displayName: 'Install tools'

Instalación de requisitos

Después de actualizar pip y amigos, un paso siguiente típico es instalar dependencias desde requirements.txt.

- script: pip install -r requirements.txt
  displayName: 'Install requirements'

Ejecutar pruebas

Puede usar scripts para instalar y ejecutar varias pruebas en la canalización.

Ejecución de pruebas lint con flake8

El código YAML siguiente instala o actualiza flake8 y lo usa para ejecutar pruebas lint.

- script: |
    python -m pip install flake8
    flake8 .
  displayName: 'Run lint tests'

Prueba con pytest y recopilación de métricas de cobertura con pytest-cov

El siguiente código YAML instala pytest y pytest-cov ejecuta pruebas, lo que genera resultados de pruebas en formato JUnit y la cobertura de código de salida da como resultado cobertura XML.

- script: |
    pip install pytest pytest-azurepipelines
    pip install pytest-cov
    pytest --doctest-modules --junitxml=junit/test-results.xml --cov=. --cov-report=xml
  displayName: 'pytest'

Ejecución de pruebas con Tox

Azure Pipelines puede ejecutar trabajos de prueba de Tox en paralelo para dividir el trabajo. En un equipo de desarrollo, debe ejecutar los entornos de prueba en serie. En el ejemplo siguiente se usa tox -e py para ejecutar la versión de Python activa para el trabajo actual.

- job:

  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python38:
        python.version: '3.8'
      Python39:
        python.version: '3.9'
      Python310:
        python.version: '3.10'

  steps:
  - task: UsePythonVersion@0
    displayName: 'Use Python $(python.version)'
    inputs:
      versionSpec: '$(python.version)'

  - script: pip install tox
    displayName: 'Install Tox'

  - script: tox -e py
    displayName: 'Run Tox'

Publicación de los resultados de las pruebas

Agregue la tarea Publicar resultados de pruebas para publicar resultados de pruebas JUnit o xUnit en el servidor.

- task: PublishTestResults@2
  condition: succeededOrFailed()
  inputs:
    testResultsFiles: '**/test-*.xml'
    testRunTitle: 'Publish test results for Python $(python.version)'

Publicación de resultados de cobertura de código

Agregue la tarea Publicar resultados de cobertura de código para publicar los resultados de cobertura de código en el servidor. Puede ver las métricas de cobertura en el resumen de compilación y descargar informes HTML para su posterior análisis.

- task: PublishCodeCoverageResults@2
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'

Empaquetado y entrega de código

Para autenticarse con twine, use la tarea de autenticación de carga de Python twine para almacenar las credenciales de autenticación en la variable de PYPIRC_PATH entorno.

- task: TwineAuthenticate@0
  inputs:
    artifactFeed: '<Azure Artifacts feed name>'
    pythonUploadServiceConnection: '<twine service connection from external organization>'

A continuación, agregue un script personalizado que use twine para publicar los paquetes.

- script: |
   twine upload -r "<feed or service connection name>" --config-file $(PYPIRC_PATH) <package path/files>

También puede usar Azure Pipelines para compilar una imagen para la aplicación de Python e insertarla en un registro de contenedor.