Compilación de aplicaciones de Python

Azure Pipelines

Puede usar Azure Pipelines para compilar, probar e implementar aplicaciones y scripts de Python como parte del sistema de CI/CD. Este artículo se centra en la creación de una canalización sencilla.

Si desea un tutorial completo, consulte Uso de CI/CDpara implementar una aplicación web de Python para Azure App Service en Linux .

Para crear y activar un entorno de Anaconda e instalar paquetes de Anaconda con , consulte Ejecución de canalizaciones condaconda

Cree su primera canalización

¿No está Azure Pipelines? Si es así, se recomienda probar esta sección antes de pasar a otras secciones.

Obtención del código

Importe este repositorio en el repositorio de Git en Azure DevOps Server 2019:

Importe este repositorio en el repositorio de Git:

https://github.com/Microsoft/python-sample-vscode-flask-tutorial

Inicio de sesión en Azure Pipelines

Inicie sesión en Azure Pipelines. Una vez que haya iniciado sesión, el explorador accederá a https://dev.azure.com/my-organization-name y aparecerá el panel de Azure DevOps.

En la organización seleccionada, cree un proyecto. Si no tiene ningún proyecto en la organización, aparecerá la pantalla Cree un proyecto para empezar. De lo contrario, seleccione el botón Crear proyecto en la esquina superior derecha del panel.

Creación de la canalización

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Vaya a Pipelinesy, a continuación, seleccione Nueva canalización.

  3. Siga los pasos del asistente y seleccione primero GitHub como ubicación del código fuente.

  4. Puede que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub.

  5. Cuando aparezca la lista de repositorios, seleccione el que corresponda.

  6. Es posible que se le redirija a GitHub para instalar la aplicación Azure Pipelines. Si es así, seleccione Aprobar instalación.

Cuando aparezca la pestaña Configurar, seleccione Paquete de Python. Esto creará un paquete de Python para probar en varias versiones de Python.

  1. Cuando aparezca la nueva canalización, echa un vistazo a YAML para ver lo que hace. Cuando esté listo, seleccione Guardar y ejecute.

    Botón Guardar y ejecutar en una nueva canalización de YAML

  2. Se le pedirá que confirme un nuevo archivo azure-pipelines.yml en el repositorio. Una vez satisfecho con el mensaje, seleccione Guardar y ejecutar de nuevo.

    Si desea ver la canalización en acción, seleccione el trabajo de compilación.

    Acaba de crear y ejecutó una canalización que creamos automáticamente, porque el código parece ser una buena coincidencia para la plantilla de paquete de Python.

    Ahora tiene una canalización YAML en funcionamiento ( ) en el repositorio que está lista azure-pipelines.yml para personalizar.

  3. Cuando esté listo para realizar cambios en la canalización, selecciónelo en la Pipelines y, a continuación, edite el archivo.

Consulte las secciones siguientes para obtener información sobre algunas de las formas más comunes de personalizar la canalización.

YAML

  1. Agregue un azure-pipelines.yml archivo en el repositorio. Personalice este fragmento de código para la compilación.
trigger:
- master

pool: Default

steps:
- script: python -m pip install --upgrade pip
  displayName: 'Install dependencies'

- script: pip install -r requirements.txt
  displayName: 'Install requirements'
  1. Cree una canalización (si no sabe cómo, consulte Creación de la primera canalización)y, para la plantilla, seleccione YAML.

  2. Establezca el grupo de agentes y la ruta de acceso del archivo YAML para la canalización.

  3. Guarde la canalización y poner en cola una compilación. Cuando aparezca el mensaje Build #nnnnnnnn.n has been queued (Compilar #nnnnnnnn.n se ha puesto en cola), seleccione el vínculo de número para ver la canalización en acción.

  4. Cuando esté listo para realizar cambios en la canalización, edite.

  5. Consulte las secciones siguientes para obtener información sobre algunas de las formas más comunes de personalizar la canalización.

Entorno de compilación

No tiene que configurar nada para que Azure Pipelines proyectos de Python. Python está preinstalado en agentes de compilación hospedados por Microsoft para Linux, macOS o Windows. Para ver qué versiones de Python están preinstaladas, consulte Uso de un agente hospedado por Microsoft.

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 usar Python 3.6:

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

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 con job un de las versiones de matrix Python. A continuación, UsePythonVersion establezca la tarea para hacer referencia a la variable matrix .

jobs:
- job: 'Test'
  pool:
    vmImage: 'ubuntu-latest' # other options: 'macOS-latest', 'windows-latest'
  strategy:
    matrix:
      Python27:
        python.version: '2.7'
      Python35:
        python.version: '3.5'
      Python36:
        python.version: '3.6'

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

Puede agregar tareas para ejecutar 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 script elemento y especifique un nombre de archivo. Por ejemplo:

- script: python src/example.py

También puede ejecutar scripts de Python en línea con la tarea Script de Python:

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

Para parametrizar la ejecución de scripts, use PythonScript la tarea con valores para pasar arguments argumentos al proceso en ejecución. Puede usar sys.argv o la biblioteca más sofisticada para analizar los argparse 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 YAML instala o actualiza pip y los setuptools paquetes y wheel .

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

Requisitos de instalación

Después de actualizar pip y a los amigos, un paso siguiente típico es instalar dependencias desde pip:

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

Ejecución de las pruebas

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

Ejecución de pruebas de 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 YAML para instalar y , ejecutar pruebas, resultados de pruebas de salida en formato JUnit y resultados de cobertura de código de salida pytestpytest-cov 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 ejecutar trabajos de prueba de Tox paralelos para dividir el trabajo. En un equipo de desarrollo, tiene que ejecutar los entornos de prueba en serie. En este ejemplo tox -e py se usa para ejecutar cualquier versión de Python activa para el trabajo actual.

- job:

  pool:
    vmImage: 'ubuntu-latest'
  strategy:
    matrix:
      Python27:
        python.version: '2.7'
      Python35:
        python.version: '3.5'
      Python36:
        python.version: '3.6'
      Python37:
        python.version: '3.7'

  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 resultados de pruebas

Agregue la tarea Publicar Resultados de pruebas para publicar los resultados de pruebas de 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'

Empaquetar y entregar código

Para autenticarse con twine , use la tarea twine para almacenar las credenciales de autenticación en la PYPIRC_PATH variable de 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 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 crear una imagen para la aplicación de Python e insertarla en un registro de contenedor.