Freigeben über


Verwenden von Azure Pipelines zum Erstellen und Bereitstellen einer Python Web-App für Azure App Service

Azure DevOps Services

In diesem Lernprogramm erfahren Sie, wie Sie Azure Pipelines für die kontinuierliche Integration und kontinuierliche Bereitstellung (CI/CD) verwenden, um eine Python-Web-App für Azure App Service unter Linux zu erstellen und bereitzustellen. Ihre Pipeline erstellt und stellt Ihre Python-Web-App automatisch in App Service bereit, wenn ein Commit für Ihr App-Code-Repository vorhanden ist.

In diesem Tutorial erfahren Sie:

  • Erstellen Sie eine Python-Web-App, und laden Sie sie in Azure App Service hoch.
  • Verbinden Sie Ihr Azure DevOps-Projekt mit Azure.
  • Erstellen Sie eine pythonspezifische Azure Pipelines-Build- und Bereitstellungspipeline für Ihre App.
  • Führen Sie die Pipeline aus, um Ihre Azure App Service-Web-App zu erstellen, zu testen und bereitzustellen.
  • Setzen Sie einen Trigger, um die Pipeline auszuführen, wenn Sie einen Commit in Ihrem Repository durchführen.

Weitere Informationen zu Azure-Pipelines-Konzepten sehen Sie sich das folgende Video an:

Voraussetzungen

Produkt Anforderungen
Azure DevOps - Ein Azure DevOps-Projekt.
– Eine Möglichkeit zum Ausführen von Pipelines auf von Microsoft gehosteten Agenten. Sie können entweder einen Parallelauftrag erwerben oder einen Free-Tarif anfordern.
- Grundkenntnisse in YAML und Azure Pipelines. Weitere Informationen finden Sie unter Erstellen Sie Ihre erste Pipeline.
- Berechtigungen:
     – Um eine Pipeline zu erstellen: Sie müssen sich in der Gruppe "Mitwirkende" befinden, und die Gruppe muss die Berechtigung "Erstellen einer Build-Pipeline" auf "Zulassen" gesetzt haben. Mitglieder der Gruppe "Projektadministratoren " können Pipelines verwalten.
    – Um Dienstverbindungen zu erstellen: Sie müssen über die Rolle "Administrator " oder " Ersteller " für Dienstverbindungen verfügen.
GitHub (Englisch) - Ein GitHub-Konto .
– Eine GitHub-Dienstverbindung zum Autorisieren von Azure Pipelines.
Azurblau Ein Azure-Abonnement.
Produkt Anforderungen
Azure DevOps - Ein Azure DevOps-Projekt.
– Ein selbst gehosteter Agent. Um einen zu erstellen, lesen Sie Selbst gehostete Agenten.
- Grundkenntnisse in YAML und Azure Pipelines. Weitere Informationen finden Sie unter Erstellen Sie Ihre erste Pipeline.
- Berechtigungen:
    – Um eine Pipeline zu erstellen: Sie müssen sich in der Gruppe "Mitwirkende" befinden, und die Gruppe muss die Berechtigung "Erstellen einer Build-Pipeline" auf "Zulassen" gesetzt haben. Mitglieder der Gruppe "Projektadministratoren " können Pipelines verwalten.
    – Um Dienstverbindungen zu erstellen: Sie müssen über die Rolle "Administrator " oder " Ersteller " für Dienstverbindungen verfügen.
GitHub (Englisch) - Ein GitHub-Konto .
– Eine GitHub-Dienstverbindung zum Autorisieren von Azure Pipelines.
Azurblau Ein Azure-Abonnement.

Konfigurieren eines selbst gehosteten Agenten

Das Herunterladen von Python-Versionen wird für selbst gehostete Build-Agents nicht unterstützt. Um Ihren eigenen selbst gehosteten Agent zu verwenden, müssen Sie den Agent für die Ausführung von Python konfigurieren.

Um Kompatibilitätsprobleme zu vermeiden, stimmen Sie in diesem Fall die Python-Version auf die Laufzeitversion Ihrer Web-App in Azure App Services 3.11 ab. Sie müssen die Python-Version vorinstallieren. Verwenden Sie das vollständige Installationsprogramm, um eine pip-kompatible Version von Python zu erhalten.

Die gewünschte Python-Version muss dem Toolcache im selbst gehosteten Agent hinzugefügt werden, damit die Pipelineaufgabe sie verwenden kann. Normalerweise befindet sich der Toolcache im Verzeichnis _work/_tool des Agents. Alternativ können Sie den Pfad mit der Umgebungsvariable AGENT_TOOLSDIRECTORYüberschreiben. Erstellen Sie unter dem Toolsverzeichnis die folgende Verzeichnisstruktur basierend auf Ihrer Python-Version:

$AGENT_TOOLSDIRECTORY/
    Python/
        {version number}/
            {platform}/
                {tool files}
            {platform}.complete

Die Versionsnummer sollte dem Format von 1.2.3 entsprechen. Die Plattform sollte entweder x86 oder x64 sein. Bei den tool-Dateien sollte es sich um die entpackten Python-Versionsdateien handeln. {platform}.complete sollte eine 0-Byte-Datei sein, die wie x86.complete oder x64.complete aussieht und nur bedeutet, dass das Tool ordnungsgemäß im Cache installiert ist.

