Erstellen von Python-Apps

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Sie können Azure Pipelines verwenden, um Python-Apps und -Skripts als Teil Ihres CI/CD-Systems zu erstellen, zu testen und bereitzustellen. Dieser Artikel konzentriert sich auf das Erstellen einer grundlegenden Pipeline.

Wenn Sie ein End-to-End-Lernprogramm benötigen, lesen Sie die Verwendung von CI/CD zum Bereitstellen einer Python-Web-App für Azure App Service unter Linux.

Informationen zum Erstellen und Aktivieren einer Anaconda-Umgebung und zum Installieren von Anaconda-Paketen finden condaSie unter Ausführen von Pipelines mit Anaconda-Umgebungen.

Erstellen Ihrer ersten Pipeline

Neu bei Azure Pipelines? Wenn ja, empfehlen wir Ihnen, diesen Abschnitt zu versuchen, bevor Sie zu anderen Abschnitten wechseln.

Abrufen des Codes

Importieren Sie dieses Repository in Ihr Git-Repo in Azure DevOps Server 2019:

Importieren Sie dieses Repository in Ihr Git-Repo:

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

Anmelden bei Azure Pipelines

Melden Sie sich bei Azure Pipelines an. Nach der Anmeldung wechselt Ihr Browser zu https://dev.azure.com/my-organization-name und zeigt Ihr Azure DevOps-Dashboard an.

Erstellen Sie in Ihrer ausgewählten Organisation ein Projekt. Sollten in Ihrer Organisation noch keine Projekte vorhanden sein, wird der Bildschirm Erstellen Sie als ersten Schritt ein Projekt. angezeigt. Wählen Sie andernfalls die Schaltfläche "Neue Project" in der oberen rechten Ecke des Dashboards aus.

Erstellen der Pipeline

  1. Melden Sie sich bei Ihrer Azure DevOps Organisation an, und wechseln Sie zu Ihrem Projekt.

  2. Navigieren Sie zu Pipelines, und wählen Sie Neue Pipeline aus.

  3. Führen Sie die Schritte des Assistenten aus. Dabei wählen Sie zuerst GitHub als Speicherort Ihres Quellcodes aus.

  4. Möglicherweise werden Sie zu GitHub weitergeleitet, um sich anzumelden. Geben Sie in diesem Fall Ihre Anmeldeinformationen für GitHub ein.

  5. Wenn die Liste der Repositorys angezeigt wird, wählen Sie Ihr Repository aus.

  6. Sie werden möglicherweise zu GitHub weitergeleitet, um die Azure Pipelines-App zu installieren. Wählen Sie in diesem Fall Genehmigen und installieren aus.

Wenn die Registerkarte "Konfigurieren " angezeigt wird, wählen Sie Python-Paket aus, um ein Python-Paket zu erstellen, das auf mehreren Python-Versionen getestet werden soll.

  1. Wenn Ihre neue Pipeline angezeigt wird, schauen Sie sich die YAML an, um zu sehen, was sie tut. Wenn Sie so weit sind, wählen Sie Speichern und ausführen aus.

    Save and run button in a new YAML pipeline

  2. Sie werden aufgefordert, eine neue Azure-pipelines.yml-Datei in Ihr Repository zu übernehmen. Nachdem Sie mit der Nachricht zufrieden sind, wählen Sie "Speichern" aus, und führen Sie sie erneut aus .

    Wenn Sie Ihre Pipeline in Aktion überwachen möchten, wählen Sie den Buildauftrag aus.

    Sie haben gerade eine Pipeline ausgeführt, die wir automatisch für Sie erstellt haben, da Ihr Code eine gute Übereinstimmung für die Python-Paketvorlage darstellt.

    Sie haben jetzt eine funktionierende YAML-Pipeline (azure-pipelines.yml) in Ihrem Repository, die sie anpassen können!

  3. Wenn Sie bereit sind, Änderungen an Ihrer Pipeline vorzunehmen, wählen Sie sie auf der Seite Pipelines aus, und bearbeiten Sie dann die azure-pipelines.yml Datei.

Lesen Sie weiter, um einige der gängigeren Methoden zum Anpassen Ihrer Pipeline zu erfahren.

YAML

  1. Fügen Sie eine azure-pipelines.yml Datei in Ihrem Repository hinzu. Passen Sie diesen Codeausschnitt für Ihren Build an.
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. Erstellen Sie eine Pipeline (wenn Sie nicht wissen, wie Sie ihre erste Pipeline erstellen) und wählen Sie YAML für die Vorlage aus.

  2. Legen Sie den Agentpool und den YAML-Dateipfad für Ihre Pipeline fest.

  3. Speichern Sie die Pipeline, und stellen Sie einen Build in die Warteschlange. Wenn die Meldung "Build #nnnnnnnn.n" in die Warteschlange gestellt wurde , wählen Sie den Nummernlink aus, um die Pipeline in Aktion anzuzeigen.

  4. Wenn Sie bereit sind, Änderungen an Ihrer Pipeline vorzunehmen, bearbeiten Sie sie.

Lesen Sie weiter, um einige der gängigeren Methoden zum Anpassen Ihrer Pipeline zu erfahren.

Buildumgebung

Sie müssen nichts für Azure Pipelines einrichten, um Python-Projekte zu erstellen. Python wird auf von Microsoft gehosteten Build-Agents für Linux, macOS oder Windows vorinstalliert. Informationen dazu, welche Python-Versionen vorinstalliert sind, finden Sie unter Verwenden eines von Microsoft gehosteten Agents.

Verwenden einer bestimmten Python-Version

Um eine bestimmte Version von Python in Ihrer Pipeline zu verwenden, fügen Sie die Aufgabe "Python-Version verwenden" zu azure-pipelines.yml hinzu. Dieser Codeausschnitt legt die Pipeline so fest, dass Python 3.6 verwendet wird:

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

Verwenden mehrerer Python-Versionen

Um eine Pipeline mit mehreren Python-Versionen auszuführen, z. B. zum Testen eines Pakets mit diesen Versionen, definieren Sie eine job mit einer matrix Python-Version. Legen Sie dann die UsePythonVersion Aufgabe fest, um auf die matrix Variable zu verweisen.

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

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

Ausführen von Python-Skripts

Wenn Sie Python-Skripts in 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 Inline-Python-Skripts mit der Python-Skriptaufgabe ausfü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 Ausführungsprozess zu übergeben. Sie können die Argumente mithilfe 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. Diese YAML installiert oder aktualisiert pip z. B. die und wheel die setuptools Pakete.

- 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.txtzu installieren:

- 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

Verwenden Sie diese YAML, um Linttests zu installieren oder zu aktualisieren flake8 und zu verwenden:

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

Testen mit Pytest und Sammeln von Abdeckungsmetriken mit pytest-cov

Verwenden Sie dieses YAML zum Installieren pytest und pytest-covAusführen von Tests, Ausgabetestergebnissen im JUnit-Format und zur Ausgabecodeabdeckung in 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 können 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 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:
      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'

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 Codeabdeckungsergebnissen

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

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

Packen und Übermitteln von Code

Zum Authentifizieren mit twine, verwenden Sie die Twine Authentication-Aufgabe , um Authentifizierungsanmeldeinformationen in der PYPIRC_PATH Umgebungsvariable 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 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 auch Azure Pipelines verwenden, um ein Image für Ihre Python-App zu erstellen und an eine Containerregistrierung zu übertragen.