Condividi tramite


Personalizzare le pipeline Python

Questo articolo descrive come personalizzare la compilazione, il test, la creazione di pacchetti e la distribuzione di app e codice Python in Azure Pipelines. Per creare la prima pipeline con Python, vedere la guida introduttiva a Python.

Con gli agenti ospitati da Microsoft in Azure Pipelines, è possibile creare app Python senza configurare la propria infrastruttura. Gli strumenti comunemente usati per compilare, testare ed eseguire app Python, tra cui pip, sono preinstallati.

Potrebbe essere necessario richiedere l'assegnazione gratuita di processi paralleli o acquistare un processo parallelo per eseguire le pipeline.

Per creare app Python con Azure Pipelines, è necessario un "self-hosted agent" con Python installato. Per installare Python nell'agente, vedere UsePythonVersion.

Usare una versione specifica di Python

Per utilizzare una versione specifica di Python nella pipeline, aggiungere il task Usa versione Python a azure-pipelines.yml. La definizione della pipeline YAML di esempio seguente imposta la pipeline per l'uso di Python 3.11.

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

Usare più versioni di Python

Per eseguire una pipeline con più versioni di Python, ad esempio per testare un pacchetto su tali versioni, definire un job con un elenco di matrix di versioni di Python. Impostare quindi l'attività UsePythonVersion per fare riferimento alla matrix variabile. Ad esempio:

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)'

È possibile aggiungere attività che usano ogni versione di Python nella matrice.

Eseguire script Python

Per eseguire script Python dal repository, usare un script elemento e specificare un nome file. Ad esempio:

- script: python src/example.py

È anche possibile usare l'attività di script Python per eseguire script Python inline.

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

Per parametrizzare l'esecuzione di script, usare l'attività PythonScript insieme ai valori arguments per passare argomenti al processo in esecuzione. È possibile usare sys.argv o la libreria più sofisticata argparse per analizzare gli argomenti.

- 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

Installare le dipendenze

È possibile usare gli script per installare pacchetti PyPI specifici con pip. Nell'esempio seguente vengono installati o aggiornati pip, setuptools e wheel pacchetti.

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

Requisiti di installazione

Dopo aver aggiornato pip e i suoi amici, un tipico passo successivo è installare le dipendenze da requirements.txt.

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

Esecuzione dei test

È possibile usare gli script per installare ed eseguire vari test nella pipeline.

Eseguire test lint con flake8

Il codice YAML seguente installa o aggiorna flake8 e lo usa per eseguire test lint.

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

Testare con pytest e raccogliere le metriche di copertura con pytest-cov

Il codice YAML seguente installa pytest e pytest-cov, ed esegue test, con output dei risultati dei test in formato JUnit e con output dei risultati del code coverage in 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'

Eseguire test con Tox

Azure Pipelines può eseguire processi di test Tox paralleli per suddividere il lavoro. In un computer di sviluppo è necessario eseguire gli ambienti di test in serie. L'esempio seguente usa tox -e py per eseguire qualsiasi versione di Python sia attiva per il processo corrente.

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

Pubblica risultati dei test

Aggiungere l'attività Pubblica risultati test per pubblicare i risultati del test JUnit o xUnit nel server.

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

Pubblicare i risultati della copertura del codice

Aggiungere l'attività Pubblica i risultati della copertura del codice per pubblicare i risultati della copertura del codice sul server. È possibile visualizzare le metriche di copertura nel riepilogo della compilazione e scaricare i report HTML per ulteriori analisi.

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

Imballare e consegnare il codice

Eseguire l'autenticazione con twine utilizzando l'attività di autenticazione di caricamento di Python twine per archiviare le credenziali di autenticazione nella variabile di ambiente PYPIRC_PATH.

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

Aggiungere quindi uno script personalizzato che usa twine per pubblicare i pacchetti.

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

È anche possibile usare Azure Pipelines per creare un'immagine dell'applicazione Python e inviarla a un registro dei container.