Um beispielsweise Python 3.11 auf einem 64-Bit-Windows-Computer zu verwenden, erstellen Sie die folgende Verzeichnisstruktur:

$AGENT_TOOLSDIRECTORY/
    Python/
        3.11.4/
            x64/
                {python files}
            x64.complete

Wenn der Computer, auf dem Ihr Agent gehostet wird, bereits über die Python-Version verfügt, die Sie verwenden möchten, können Sie die Dateien in den Toolcache kopieren. Wenn Sie nicht über die Python-Version verfügen, können Sie sie von der Python-Website herunterladen.

Vorbereiten der Beispiel-App

  1. Forken Sie das Beispiel-Repository unter https://github.com/Microsoft/python-sample-vscode-flask-tutorial in Ihrem GitHub-Konto.

  2. Klonen Sie Ihren Fork auf Ihren lokalen Computer mit git clone <your-forked-repository-url>.git.

  3. Wechseln Sie zu Ihrem lokalen Klon mit cd python-sample-vscode-flask-tutorial, erstellen Sie die App und führen Sie sie lokal aus, um sicherzustellen, dass sie funktioniert.

    python -m venv .env
    source .env/Scripts/activate
    pip install --upgrade pip
    pip install -r ./requirements.txt
    export FLASK_APP=hello_app.webapp
    flask run
    
  4. Um die App zu testen, wechseln http://localhost:5000 Sie zu einem Browserfenster, und stellen Sie sicher, dass der Titel Visual Studio Flask Tutorial angezeigt wird.

  5. Schließen Sie das Browserfenster, und beenden Sie den Flask-Server mithilfe von STRG+C.

Erstellen und Bereitstellen der App Service-Web-App

Erstellen Sie Ihre Azure App Service-Web-App mithilfe von Cloud Shell im Azure-Portal. Um Cloud Shell zu verwenden, melden Sie sich beim Azure-Portal an, und wählen Sie die Cloud Shell-Schaltfläche auf der Symbolleiste aus.

Screenshot der Schaltfläche Azure Cloud Shell auf der Symbolleiste des Azure-Portals.

Die Cloud Shell wird am unteren Rand des Browsers angezeigt. Stellen Sie sicher, dass Bash im Dropdownmenü als Umgebung ausgewählt ist. Sie können das Cloud Shell-Fenster maximieren, um sich mehr Platz zu verschaffen.

Screenshot von Azure Cloud Shell.

Tipp

Um in Cloud Shell einzufügen, verwenden Sie STRG+UMSCHALT+V , oder klicken Sie mit der rechten Maustaste, und wählen Sie im Kontextmenü "Einfügen" aus.

Erstellen und Bereitstellen der Web-App

  1. Klonen Sie in Cloud Shell Ihr geforktes Repository nach Azure mit dem folgenden Befehl, und ersetzen Sie dabei <your-forked-repository-url> durch die URL Ihres geforkten Repositorys.

    git clone <your-forked-repository-url>
    
  2. Wechseln Sie in das Verzeichnis des geklonten Repositories.

    cd python-sample-vscode-flask-tutorial
    
  3. Führen Sie den Befehl az webapp up aus, um die App Service-Web-App bereitzustellen und das erste Deployment durchzuführen. Verwenden Sie den --name <your-web-app-name> Parameter, um einen eindeutigen Namen in Azure festzulegen, z. B. einen persönlichen oder Firmennamen zusammen mit einem App-Bezeichner, wie --name <your-name>-flaskpipelines. Die Ausführung az webapp up ohne Parameter weist einen zufällig generierten Web-App-Namen zu, der in Azure eindeutig ist.

    az webapp up --name <your-web-app-name>
    

Der az webapp up Befehl erkennt die App als Python-App und führt die folgenden Aktionen aus:

  1. Erstellt eine Standardressourcengruppe.
  2. Erstellt einen Standardmäßigen App Service-Plan.
  3. Erstellt eine Web-App mit dem zugewiesenen Namen. Die App URL lautet <your-web-app-name>.azurewebsites.net.
  4. Stellt alle Dateien aus dem aktuellen Arbeitsverzeichnis in einem ZIP-Archiv bereit, wobei die Buildautomatisierung aktiviert ist.
  5. Speichert die Parameter lokal in der AZURE/Config-Datei zwischen, sodass Sie diese beim Bereitstellen aus dem Projektordner mit az webapp up oder anderen az webapp Befehlen nicht erneut angeben müssen. Die Befehle verwenden die zwischengespeicherten Werte standardmäßig automatisch.

Sie können die Standardaktionen mit Ihren eigenen Werten überschreiben, indem Sie die Befehlsparameter verwenden. Weitere Informationen finden Sie unter az webapp up.

Der az webapp up Befehl erzeugt die folgende JSON-Ausgabe für die Beispielweb-App:

{
  "URL": <your-web-app-url>,
  "appserviceplan": <your-app-service-plan-name>,
  "location": <your-azure-region>,
  "name": <your-web-app-name>,
  "os": "Linux",
  "resourcegroup": <your-resource-group>,
  "runtime_version": "python|3.11",
  "runtime_version_detected": "-",
  "sku": <sku>,
  "src_path": <repository-source-path>
}

