Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Forken Sie das Beispiel-Repository unter https://github.com/Microsoft/python-sample-vscode-flask-tutorial in Ihrem GitHub-Konto.
Klonen Sie Ihren Fork auf Ihren lokalen Computer mit
git clone <your-forked-repository-url>.git.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 runUm 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.
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.
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.
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
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>Wechseln Sie in das Verzeichnis des geklonten Repositories.
cd python-sample-vscode-flask-tutorialFü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ührungaz webapp upohne 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:
- Erstellt eine Standardressourcengruppe.
- Erstellt einen Standardmäßigen App Service-Plan.
-
Erstellt eine Web-App mit dem zugewiesenen Namen. Die App
URLlautet<your-web-app-name>.azurewebsites.net. - Stellt alle Dateien aus dem aktuellen Arbeitsverzeichnis in einem ZIP-Archiv bereit, wobei die Buildautomatisierung aktiviert ist.
- Speichert die Parameter lokal in der AZURE/Config-Datei zwischen, sodass Sie diese beim Bereitstellen aus dem Projektordner mit
az webapp upoder anderenaz webappBefehlen 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.
Wählen Sie auf ihrer Azure DevOps-Projektseite Die Projekteinstellungen aus.
Wählen Sie unter "Projekteinstellungen" die Option "Pipelines>Service connections" aus.
Wählen Sie auf der Seite "Dienstverbindungen " die Option "Neue Dienstverbindung " oder " Dienstverbindung erstellen " aus, wenn diese Dienstverbindung der erste im Projekt ist.
Wählen Sie auf dem Bildschirm " Neue Dienstverbindung " azure Resource Manager und dann "Weiter" aus.
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.
Wählen Sie für Anmeldeinformationen, den Workload-Identitätsverbund (automatisch) aus.
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.
Wählen Sie Speichern.
Wählen Sie auf ihrer Azure DevOps-Projektseite Die Projekteinstellungen aus.
Wählen Sie unter "Projekteinstellungen" die Option "Pipelines>Service connections" aus.
Wählen Sie auf der Seite "Dienstverbindungen " die Option "Neue Dienstverbindung " oder " Dienstverbindung erstellen " aus, wenn diese Dienstverbindung der erste im Projekt ist.
Wählen Sie auf dem Bildschirm " Neue Dienstverbindung " azure Resource Manager und dann "Weiter" aus.
Wählen Sie den Dienstprinzipal (manuell) und dann "Weiter" aus.
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.
Füllen Sie im Abschnitt "Authentifizierung " die folgenden Felder aus:
-
Dienstprinzipal-ID: Geben Sie den
appIdvomaz ad sp create-for-rbacBefehl 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
tenantvomaz ad sp create-for-rbacBefehl zurückgegebenen Wert ein. - Wählen Sie Überprüfen, um die Verbindung zu verifizieren.
-
Dienstprinzipal-ID: Geben Sie den
Geben Sie im Abschnitt "Details " unter "Dienstverbindungsname" einen Namen für die Dienstverbindung ein.
Aktivieren Sie das Kontrollkästchen zum Erteilen von Zugriffsberechtigungen für alle Pipelines.
Klicken Sie auf Verify and save.
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.
Wählen Sie im linken Navigationsmenü für Ihr Projekt Pipelines aus.
Wählen Sie auf der Seite "Pipelines " die Option "Neue Pipeline" oder " Pipeline erstellen " aus, wenn diese Pipeline der erste im Projekt ist.
Wählen Sie auf dem Codebildschirm "Wo befindet sich Ihr Code " auf GitHub aus. Sie werden möglicherweise aufgefordert, sich bei GitHub anzumelden.
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.
Wählen Sie auf der Seite "Pipeline konfigurieren"die Option "Python to Linux Web App" in Azure aus.
Wählen Sie auf dem nächsten Bildschirm Ihr Azure-Abonnement und dann "Weiter" aus.
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.
Wählen Sie im linken Navigationsmenü für Ihr Projekt Pipelines aus.
Wählen Sie auf der Seite "Pipelines " die Option "Neue Pipeline" oder " Pipeline erstellen " aus, wenn diese Pipeline der erste im Projekt ist.
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.
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.
Wählen Sie auf der Seite "Pipeline konfigurieren" die Option "Startpipeline" aus.
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 derruntime_versionJSON-Ausgabe desaz webapp upBefehls ü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:
Zuerst wählt die UsePythonVersion-Aufgabe die zu verwendende Version von Python aus, wie in der
pythonVersionVariablen definiert.- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)'Im nächsten Schritt wird ein Skript verwendet, das eine virtuelle Python-Umgebung erstellt und die Abhängigkeiten der App aus
requirements.txtinstalliert. DerworkingDirectoryParameter 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"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: trueDie Parameter werden wie folgt festgelegt:
Parameter Beschreibung rootFolderOrFileDer Speicherort des Codes der App. includeRootFolderGibt an, ob der Stammordner in die .zip-Datei eingeschlossen werden soll. Auf falsefestlegen. Wenn dieser Wert festgelegt isttrue, werden die Inhalte der .zip-Datei in einem Ordner mit dem Namen "s" abgelegt, und die Aufgabe kann den App-Code nicht finden.archiveTypeDer Typ des zu erstellenden Archivs. Auf zipfestlegen.archiveFileDer Speicherort der zu erstellenden ZIP-Datei. replaceExistingArchiveGibt an, ob ein vorhandenes Archiv ersetzt werden soll, wenn die Datei bereits existiert. Auf truefestlegen.Die
.zipDatei lädt dann als Artefakt mit dem Namendropin 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
uploadParameter legt den Speicherort und den Namen der .zip Datei fest, die hochgeladen werden soll. - Der
artifactParameter legt den Namen des erstellten Artefakts aufdrop.
- Der
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
deploymentSchlüsselwort kennzeichnet, dass der Auftrag ein Bereitstellungsauftrag ist, der auf eine Umgebung abzielt, um dorthin bereitzustellen. Dasenvironmentwird automatisch in Ihrem Projekt erstellt, wenn der Auftrag ausgeführt wird.Der
poolParameter gibt den Bereitstellungs-Agent-Pool an und verwendet den Standard-Agent-Pool, wennnamekein Parameter angegeben ist. Der Agent wird auf dem betriebssystem ausgeführt, das in dervmImageNameVariablen definiert ist, in diesem Fallubuntu-latest.
- deployment: DeploymentJob
pool:
name: <your-pool-name>
environment: $(environmentName)
Das
deploymentSchlüsselwort gibt an, dass der Auftrag ein Bereitstellungsauftrag ist, der auf eine Umgebung zur Bereitstellung abzielt. Dasenvironmentwird automatisch in Ihrem Projekt erstellt, wenn der Auftrag ausgeführt wird.Der
poolParameter 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
runOncelegt fest, dass der Bereitstellungs-Job einmal ausgeführt wird. - Das
deploy-Schlüsselwort legt fest, was imsteps-Bereitstellungsauftrag ausgeführt werden soll.
In steps dieser Phase werden die folgenden Aufgaben ausgeführt:
- UsePythonVersion@0 wählt die zu verwendende Python-Version aus, wie in der Buildphase.
-
AzureWebApp@1 stellt die Web-App und das
dropZIP-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 angegebeneazureServiceConnectionId. - Der
appNameenthält den Wert derwebAppName-Variablen. - Der
packagegibt 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.
Wählen Sie im Pipeline-Editor "Speichern" und "Ausführen" aus.
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.
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.
Wählen Sie im Bereitstellungs-Job die Aufgabe Azure-Web-App bereitstellen, um die Ausgabe anzuzeigen.
Wählen Sie aus dem Ausgabeergebnis die URL nach der App-Dienstanwendungs-URL aus. Die App sollte wie folgt angezeigt werden:
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:
- Wählen Sie auf der Portalseite für Ihre Web-App im linken Navigationsmenü die Option "Konfiguration" aus.
- Wählen Sie auf der Registerkarte "Anwendungseinstellungen " die Option "Neue Anwendungseinstellung" aus.
- Legen Sie im daraufhin angezeigten Popup Name auf
SCM_DO_BUILD_DURING_DEPLOYMENTfest, legen Sie Wert auftruefest, und wählen Sie dann OK aus. - Klicken Sie oben auf der Seite Konfiguration auf Speichern.
- 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.
- Wechseln Sie zum GitHub-Repository für Ihre App.
- Nehmen Sie eine Änderung am Code vor, wie z. B. die Änderung des Titels der App.
- Führen Sie für die Änderung einen Commit aus.
- Wechseln Sie zu Ihrer Pipeline, und stellen Sie sicher, dass ein neuer Pipeline-Durchlauf erstellt und ausgeführt wird.
- Überprüfen Sie nach Abschluss der Ausführung, ob die Änderung auf Ihre Web-App bereitgestellt wurde.
- Wechseln Sie im Azure-Portal zu Ihrer Web-App, und wählen Sie im linken Navigationsmenü das Bereitstellungscenter aus.
- 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.