Anpassen von Python-Pipelines

In diesem Artikel wird beschrieben, wie Sie Das Erstellen, Testen, Verpacken und Bereitstellen von Python-Apps und -Code in Azure-Pipelines anpassen. Informationen zum Erstellen Ihrer ersten Pipeline mit Python finden Sie in der Python-Schnellstartanleitung.

Mit von Microsoft gehosteten Agents in Azure Pipelines können Sie Ihre Python-Apps erstellen, ohne Ihre eigene Infrastruktur einrichten zu müssen. Tools, die Sie häufig zum Erstellen, Testen und Ausführen von Python-Apps verwenden, einschließlich pip, sind vorinstalliert.

Möglicherweise müssen Sie die kostenlose Gewährung paralleler Aufträge anfordern oder einen parallelen Auftrag erwerben, um Ihre Pipelines auszuführen.

Zum Erstellen von Python-Apps mit Azure Pipelines benötigen Sie einen selbst gehosteten Agent , auf dem Python installiert ist. Informationen zum Installieren von Python auf Ihrem Agent finden Sie unter UsePythonVersion.

Verwenden einer bestimmten Python-Version

Um eine bestimmte Version von Python in Ihrer Pipeline zu verwenden, fügen Sie die Aufgabe "Python-Version verwenden" zum azure-pipelines.yml hinzu. Im folgenden Beispiel für die YAML-Pipelinedefinition wird die Pipeline so festgelegt, dass Python 3.11 verwendet wird.

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

Verwenden mehrerer Python-Versionen

Um eine Pipeline mit mehreren Python-Versionen auszuführen, z. B. um ein Paket mit diesen Versionen zu testen, definieren Sie einen job mit einer matrix der Python-Versionen. Legen Sie dann die UsePythonVersion-Aufgabe fest, um auf die Variable matrix zu verweisen. Zum Beispiel:

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

Sie können Aufgaben hinzufügen, die jede Python-Version in der Matrix verwenden.

Ausführen von Python-Skripts

Wenn Sie Python-Skripts aus Ihrem Repository ausführen möchten, verwenden Sie ein script Element, und geben Sie einen Dateinamen an. Zum Beispiel:

- script: python src/example.py

Sie können auch die Python-Skriptaufgabe verwenden, um Inline-Python-Skripts auszuführen.

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

Verwenden Sie zum Parametrisieren der Skriptausführung die PythonScript Aufgabe mit arguments Werten, um Argumente an den ausgeführten Prozess zu übergeben. Sie können die Argumente mithilfe von sys.argv oder der komplexeren argparse-Bibliothek analysieren.

- 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

Installieren von Abhängigkeiten

Sie können Skripts verwenden, um bestimmte PyPI-Pakete mit pip zu installieren. Das folgende Beispiel installiert oder aktualisiert pip und die setuptools Pakete wheel .

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

Installationsanforderungen

Nach dem Aktualisieren pip und Freunden besteht ein typischer nächster Schritt darin, Abhängigkeiten von requirements.txt zu installieren.

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

Tests durchführen

Sie können Skripts verwenden, um verschiedene Tests in Ihrer Pipeline zu installieren und auszuführen.

Ausführen von Linttests mit flake8

Der folgende YAML-Code installiert oder aktualisiert flake8 und verwendet ihn zum Ausführen von Linttests.

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

Testen mit Pytest und Sammeln von Abdeckungsmetriken mit „pytest-cov“

Der folgende YAML-Code installiert pytest und pytest-cov führt Tests aus, gibt Testergebnisse im JUnit-Format aus und gibt Codeabdeckungsergebnisse im Cobertura-XML-Format aus.

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

Ausführen von Tests mit Tox

Azure Pipelines kann parallele Tox-Testaufträge ausführen, um die Arbeit aufzuteilen. Auf einem Entwicklungscomputer müssen Sie Ihre Testumgebungen in Serie ausführen. Im folgenden Beispiel wird verwendet tox -e py , um auszuführen, welche Version von Python für den aktuellen Auftrag aktiv ist.

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

Testergebnisse veröffentlichen

Fügen Sie die Aufgabe Testergebnisse veröffentlichen hinzu, um JUnit- oder xUnit-Testergebnisse auf dem Server zu veröffentlichen.

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

Veröffentlichen von Code Coverage-Ergebnissen

Fügen Sie die Aufgabe zum Veröffentlichen von Codeabdeckungsergebnissen hinzu, um Codeabdeckungsergebnisse auf dem Server zu veröffentlichen. Sie können Abdeckungsmetriken in der Buildzusammenfassung anzeigen und HTML-Berichte zur weiteren Analyse herunterladen.

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

Packen und Übermitteln von Code

Verwenden Sie zum Authentifizieren mit twineder Python Twine Upload-Authentifizierungsaufgabe die Authentifizierungsanmeldeinformationen in der PYPIRC_PATH Umgebungsvariable.

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

Fügen Sie dann ein benutzerdefiniertes Skript hinzu, das zum Veröffentlichen Ihrer Pakete verwendet twine wird.

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

Sie können Azure Pipelines auch verwenden, um ein Image für Ihre Python-App zu erstellen und es in eine Containerregistrierung zu pushen.