Notieren Sie die URL, resourcegroup, und runtime_version Werte, um sie später in diesem Lernprogramm zu verwenden.

Festlegen des Startbefehls

Die python-sample-vscode-flask-tutorial-App hat eine startup.txt-Datei, die den spezifischen Startbefehl für die Web-App enthält. Legen Sie die Eigenschaft startup-file der Web-App-Konfiguration auf startup.txt fest, indem Sie den folgenden Befehl mithilfe Ihrer Ressourcengruppe und der Namen Ihrer Web-App eingeben.

az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt

Nach Abschluss des Befehls zeigt die JSON-Ausgabe alle Konfigurationseinstellungen für Ihre Web-App an.

Um die ausgeführte App zu sehen, öffnen Sie einen Browser und gehen Sie zu URL (wird in der az webapp up Befehlsausgabe angezeigt). Wenn Sie eine generische Seite sehen, warten Sie ein paar Sekunden, bis App Service gestartet ist, und aktualisieren Sie dann die Seite. Stellen Sie sicher, dass der Titel des Visual Studio Flask-Lernprogramms angezeigt wird.

Verbinden Ihres Azure DevOps-Projekts mit Ihrem Azure-Abonnement

Um Azure Pipelines für die Bereitstellung in Ihrer Azure App Service-Web-App zu verwenden, müssen Sie Ihr Azure DevOps-Projekt mit Ihren Azure-Ressourcen verbinden.

Erstellen eines Dienstprinzipals

Ein Dienstprinzipal ist eine Identität, die für Anwendungen, gehostete Dienste und automatisierte Tools für den Zugriff auf Azure-Ressourcen erstellt wurde. Dieser Zugriff ist auf die Rollen beschränkt, die dem Dienstprinzipal zugewiesen sind, sodass Sie steuern können, auf welche Ebene auf welche Ressourcen zugegriffen werden kann.

Führen Sie zum Erstellen eines Dienstprinzipals den folgenden Befehl in der Bash Cloud Shell aus. Ersetzen Sie <service-principal-name> durch einen Namen für Ihren Dienstprinzipal, <your-subscription-id> durch Ihre Azure-Abonnement-ID und <your-resource-group> durch die Ressourcengruppe für die Web-App.

az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>

Der Befehl gibt das folgende JSON-Objekt zurück:

{
  "appId": "<client GUID>",
  "displayName": "<service-principal-name">,
  "password": "<password-string>",
  "tenant": "<tenant GUID>"
  ...
}

Notieren Sie sich die Werte der appId, password und tenantId, die für die Erstellung einer Dienstverbindung im nächsten Abschnitt verwendet werden sollen.

Erstellen einer Dienstverbindung

Eine Dienstverbindung bietet authentifizierten Zugriff von Azure-Pipelines auf externe und Remotedienste. Um sie in Ihrer Azure App Service-Web-App bereitzustellen, erstellen Sie eine Dienstverbindung mit der Ressourcengruppe für Ihre Web-App.

  1. Wählen Sie auf ihrer Azure DevOps-Projektseite Die Projekteinstellungen aus.

  2. Wählen Sie unter "Projekteinstellungen" die Option "Pipelines>Service connections" aus.

  3. Wählen Sie auf der Seite "Dienstverbindungen " die Option "Neue Dienstverbindung " oder " Dienstverbindung erstellen " aus, wenn diese Dienstverbindung der erste im Projekt ist.

    Screenshot der Auswahl von Pipelinedienstverbindungen in den Project-Einstellungen.

  4. Wählen Sie auf dem Bildschirm " Neue Dienstverbindung " azure Resource Manager und dann "Weiter" aus.

    Screenshot der Auswahl von Azure Resource Manager-Dienstverbindungen.

  5. Wählen Sie auf dem Bildschirm " Neue Azure-Dienstverbindung " Ihren Identitätstyp aus. In diesem Beispiel wird die App-Registrierung (automatisch) verwendet, die empfohlen wird. Weitere Informationen zu Authentifizierungsmethoden finden Sie unter Verbinden mit Azure über eine Azure Resource Manager-Dienstverbindung.

  6. Wählen Sie für Anmeldeinformationen, den Workload-Identitätsverbund (automatisch) aus.

  7. Füllen Sie die folgenden Felder aus:

    • Bereichsebene: Abonnement auswählen.
    • Abonnement: Wählen Sie Ihr Azure-Abonnement.
    • Ressourcengruppe: Wählen Sie die Ressourcengruppe aus, die Ihre Web-App enthält.
    • Dienstverbindungsname: Geben Sie einen beschreibenden Namen für die Verbindung ein.
    • Gewähren von Zugriffsberechtigungen für alle Pipelines: Aktivieren Sie dieses Kontrollkästchen, um Zugriff auf alle Pipelines im Projekt zu gewähren.
  8. Wählen Sie Speichern.

    Screenshot des Dialogfelds

  1. Wählen Sie auf ihrer Azure DevOps-Projektseite Die Projekteinstellungen aus.

  2. Wählen Sie unter "Projekteinstellungen" die Option "Pipelines>Service connections" aus.

  3. Wählen Sie auf der Seite "Dienstverbindungen " die Option "Neue Dienstverbindung " oder " Dienstverbindung erstellen " aus, wenn diese Dienstverbindung der erste im Projekt ist.

    Screenshot der Schaltfläche Projekteinstellungen auf dem Projekt-Dashboard.

  4. Wählen Sie auf dem Bildschirm " Neue Dienstverbindung " azure Resource Manager und dann "Weiter" aus.

    Screenshot, der die Auswahl des Azure Resource Managers zeigt.

  5. Wählen Sie den Dienstprinzipal (manuell) und dann "Weiter" aus.

    Screenshot, der die Auswahl einer Dienstprinzipal-Authentifizierungsmethode (manuell) zeigt.

  6. Füllen Sie auf dem Bildschirm " Neue Azure-Dienstverbindung " die folgenden Felder aus:

    • Umgebung: Wählen Sie Azure Cloud aus.
    • Bereichsebene: Abonnement auswählen.
    • Abonnement-ID: Geben Sie Ihre Azure-Abonnement-ID ein.
    • Abonnementname: Geben Sie Ihren Azure-Abonnementnamen ein.
  7. Füllen Sie im Abschnitt "Authentifizierung " die folgenden Felder aus:

    • Dienstprinzipal-ID: Geben Sie den appId vom az ad sp create-for-rbac Befehl zurückgegebenen Wert ein.
    • Anmeldeinformationen: Wählen Sie den Dienstprinzipalschlüssel aus.
    • Dienstprinzipalschlüssel: Geben Sie den Wert ein, der vom az ad sp create-for-rbac-Befehl zurückgegeben wurde.
    • Mandanten-ID: Geben Sie den tenant vom az ad sp create-for-rbac Befehl zurückgegebenen Wert ein.
    • Wählen Sie Überprüfen, um die Verbindung zu verifizieren.
  8. Geben Sie im Abschnitt "Details " unter "Dienstverbindungsname" einen Namen für die Dienstverbindung ein.

  9. Aktivieren Sie das Kontrollkästchen zum Erteilen von Zugriffsberechtigungen für alle Pipelines.

  10. Klicken Sie auf Verify and save.

    Screenshot des oberen Teils des neuen Dienstverbindungsbildschirms.

