Anpassen von Python für Azure Pipelines

Sie können Azure Pipelines verwenden, um Ihre Python-Apps zu erstellen, ohne eine eigene Infrastruktur einrichten zu müssen. Tools, die Sie häufig zum Erstellen, Testen und Ausführen von Python-Apps verwenden, werden auf von Microsoft gehosteten Agents in Azure Pipelines vorinstalliert.

Informationen zum Erstellen Ihrer ersten Pipeline mit Python finden Sie in der Python-Schnellstartanleitung.

Verwenden einer bestimmten Python-Version

Um eine bestimmte Version von Python in Ihrer Pipeline zu verwenden, fügen Sie azure-pipelines.yml die Aufgabe „Python-Version verwenden“ hinzu. Dieser Codeausschnitt legt die Pipeline so fest, 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.

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

Sie können Aufgaben hinzufügen, die mit jeder Python-Version in der Matrix ausgeführt werden.

Ausführen von Python-Skripts

Verwenden Sie zum Ausführen von Python-Skripts in Ihrem Repository ein script-Element, und geben Sie einen Dateinamen an. Beispiel:

- script: python src/example.py

Sie können auch Inline-Python-Skripts mit der Aufgabe „Python-Skript“ ausführen:

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

Um die Skriptausführung zu parametrisieren, verwenden Sie die PythonScript-Aufgabe mit arguments-Werten, um Argumente an den Ausführungsprozess 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. Beispielsweise installiert oder upgradet diese YAML pip und die Pakete setuptools und wheel.

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

Installationsanforderungen

Nachdem pip und die restlichen Elemente aktualisiert wurden, installieren Sie als Nächstes die Abhängigkeiten von requirements.txt:

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

Ausführen von Tests

Verwenden Sie Skripts, um verschiedene Tests in Ihrer Pipeline zu installieren und auszuführen.

Ausführen von Linttests mit flake8

Um flake8 zu installieren und upzugraden und zum Ausführen von Linttests zu verwenden, verwenden Sie folgenden YAML-Code:

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

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

Verwenden Sie diesen YAML-Code zum Installieren von pytest und pytest-cov, zum Ausführen von Tests, zum Ausgeben von Testergebnissen im JUnit-Format und von Code Coverage im Cobertura-XML-Format:

- 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. In diesem Beispiel wird tox -e py verwendet, um die Version von Python auszuführen, die 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 Code Coverage-Ergebnisse veröffentlichen hinzu, um Code Coverage-Ergebnisse auf dem Server zu veröffentlichen. Sie können Coverage-Metriken in der Buildzusammenfassung einsehen und HTML-Berichte zur weiteren Analyse herunterladen.

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

Packen und Übermitteln von Code

Verwenden Sie zur Authentifizierung bei twine die Aufgabe Twine-Authentifizierung, um Authentifizierungsanmeldeinformationen in der Umgebungsvariable PYPIRC_PATH zu speichern.

- 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 twine zum Veröffentlichen Ihrer Pakete verwendet.

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