Personalización de Python para Azure Pipelines

Puede usar Azure Pipelines para compilar las aplicaciones de Python sin tener que configurar ninguna infraestructura propia. Las herramientas que se usan normalmente para compilar, probar y ejecutar aplicaciones Python, como pip, se instalan previamente en agentes hospedados por Microsoft en Azure Pipelines.

Para crear la primera canalización con Python, consulte el inicio rápido de Python.

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 a azure-pipelines.yml. Este fragmento de código establece la canalización para que use 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.

jobs:
- job: 'Test'
  pool:
    vmImage: 'ubuntu-latest' # other options: 'macOS-latest', 'windows-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 para que se ejecuten con cada versión de Python en la matriz.

Ejecución de scripts de Python

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

- script: python src/example.py

También puede ejecutar scripts de Python alineados con la tarea Script de Python:

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

Si desea parametrizar la ejecución del script, use la tarea PythonScript con los valores arguments 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. Por ejemplo, este archivo YAML instala o actualiza pip y los paquetes setuptools y wheel.

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

Instalación de requisitos

Después de actualizar pip, el paso siguiente típico consiste en instalar las dependencias de requirements.txt:

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

Ejecución de las pruebas

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

Ejecución de pruebas lint con flake8

Para instalar o actualizar flake8 y usarlo para ejecutar pruebas lint, use este código YAML:

- 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

Use este código YAML para instalar pytest y pytest-cov, ejecutar pruebas, obtener resultados de pruebas en formato JUnit y obtener resultados de cobertura de código en formato 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 este ejemplo, se usa tox -e py para ejecutar la versión de Python que esté 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@1
  inputs:
    codeCoverageTool: Cobertura
    summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'

Empaquetado y entrega de código

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

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

A continuación, agregue un script personalizado que usa 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.