Die neue Verbindung wird in der Dienstverbindungsliste angezeigt und kann in Ihrer Pipeline verwendet werden.

Erstellen einer Pipeline

Erstellen Sie eine Pipeline, um Ihre Python-Web-App zu erstellen und in Azure App Service bereitzustellen.

  1. Wählen Sie im linken Navigationsmenü für Ihr Projekt Pipelines aus.

  2. Wählen Sie auf der Seite "Pipelines " die Option "Neue Pipeline" oder " Pipeline erstellen " aus, wenn diese Pipeline der erste im Projekt ist.

    Screenshot der Schaltfläche Neue Pipeline in der Pipeline-Liste.

  3. Wählen Sie auf dem Codebildschirm "Wo befindet sich Ihr Code " auf GitHub aus. Sie werden möglicherweise aufgefordert, sich bei GitHub anzumelden.

    Screenshot der Auswahl von GitHub als Speicherort ihres Codes.

  4. Wählen Sie auf dem "Repository auswählen"-Bildschirm Ihr geforktes Beispiel-Repository aus. GitHub fordert Sie möglicherweise erneut auf, Ihr GitHub-Kennwort einzugeben oder die GitHub-App von Azure Pipelines zu installieren. Folgen Sie den Anweisungen auf dem Bildschirm, um die App zu installieren. Weitere Informationen finden Sie unter GitHub-App-Authentifizierung.

    Screenshot der Auswahl des Repositorys.

  5. Wählen Sie auf der Seite "Pipeline konfigurieren"die Option "Python to Linux Web App" in Azure aus.

  6. Wählen Sie auf dem nächsten Bildschirm Ihr Azure-Abonnement und dann "Weiter" aus.

  7. Wählen Sie auf dem nächsten Bildschirm Ihre Azure Web App aus, und wählen Sie "Überprüfen und Konfigurieren" aus.

Azure Pipelines erstellt eine azure-pipelines.yml Datei und zeigt sie im YAML-Pipeline-Editor an.

  1. Wählen Sie im linken Navigationsmenü für Ihr Projekt Pipelines aus.

  2. Wählen Sie auf der Seite "Pipelines " die Option "Neue Pipeline" oder " Pipeline erstellen " aus, wenn diese Pipeline der erste im Projekt ist.

    Screenshot der Schaltfläche Neue Pipeline in der Pipeline-Liste.

  3. Wählen Sie auf der Seite "Wo ist Ihre Codeseite" die Option "GitHub Enterprise Server" aus. Sie werden möglicherweise aufgefordert, sich bei GitHub anzumelden.

    Screenshot der Auswahl von GitHub als Speicherort für Ihren Code.

  4. Wählen Sie auf der Registerkarte Repository auswählen Ihr geforktes Beispiel-Repository aus. GitHub fordert Sie möglicherweise erneut auf, Ihr GitHub-Kennwort einzugeben oder die GitHub-Erweiterung oder -App von Azure Pipelines zu installieren. Folgen Sie den Anweisungen auf dem Bildschirm, um die App zu installieren. Weitere Informationen finden Sie unter Zugriff auf GitHub-Repositorys.

    Screenshot der Auswahl des Repositorys.

  5. Wählen Sie auf der Seite "Pipeline konfigurieren" die Option "Startpipeline" aus.

  6. Ersetzen Sie auf der Seite "YaML überprüfen" den Inhalt der Startdatei azure-pipelines.yml durch die folgende YAML-Pipelinedatei. In der YAML-Datei:

    • Ersetzen Sie die Platzhalter <your-service-connection-name> und <your-web-app-name> durch Ihre eigenen Werte.

    • Ersetzen Sie den <your-pool-name> Namen des Agentpools, den Sie verwenden möchten, und ersetzen Sie sie <your-python-version> durch die Version von Python, die auf Ihrem Agent ausgeführt wird. Diese Version sollte mit der runtime_version JSON-Ausgabe des az webapp up Befehls übereinstimmen.

YAML-Pipeline-Datei

Schauen Sie sich auf der Seite "Überprüfen der YAML-Pipeline" die Pipeline an, um zu verstehen, was sie macht. Stellen Sie sicher, dass alle Standardeingaben für Ihren Code geeignet sind. Informationen zum YaML-Pipelinedateischema finden Sie in der YAML-Schemareferenz.

Das folgende vollständige Beispiel für die YAML-Pipelinedatei definiert Ihre CI/CD-Pipeline als eine Reihe von Phasen, Aufträgen und Schritten, wobei jeder Schritt die Details für verschiedene Aufgaben und Skripts enthält. Der generierte YAML-Code füllt die Platzhalter automatisch mit Werten für Ihre App und Verbindung auf.

trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '<GUID>'

  # Web app name
  webAppName: '<your-webapp-name>'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

  # Environment name
  environmentName: '<your-webapp-name>'

  # Project root folder. Point to the folder containing manage.py file.
  projectRoot: $(System.DefaultWorkingDirectory)

  pythonVersion: '3.11'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
    pool:
      vmImage: $(vmImageName)
    steps:
    - task: UsePythonVersion@0
      inputs:
        versionSpec: '$(pythonVersion)'
      displayName: 'Use Python $(pythonVersion)'

    - script: |
        python -m venv antenv
        source antenv/bin/activate
        python -m pip install --upgrade pip
        pip install setuptools
        pip install -r requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
      displayName: 'Upload package'
      artifact: drop

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: UsePythonVersion@0
            inputs:
              versionSpec: '$(pythonVersion)'
            displayName: 'Use Python version'

          - task: AzureWebApp@1
            displayName: 'Deploy Azure Web App : $(webAppName)'
            inputs:
              azureSubscription: $(azureServiceConnectionId)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
trigger:
- main

variables:
  # Azure Resource Manager connection created during pipeline creation
  azureServiceConnectionId: '<your-service-connection-name>'

  # Web app name
  webAppName: '<your-web-app-name>'

  # Environment name
  environmentName: '<your-web-app-name>'

  # Project root folder. 
  projectRoot: $(System.DefaultWorkingDirectory)

  # Python version: 
  pythonVersion: '<your-python-version>'

stages:
- stage: Build
  displayName: Build stage
  jobs:
  - job: BuildJob
pool:
      name: '<your-pool-name>'
      demands: python
    steps:
    - task: UsePythonVersion@0
      inputs:
        versionSpec: '$(pythonVersion)'
      displayName: 'Use Python $(pythonVersion)'

    - script: |
        python -m venv antenv
        source antenv/bin/activate
        python -m pip install --upgrade pip
        pip install -r requirements.txt
      workingDirectory: $(projectRoot)
      displayName: "Install requirements"

    - task: ArchiveFiles@2
      displayName: 'Archive files'
      inputs:
        rootFolderOrFile: '$(projectRoot)'
        includeRootFolder: false
        archiveType: zip
        archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
        replaceExistingArchive: true

    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        publishLocation: 'Container'

- stage: Deploy
  displayName: 'Deploy Web App'
  dependsOn: Build
  condition: succeeded()
  jobs:
  - deployment: DeploymentJob
    pool:
      name: '<your-pool-name'
    environment: $(environmentName)
    strategy:
      runOnce:
        deploy:
          steps:

          - task: UsePythonVersion@0
            inputs:
              versionSpec: '$(pythonVersion)'
            displayName: 'Use Python version'

          - task: AzureWebApp@1
            displayName: 'Deploy Azure Web App : <your-web-app-name>'
            inputs:
              azureSubscription: $(azureServiceConnectionId)
              appName: $(webAppName)
              package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
              startUpCommand: 'startup.txt'

Variablen

Der variables Abschnitt am Anfang der YAML-Datei definiert die folgenden Variablen:

Variable Beschreibung
azureServiceConnectionId Die ID der Azure Resource Manager-Dienstverbindung.
webAppName Der Name der App Service-Web-App.
vmImageName Der Name des Betriebssystems, das für den Build-Agent verwendet werden soll.
environmentName Der Name der Umgebung, in die bereitgestellt werden soll und die automatisch erstellt wird, wenn der Bereitstellungsjob ausgeführt wird.
projectRoot Der Root-Ordner, der den Code der App enthält.
pythonVersion Die Python-Version, die für die Build- und Bereitstellungs-Agenten verwendet werden soll.
Variable Beschreibung
azureServiceConnectionId Die ID der Azure Resource Manager-Dienstverbindung.
webAppName Der Name der App Service-Web-App.
environmentName Der Name der Umgebung, zu der bereitgestellt werden soll und die bei Ausführung des Bereitstellungsauftrags automatisch erstellt wird.
projectRoot Der Ordner, der den Code der App enthält. Der Wert ist eine automatische Systemvariable.
pythonVersion Die Python-Version, die für die Build- und Bereitstellungs-Agenten verwendet werden soll.

Erstellungs- und Bereitstellungsphasen

Die Pipeline besteht aus Erstellungs- und Implementierungsphasen.

Buildphase

Die Buildphase enthält einen einzelnen Auftrag, der auf dem betriebssystem ausgeführt wird, das in der vmImageName Variablen definiert ist, in diesem Fall ubuntu-latest.

  - job: BuildJob
    pool:
      vmImage: $(vmImageName)

Die Buildphase enthält einen einzelnen Job, der auf einem Agent im pool durch den name Parameter identifiziert ausgeführt wird.

Sie können die Funktionalitäten des Agenten mit dem Schlüsselwort demands angeben. So gibt demands: python beispielsweise an, dass der Agent Python installiert haben muss. Um einen selbst gehosteten Agenten nach Namen anzugeben, können Sie demands: Agent.Name -equals <agent-name> verwenden.

  - job: BuildJob
    pool:
      name: <your-pool-name>
      demands: python

Der Job enthält mehrere Schritte:

  1. Zuerst wählt die UsePythonVersion-Aufgabe die zu verwendende Version von Python aus, wie in der pythonVersion Variablen definiert.

       - task: UsePythonVersion@0
          inputs:
            versionSpec: '$(pythonVersion)'
            displayName: 'Use Python $(pythonVersion)'
    
  2. Im nächsten Schritt wird ein Skript verwendet, das eine virtuelle Python-Umgebung erstellt und die Abhängigkeiten der App aus requirements.txtinstalliert. Der workingDirectory Parameter gibt den Speicherort des App-Codes an.

       - script: |
            python -m venv antenv
            source antenv/bin/activate
            python -m pip install --upgrade pip
            pip install setuptools
            pip install  -r ./requirements.txt
          workingDirectory: $(projectRoot)
          displayName: "Install requirements"
    
  3. Mit der Aufgabe "ArchiveFiles " wird ein ZIP-Archiv erstellt, das die integrierte Web-App enthält.

        - task: ArchiveFiles@2
          displayName: 'Archive files'
          inputs:
            rootFolderOrFile: '$(projectRoot)'
            includeRootFolder: false
            archiveType: zip
            archiveFile: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
            replaceExistingArchive: true
    

    Die Parameter werden wie folgt festgelegt:

    Parameter Beschreibung
    rootFolderOrFile Der Speicherort des Codes der App.
    includeRootFolder Gibt an, ob der Stammordner in die .zip-Datei eingeschlossen werden soll. Auf false festlegen. Wenn dieser Wert festgelegt ist true, werden die Inhalte der .zip-Datei in einem Ordner mit dem Namen "s" abgelegt, und die Aufgabe kann den App-Code nicht finden.
    archiveType Der Typ des zu erstellenden Archivs. Auf zip festlegen.
    archiveFile Der Speicherort der zu erstellenden ZIP-Datei.
    replaceExistingArchive Gibt an, ob ein vorhandenes Archiv ersetzt werden soll, wenn die Datei bereits existiert. Auf true festlegen.
  4. Die .zip Datei lädt dann als Artefakt mit dem Namen dropin die Pipeline hoch. In der Bereitstellungsphase wird die .zip Datei zum Bereitstellen der App verwendet.

        - upload: $(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip
          displayName: 'Upload package'
          artifact: drop
    
    • Der upload Parameter legt den Speicherort und den Namen der .zip Datei fest, die hochgeladen werden soll.
    • Der artifact Parameter legt den Namen des erstellten Artefakts auf drop.

Bereitstellungsphase

Die Bereitstellungsphase wird ausgeführt, wenn die Buildphase erfolgreich abgeschlossen ist. Die Schlüsselwörter dependsOn und condition definieren das Verhalten.

  dependsOn: Build
  condition: succeeded()

Die Bereitstellungsphase enthält einen einzelnen Bereitstellungsauftrag, der wie folgt konfiguriert ist.

  - deployment: DeploymentJob
    pool:
      vmImage: $(vmImageName)
    environment: $(environmentName)
  • Das deployment Schlüsselwort kennzeichnet, dass der Auftrag ein Bereitstellungsauftrag ist, der auf eine Umgebung abzielt, um dorthin bereitzustellen. Das environment wird automatisch in Ihrem Projekt erstellt, wenn der Auftrag ausgeführt wird.

  • Der pool Parameter gibt den Bereitstellungs-Agent-Pool an und verwendet den Standard-Agent-Pool, wenn name kein Parameter angegeben ist. Der Agent wird auf dem betriebssystem ausgeführt, das in der vmImageName Variablen definiert ist, in diesem Fall ubuntu-latest.

  - deployment: DeploymentJob
    pool:
      name: <your-pool-name>
    environment: $(environmentName)
  • Das deployment Schlüsselwort gibt an, dass der Auftrag ein Bereitstellungsauftrag ist, der auf eine Umgebung zur Bereitstellung abzielt. Das environment wird automatisch in Ihrem Projekt erstellt, wenn der Auftrag ausgeführt wird.

  • Der pool Parameter gibt den Bereitstellungs-Agent-Pool an und muss einen Agent mit der Funktion zum Ausführen der in der Pipeline angegebenen Python-Version enthalten.

Das strategy Schlüsselwort definiert die Bereitstellungsstrategie.

  strategy:
    runOnce:
      deploy:
        steps:
  • Das Schlüsselwort runOnce legt fest, dass der Bereitstellungs-Job einmal ausgeführt wird.
  • Das deploy-Schlüsselwort legt fest, was im steps-Bereitstellungsauftrag ausgeführt werden soll.

In steps dieser Phase werden die folgenden Aufgaben ausgeführt:

  1. UsePythonVersion@0 wählt die zu verwendende Python-Version aus, wie in der Buildphase.
  2. AzureWebApp@1 stellt die Web-App und das drop ZIP-Artefakt bereit.
- task: AzureWebApp@1
    displayName: 'Deploy Azure Web App : <your-web-app-name>'
  inputs:
    azureSubscription: $(azureServiceConnectionId)
    appName: $(webAppName)
    package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
  • Der azureSubscription-Parameter enthält die in den Pipelinevariablen angegebene azureServiceConnectionId.
  • Der appName enthält den Wert der webAppName-Variablen.
  • Der package gibt den Namen und den Speicherort der .zip-Datei an, die bereitgestellt werden soll.

Da das Python-vscode-flask-tutorial-Repository den App-Startbefehl in einer Datei mit dem Namen startup.txtenthält, können Sie den App-Startbefehl durch Hinzufügen des Parameters angeben: startUpCommand: 'startup.txt'

Führen Sie die Pipeline aus.

Sie sind jetzt bereit, die Pipeline auszuprobieren.

  1. Wählen Sie im Pipeline-Editor "Speichern" und "Ausführen" aus.

  2. Fügen Sie auf dem Bildschirm "Speichern und Ausführen " bei Bedarf eine Commit-Nachricht hinzu, und wählen Sie dann "Speichern" und "Ausführen" aus.

    Sie können den Pipelinelauf beobachten, indem Sie die Phasen oder Aufträge auf der Übersichtsseite der Pipeline auswählen. Jeder Auftrag und jede Phase zeigt ein grünes Häkchen an, sobald sie erfolgreich abgeschlossen wurde. Wenn Fehler auftreten, werden sie in der Zusammenfassung oder in den Auftragsschritten angezeigt.

    Screenshot der Pipeline-Ausführung in der Zusammenfassung der Phasen.

    Sie können schnell zum YAML-Editor zurückkehren, indem Sie die vertikalen Punkte oben rechts auf der Seite " Zusammenfassung " und " Pipeline bearbeiten" auswählen.

    Screenshot des Kommentars zum Bearbeiten der Pipeline aus einem Build-Bericht.

  3. Wählen Sie im Bereitstellungs-Job die Aufgabe Azure-Web-App bereitstellen, um die Ausgabe anzuzeigen.

    Screenshot der Pipeline-Phasenschritte.

  4. Wählen Sie aus dem Ausgabeergebnis die URL nach der App-Dienstanwendungs-URL aus. Die App sollte wie folgt angezeigt werden:

    Screenshot der Ansicht der Beispiel-App, die in App Service ausgeführt wird.

Hinweis

Wenn eine App-Bereitstellung aufgrund einer fehlenden Abhängigkeit fehlschlägt, wurde die requirements.txt Datei während der Bereitstellung nicht verarbeitet. Dieses Problem kann auftreten, wenn Sie die Web-App direkt im Portal erstellen, anstatt den az webapp up Befehl zu verwenden.

Der az webapp up-Befehl legt die Buildaktion SCM_DO_BUILD_DURING_DEPLOYMENT speziell auf true fest. Wenn Sie einen App-Dienst über das Portal bereitstellen, wird diese Aktion nicht automatisch festgelegt.

So richten Sie diese Aktion ein:

  1. Wählen Sie auf der Portalseite für Ihre Web-App im linken Navigationsmenü die Option "Konfiguration" aus.
  2. Wählen Sie auf der Registerkarte "Anwendungseinstellungen " die Option "Neue Anwendungseinstellung" aus.
  3. Legen Sie im daraufhin angezeigten Popup Name auf SCM_DO_BUILD_DURING_DEPLOYMENT fest, legen Sie Wert auf true fest, und wählen Sie dann OK aus.
  4. Klicken Sie oben auf der Seite Konfiguration auf Speichern.
  5. Erneutes Ausführen der Pipeline Die Abhängigkeiten sollten jetzt während der Bereitstellung installiert werden.

Auslösen einer Pipelineausführung

Diese Pipeline wird so konfiguriert, dass sie immer dann ausgeführt wird, wenn eine Änderung im Code-Repository eingecheckt wird. Um einen Pipeline-Durchlauf zu starten, übertragen Sie eine Änderung im Repository. Sie können zum Beispiel eine neue Funktion zur App hinzufügen oder die Abhängigkeiten der App aktualisieren.

  1. Wechseln Sie zum GitHub-Repository für Ihre App.
  2. Nehmen Sie eine Änderung am Code vor, wie z. B. die Änderung des Titels der App.
  3. Führen Sie für die Änderung einen Commit aus.
  4. Wechseln Sie zu Ihrer Pipeline, und stellen Sie sicher, dass ein neuer Pipeline-Durchlauf erstellt und ausgeführt wird.
  5. Überprüfen Sie nach Abschluss der Ausführung, ob die Änderung auf Ihre Web-App bereitgestellt wurde.
  6. Wechseln Sie im Azure-Portal zu Ihrer Web-App, und wählen Sie im linken Navigationsmenü das Bereitstellungscenter aus.
  7. Wählen Sie die Registerkarte "Protokolle " aus, und stellen Sie sicher, dass die neue Bereitstellung aufgeführt ist.

Bereitstellen von Django-Apps im App-Dienst

Sie können Azure Pipelines verwenden, um Django-Apps auf App Service unter Linux bereitzustellen, wenn Sie eine separate Datenbank verwenden. Sie können keine SQLite-Datenbank verwenden, da App Service die Datei db.sqlite3 sperrt und damit sowohl Lese- als auch Schreibvorgänge verhindert. Dieses Verhalten wirkt sich nicht auf externe Datenbanken aus.

Wie im Containerstartprozess erläutert, sucht App Service automatisch in Ihrem App-Code nach einer wsgi.py Datei, die normalerweise das App-Objekt enthält. Wenn Sie den Startbefehl anpassen möchten, verwenden Sie den startUpCommand Parameter im AzureWebApp@1 Schritt Ihrer YAML-Pipelinedatei.

Wenn Sie Django verwenden, möchten Sie die Datenmodelle typischerweise mit manage.py migrate nach der Bereitstellung des App-Codes migrieren. Zu diesem Zweck können Sie startUpCommand mit einem Bereitstellungsskript hinzufügen. Dies ist beispielsweise die startUpCommand-Eigenschaft in der Aufgabe AzureWebApp@1.

  - task: AzureWebApp@1
      displayName: 'Deploy Azure Web App : $(webAppName)'
      inputs:
        azureSubscription: $(azureServiceConnectionId)
        appName: $(webAppName)
        package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
        startUpCommand: 'python manage.py migrate'

Ausführen von Tests für den Build-Agent

Als Teil Ihres Build-Prozesses möchten Sie vielleicht Tests für Ihren App-Code ausführen. Tests werden auf dem Build-Agent ausgeführt, daher müssen Sie Ihre Abhängigkeiten in einer virtuellen Umgebung auf dem Build-Agent installieren. Löschen Sie nach ausführung der Tests die virtuelle Testumgebung, bevor Sie die .zip Datei für die Bereitstellung erstellen.

Die folgenden Skriptelemente veranschaulichen diesen Prozess. Platzieren Sie sie vor der Aufgabe ArchiveFiles@2 in der Datei azure-pipelines.yml. Weitere Informationen finden Sie unter Ausführen plattformübergreifender Skripts.

# The | symbol is a continuation character, indicating a multi-line script.
# A single-line script can immediately follow "- script:".
- script: |
    python -m venv .env
    source .env/bin/activate
    pip install setuptools
    pip install -r requirements.txt

  # The displayName shows in the pipeline UI when a build runs
  displayName: 'Install dependencies on build agent'

- script: |
    # Put commands to run tests here
    displayName: 'Run tests'

- script: |
    echo Deleting .env
    deactivate
    rm -rf .env
  displayName: 'Remove .env before zip'

Sie können auch eine Aufgabe wie PublishTestResults@2 verwenden, um die Testergebnisse in Ihrer Pipeline zu veröffentlichen. Weitere Informationen finden Sie unter Ausführen von Tests.

Bereinigen von Ressourcen

Wenn Sie mit den Azure-Ressourcen fertig sind, die Sie in diesem Lernprogramm erstellt haben, löschen Sie sie, um weitere Gebühren zu vermeiden.

  • Löschen Sie das von Ihnen erstellte Azure DevOps-Projekt. Durch das Löschen des Projekts werden die Pipeline und die Dienstverbindung gelöscht.
  • Löschen Sie die Azure-Ressourcengruppe, die App Service und den App Service-Plan enthält. Gehen Sie im Azure-Portal zu der Ressourcengruppe, wählen Sie Ressourcengruppe löschen, und folgen Sie den Anweisungen.
  • Löschen Sie das Azure-Speicherkonto, das das Cloud Shell-Dateisystem verwaltet. Schließen Sie Cloud Shell, und suchen Sie dann die Ressourcengruppe, die mit cloud-shell-storage beginnt. Wählen Sie " Ressourcengruppe löschen" aus, und folgen Sie den Anweisungen.