Usare Azure Pipelines per compilare e distribuire un'app Web Python nel servizio app Azure
Servizi di Azure DevOps
Usare Azure Pipelines per l'integrazione continua e il recapito continuo (CI/CD) per compilare e distribuire un'app Web Python in app Azure Servizio in Linux. La pipeline compila e distribuisce automaticamente l'app Web Python in servizio app ogni volta che è presente un commit nel repository.
In questo articolo vengono illustrate le operazioni seguenti:
- Creare un'app Web nel servizio app di Azure.
- Creare un progetto in Azure DevOps.
- Connettere il progetto DevOps ad Azure.
- Creare una pipeline specifica di Python.
- Eseguire la pipeline per compilare e distribuire l'app nell'app Web in servizio app.
Prerequisiti
- Una sottoscrizione di Azure. Se non se ne ha una, creare un account gratuito.
- Un account GitHub. Se non è disponibile, crearne uno gratuitamente.
- Un'organizzazione di Azure DevOps Services. Crearne una gratuitamente.
- Una sottoscrizione di Azure. Se non se ne ha una, creare un account gratuito.
- Un account GitHub. Se non è disponibile, crearne uno gratuitamente.
- Un server Azure DevOps.
- Agente self-hosted. Se è necessario creare un agente self-hosted, vedere Agenti self-hosted.
Creare un repository per il codice dell'app
Creare una copia tramite fork del repository di esempio all'account https://github.com/Microsoft/python-sample-vscode-flask-tutorial GitHub.
Nell'host locale clonare il repository GitHub. Usare il comando seguente, sostituendo <repository-url>
con l'URL del repository copiato tramite fork.
git clone <repository-url>
Testare l'app in locale
Compilare ed eseguire l'app in locale per assicurarsi che funzioni.
Passare alla cartella del repository clonata.
cd python-sample-vscode-flask-tutorial
Compilare ed eseguire l'app
python -m venv .env source .env/bin/activate pip install --upgrade pip pip install -r ./requirements.txt export set FLASK_APP=hello_app.webapp python3 -m flask run
Per visualizzare l'app, aprire una finestra del browser e passare a http://localhost:5000. Verificare di visualizzare il titolo
Visual Studio Flask Tutorial
.Al termine, chiudere la finestra del browser e arrestare il server Flask con CTRL+C.
Apri un'istanza di Cloud Shell
Accedere al portale di Azure all'indirizzohttps://portal.azure.com.
Aprire l'interfaccia della riga di comando di Azure selezionando il pulsante Cloud Shell sulla barra degli strumenti del portale.
Cloud Shell viene visualizzato nella parte inferiore del browser. Selezionare Bash dal menu a discesa.
Per assegnare più spazio al lavoro, selezionare il pulsante ingrandisci.
Creare un'app Web del servizio app Azure
Creare l'app Web del servizio app Azure da Cloud Shell nel portale di Azure.
Suggerimento
Per incollare in Cloud Shell, usare CTRL+MAIUSC+V o fare clic con il pulsante destro del mouse e scegliere Incolla dal menu di scelta rapida.
Clonare il repository con il comando seguente, sostituendo
<repository-url>
con l'URL del repository copiato tramite fork.git clone <repository-url>
Passare alla cartella del repository clonata, in modo che il
az webapp up
comando riconosca l'app come app Python.cd python-sample-vscode-flask-tutorial
Usare il comando az webapp up per effettuare il provisioning del servizio app ed eseguire la prima distribuzione dell'app. Sostituire
<your-web-app-name>
con un nome univoco in Azure. In genere, si usa un nome personale o aziendale insieme a un identificatore dell'app, ad esempio<your-name>-flaskpipelines
. L'URL dell'app diventa your-appservice.azurewebsites.net>.<az webapp up --name <your-web-app-name>
L'output JSON del
az webapp up
comando mostra:{ "URL": <your-web-app-url>, "appserviceplan": <your-app-service-plan-name>, "location": <your-azure-location>, "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> }
Prendere nota dei
URL
valori eruntime_version
. Usare nelruntime_version
file YAML della pipeline.URL
è l'URL dell'app Web. È possibile usarlo per verificare che l'app sia in esecuzione.Nota
Il comando
az webapp up
esegue le azioni seguenti:Crea un gruppo di risorse predefinito.
Creare un piano di servizio app predefinito.
Crea un'app con il nome specificato.
Zip distribuisce tutti i file dalla directory di lavoro corrente, con l'automazione della compilazione abilitata.
Memorizzare nella cache i parametri in locale nel file .azure/config in modo che non sia necessario specificarli di nuovo durante la distribuzione successiva con
az webapp up
o altri comandiaz webapp
della cartella del progetto. I valori memorizzati nella cache vengono usati automaticamente per impostazione predefinita.
È possibile eseguire l'override dell'azione predefinita con i propri valori usando i parametri del comando. Per altre informazioni, vedere az webapp up.
L'app python-sample-vscode-flask-tutorial include un file startup.txt che contiene il comando di avvio specifico per l'app Web. Impostare la proprietà di configurazione dell'app
startup-file
Web sustartup.txt
.Nell'output del
az webapp up
comando copiare ilresourcegroup
valore.Immettere il comando seguente, usando il gruppo di risorse e il nome dell'app.
az webapp config set --resource-group <your-resource-group> --name <your-web-app-name> --startup-file startup.txt
Al termine del comando, mostra l'output JSON che contiene tutte le impostazioni di configurazione per l'app Web.
Per visualizzare l'app in esecuzione, aprire un browser e passare all'oggetto
URL
visualizzato nell'output delaz webapp up
comando. Se viene visualizzata una pagina generica, attendere alcuni secondi per l'avvio del servizio app, quindi aggiornare la pagina. Verificare di visualizzare il titoloVisual Studio Flask Tutorial
.
Creare un progetto Azure DevOps
Creare un nuovo progetto Azure DevOps.
- In un browser passare a dev.azure.com e accedere.
- Selezionare l'organizzazione.
- Creare un nuovo progetto selezionando Nuovo progetto o Crea progetto se si crea il primo progetto nell'organizzazione.
- Immettere il nome del progetto.
- Selezionare visibilità per il progetto.
- Seleziona Crea.
- In un browser passare al server Azure DevOps.
- Selezionare la raccolta.
- Creare un nuovo progetto selezionando Nuovo progetto o Crea progetto se si crea il primo progetto nella raccolta.
- Immettere il nome del progetto.
- Selezionare visibilità per il progetto.
- Seleziona Crea.
Creare un'entità servizio
Un'entità servizio è un'identità creata per l'uso con applicazioni, servizi ospitati e strumenti automatici per accedere alle risorse di Azure. Questo accesso è limitato ai ruoli assegnati all'entità servizio, consentendo di controllare le risorse a cui è possibile accedere e a quale livello.
Per creare un'entità servizio, passare a Cloud Shell (bash) ed eseguire il comando seguente. Sostituire <service-principal-name>
con un nome per l'entità servizio, <your-subscription-id>
con l'ID sottoscrizione e <your-resource-group>
con il gruppo di risorse per l'app Web.
az ad sp create-for-rbac --display-name <service-principal-name> --role contributor --scopes /subscriptions/<your-subscription-id>/resourceGroups/<your-resource-group>
Il comando restituisce un oggetto JSON simile all'esempio seguente:
{
"clientId": "<client GUID>",
"clientSecret": "<string-value>",
"subscriptionId": "<subscription GUID>",
"tenantId": "<tenant GUID>",
...
}
Prendere nota dei clientId
valori , clientSecret
subscriptionId
, e tenantId
. Questi valori sono necessari per creare una connessione al servizio nella sezione successiva.
Creare una connessione al servizio
Una connessione al servizio consente di creare una connessione per fornire l'accesso autenticato da Azure Pipelines a servizi esterni e remoti. Per eseguire la distribuzione nell'app Web del servizio app Azure, creare una connessione al servizio al gruppo di risorse contenente l'app Web.
Nella pagina del progetto selezionare Impostazioni progetto.
Selezionare Connessioni al servizio nella sezione Pipeline del menu.
Seleziona Crea connessione al servizio.
Selezionare Azure Resource Manager e selezionare Avanti.
Selezionare il metodo di autenticazione e selezionare Avanti.
Nella finestra di dialogo Nuova connessione al servizio di Azure immettere le informazioni specifiche del metodo di autenticazione selezionato. Per altre informazioni sui metodi di autenticazione, vedere Connettersi ad Azure usando una connessione al servizio Azure Resource Manager.
Ad esempio, se si usa un metodo di autenticazione dell'identità del carico di lavoro (automatico) o dell'entità servizio (automatico), immettere le informazioni necessarie.
Campo Descrizione Livello di ambito Selezionare Sottoscrizione. Abbonamento Il nome della sottoscrizione di Azure. Gruppo di risorse Nome del gruppo di risorse contenente l'app Web. Nome della connessione al servizio Nome descrittivo per la connessione. Concedere le autorizzazioni di accesso a tutte le pipeline Selezionare questa opzione per concedere l'accesso a tutte le pipeline. Seleziona Salva.
La nuova connessione viene visualizzata nell'elenco Connessioni al servizio ed è pronta per l'uso in Azure Pipeline.
Nella pagina del progetto selezionare Impostazioni progetto.
Selezionare Connessioni al servizio nella sezione Pipeline del menu.
Seleziona Crea connessione al servizio.
Selezionare Azure Resource Manager e selezionare Avanti.
In Nuova connessione al servizio di Azure selezionare Entità servizio (manuale) e selezionare Avanti
Nella finestra di dialogo successiva immettere le informazioni necessarie.
Campo Descrizione Ambiente Selezionare Azure Cloud
.Livello di ambito Selezionare Sottoscrizione. ID sottoscrizione ID sottoscrizione personale. Nome sottoscrizione Il nome della sottoscrizione di Azure. ID entità servizio Valore appId
dell'oggetto JSON restituito dalaz ad sp create-for-rbac
comando .Chiave entità servizio Valore password
dell'oggetto JSON restituito dalaz ad sp create-for-rbac
comando .Tenant Id Valore tenant
dell'oggetto JSON restituito dalaz ad sp create-for-rbac
comando .Selezionare Verifica per verificare la connessione.
Immettere un nome di connessione al servizio.
Verificare che l'opzione Concedi autorizzazioni di accesso a tutte le pipeline sia selezionata.
Selezionare Verifica e salva.
La nuova connessione viene visualizzata nell'elenco Connessioni al servizio ed è pronta per l'uso da parte di Azure Pipelines dal progetto.
Configurare un agente self-hosted
Se si usa un agente self-hosted, è necessario configurare l'agente per l'esecuzione di Python. Il download delle versioni di Python non è supportato in agenti self-hosted. È necessario preinstallare la versione di Python. Usare il programma di installazione completo per ottenere una versione compatibile con pip di Python.
Per evitare problemi incompatibili, è necessario associare la versione di Python alla versione di runtime nell'app Web app Azure Services. La versione del runtime viene visualizzata nell'output JSON del az webapp up
comando.
La versione di Python desiderata deve essere aggiunta alla cache degli strumenti nell'agente self-hosted in modo che l'attività possa usarla. In genere, la cache degli strumenti si trova nella directory _work/_tool dell'agente; in alternativa, è possibile eseguire l'override del percorso con la variabile di ambiente AGENT_TOOLSDIRECTORY. Nella directory degli strumenti creare la struttura di directory seguente in base alla versione di Python:
$AGENT_TOOLSDIRECTORY/
Python/
{version number}/
{platform}/
{tool files}
{platform}.complete
Il numero di versione deve seguire il formato 1.2.3. La piattaforma deve essere x86 o x64. I file degli strumenti devono essere i file di versione di Python decompressi. Deve {platform}.complete
essere un file a 0 byte simile x86.complete
o x64.complete
e indica semplicemente che lo strumento è installato correttamente nella cache.
Ad esempio, se si usa Python 3.11 in un computer Windows a 64 bit, la struttura di directory sarà simile alla seguente:
$AGENT_TOOLSDIRECTORY/
Python/
3.11.4/
x64/
{python files}
x64.complete
Se si ha già la versione di Python che si vuole usare nel computer che ospita l'agente, è possibile copiare i file nella cache degli strumenti. Se non si ha la versione di Python, è possibile scaricarla dal sito Web Python.
Creare una pipeline
Creare una pipeline per compilare e distribuire l'app Web Python nel servizio app Azure. Per comprendere i concetti della pipeline, guardare:
Nel menu di spostamento a sinistra selezionare Pipeline.
Seleziona Crea pipeline.
Nella finestra di dialogo Dove è il codice selezionare GitHub. Potrebbe essere richiesto di accedere a GitHub.
Nella schermata Selezionare un repository selezionare il repository di esempio con fork.
Potrebbe essere richiesto di immettere nuovamente la password di GitHub come conferma.
Se l'estensione Azure Pipelines non è installata in GitHub, GitHub richiede di installare l'estensione Azure Pipelines .
In questa pagina scorrere verso il basso fino alla sezione Accesso al repository, scegliere se installare l'estensione in tutti i repository o solo quelli selezionati, quindi selezionare Approva e installa.
Nella finestra di dialogo Configura la pipeline selezionare Python per Linux Web App in Azure.
Selezionare la sottoscrizione di Azure e selezionare Continua.
Se si usa il nome utente e la password per l'autenticazione, viene aperto un browser per accedere all'account Microsoft.
Selezionare il nome dell'app Web dall'elenco a discesa e selezionare Convalida e configura.
Azure Pipelines crea un file azure-pipelines.yml e lo visualizza nell'editor di pipeline YAML. Il file della pipeline definisce la pipeline CI/CD come una serie di fasi, processi e passaggi, in cui ogni passaggio contiene i dettagli per attività e script diversi. Esaminare la pipeline per verificarne il funzionamento. Assicurarsi che tutti gli input predefiniti siano appropriati per il codice.
Nel menu di spostamento selezionare Pipeline.
Seleziona Crea pipeline.
Nella finestra di dialogo Dove è il codice selezionare GitHub Enterprise Server. Potrebbe essere richiesto di accedere a GitHub.
Nella scheda Selezionare un repository selezionare il repository di esempio con fork.
Potrebbe essere richiesto di immettere nuovamente la password di GitHub come conferma.
Se l'estensione Azure Pipelines non è installata in GitHub, GitHub richiede di installare l'estensione Azure Pipelines .
In questa pagina scorrere verso il basso fino alla sezione Accesso al repository, scegliere se installare l'estensione in tutti i repository o solo quelli selezionati, quindi selezionare Approva e installa.
Nella finestra di dialogo Configura la pipeline selezionare Pipeline di avvio.
Sostituire il contenuto del file azure-pipelines.yml con il codice seguente.
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'
Sostituire i segnaposto seguenti con i propri valori:
Segnaposto Descrizione <your-service-connection-name>
Nome della connessione al servizio creata. <your-web-app-name>
Nome dell'app Web del servizio app Azure. <your-pool-name>
Nome del pool di agenti da usare. <your-python-version>
Versione di Python in esecuzione nell'agente. È consigliabile associare questa versione alla versione Python in esecuzione nell'app Web. La versione dell'app Web viene visualizzata nell'output JSON del az webapp up
comando.
File di pipeline YAML
La spiegazione seguente descrive il file della pipeline YAML. Per informazioni sullo schema di file YAML della pipeline, vedere Informazioni di riferimento sullo schema YAML.
Il file YAML della pipeline di esempio completo è illustrato di seguito:
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 setup
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
Variabili
La variables
sezione contiene le variabili seguenti:
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.
projectRoot: $(System.DefaultWorkingDirectory)
# Python version: 3.11. Change this to match the Python runtime version running on your web app.
pythonVersion: '3.11'
Variabile | Descrizione |
---|---|
azureServiceConnectionId |
ID o nome della connessione al servizio Azure Resource Manager. |
webAppName |
Nome dell'app Web del servizio app Azure. |
vmImageName |
Nome del sistema operativo da usare per l'agente di compilazione. |
environmentName |
Nome dell'ambiente usato nella fase di distribuzione. L'ambiente viene creato automaticamente quando viene eseguito il processo di fase. |
projectRoot |
Cartella radice contenente il codice dell'app. |
pythonVersion |
Versione di Python da usare negli agenti di compilazione e distribuzione. |
La variables
sezione contiene le variabili seguenti:
variables:
# Azure Resource Manager connection created during pipeline creation
azureServiceConnectionId: '<your-service-connection-name>'
# Web app name
webAppName: '<your-webapp-name>'
# Environment name
environmentName: '<your-webapp-name>'
# Project root folder.
projectRoot: $(System.DefaultWorkingDirectory)
# Python version: 3.11. Change this to the version that is running on your agent and web app.
pythonVersion: '3.11'
Variabile | Descrizione |
---|---|
azureServiceConnectionId |
Nome della connessione al servizio Azure Resource Manager. |
webAppName |
il nome dell'app Web. |
environmentName |
Nome dell'ambiente usato nella fase di distribuzione. |
projectRoot |
Cartella contenente il codice dell'app. Il valore è una variabile di sistema automatica. |
pythonVersion |
Versione di Python da usare negli agenti di compilazione e distribuzione. |
Fase di compilazione
La fase di compilazione contiene un singolo processo eseguito nel sistema operativo definito nella variabile vmImageName.
- job: BuildJob
pool:
vmImage: $(vmImageName)
La fase di compilazione contiene un singolo processo eseguito in un agente nel pool identificato dal parametro name. È possibile specificare le funzionalità dell'agente con la demands
parola chiave . Ad esempio, demands: python
specifica che l'agente deve avere Installato Python. Per specificare un agente self-hosted in base al nome, è possibile usare la demands: Agent.Name -equals <agent-name>
parola chiave .
- job: BuildJob
pool:
name: <your-pool-name>
demands: python
Il processo contiene più passaggi:
L'attività UsePythonVersion seleziona la versione di Python da usare. La versione è definita nella
pythonVersion
variabile .- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python $(pythonVersion)'
Questo passaggio usa uno script per creare un ambiente Python virtuale e installare le dipendenze dell'app contenute nel
requirements.txt
parametro TheworkingDirectory
specifica il percorso del codice dell'app.- script: | python -m venv antenv source antenv/bin/activate python -m pip install --upgrade pip pip install setup pip install -r ./requirements.txt workingDirectory: $(projectRoot) displayName: "Install requirements"
L'attività ArchiveFiles crea l'archivio .zip contenente l'app Web. Il
.zip
file viene caricato nella pipeline come artefatto denominatodrop
. Il.zip
file viene usato nella fase di distribuzione per distribuire l'app nell'app Web.- 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
Parametro Descrizione rootFolderOrFile
Posizione del codice dell'app. includeRootFolder
Indica se includere la cartella radice nel file .zip . Impostare questo parametro su false
in caso contrario, il contenuto del file .zip viene inserito in una cartella denominata s e servizio app nel contenitore Linux non riesce a trovare il codice dell'app.archiveType
Tipo di archivio da creare. Impostare su zip
.archiveFile
Percorso del file .zip da creare. replaceExistingArchive
Indica se sostituire un archivio esistente se il file esiste già. Impostare su true
.upload
Percorso del file .zip da caricare. artifact
Nome dell'artefatto da creare.
Fase di distribuzione
La fase di distribuzione viene eseguita se la fase di compilazione viene completata correttamente. Le parole chiave seguenti definiscono questo comportamento:
dependsOn: Build
condition: succeeded()
La fase di distribuzione contiene un singolo processo di distribuzione configurato con le parole chiave seguenti:
- deployment: DeploymentJob
pool:
vmImage: $(vmImageName)
environment: $(environmentName)
Parola chiave | Descrizione |
---|---|
deployment |
Indica che il processo è un processo di distribuzione destinato a un ambiente. |
pool |
Specifica il pool di agenti di distribuzione. Pool di agenti predefinito se il nome non è specificato. La vmImage parola chiave identifica il sistema operativo per l'immagine della macchina virtuale dell'agente |
environment |
Specifica l'ambiente in cui eseguire la distribuzione. L'ambiente viene creato automaticamente nel progetto quando viene eseguito il processo. |
- deployment: DeploymentJob
pool:
name: <your-pool-name>
environment: $(environmentName)
Parola chiave | Descrizione |
---|---|
deployment |
Indica che il processo è un processo di distribuzione destinato a un ambiente. |
pool Specifica il pool di agenti da usare per la distribuzione. Questo pool deve contenere un agente con la possibilità di eseguire la versione python specificata nella pipeline. |
|
environment |
Specifica l'ambiente in cui eseguire la distribuzione. L'ambiente viene creato automaticamente nel progetto quando viene eseguito il processo. |
La strategy
parola chiave viene usata per definire la strategia di distribuzione. La runOnce
parola chiave specifica che il processo di distribuzione viene eseguito una sola volta. La deploy
parola chiave specifica i passaggi da eseguire nel processo di distribuzione.
strategy:
runOnce:
deploy:
steps:
L'oggetto steps
nella pipeline è:
Usare l'attività UsePythonVersion per specificare la versione di Python da usare nell'agente. La versione è definita nella
pythonVersion
variabile .- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python version'
Distribuire l'app Web usando il AzureWebApp@1. Questa attività distribuisce l'artefatto
drop
della pipeline nell'app Web.- task: AzureWebApp@1 displayName: 'Deploy Azure Web App : <your-web-app-name>' inputs: azureSubscription: $(azureServiceConnectionId) appName: $(webAppName) package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
Parametro Descrizione azureSubscription
ID o nome di connessione del servizio Azure Resource Manager da usare. appName
il nome dell'app Web. package
Percorso del file .zip da distribuire. Inoltre, poiché il repository python-vscode-flask-tutorial contiene lo stesso comando di avvio in un file denominato startup.txt, è possibile specificare tale file aggiungendo il parametro :
startUpCommand: 'startup.txt'
.
L'oggetto steps
nella pipeline è:
Usare l'attività UsePythonVersion per specificare la versione di Python da usare nell'agente. La versione è definita nella
pythonVersion
variabile .- task: UsePythonVersion@0 inputs: versionSpec: '$(pythonVersion)' displayName: 'Use Python version'
Distribuire l'app Web usando il AzureWebApp@1. Questa attività distribuisce l'artefatto
drop
della pipeline nell'app Web.- task: AzureWebApp@1 displayName: 'Deploy Azure Web App : <your-web-app-name>' inputs: azureSubscription: $(azureServiceConnectionId) appName: $(webAppName) package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip
Parametro Descrizione azureSubscription
ID o nome di connessione del servizio Azure Resource Manager da usare. appName
il nome dell'app Web. package
Percorso del file .zip da distribuire. Inoltre, poiché il repository python-vscode-flask-tutorial contiene lo stesso comando di avvio in un file denominato startup.txt, è possibile specificare tale file aggiungendo il parametro :
startUpCommand: 'startup.txt'
.- task: AzureWebApp@1 displayName: 'Deploy Azure Web App : $(webAppName)' inputs: azureSubscription: $(azureServiceConnectionId) appName: $(webAppName) package: $(Pipeline.Workspace)/drop/$(Build.BuildId).zip startUpCommand: 'startup.txt'
Parametro Descrizione azureSubscription
ID o nome di connessione del servizio Azure Resource Manager da usare. appName
il nome dell'app Web. package
Percorso del file .zip da distribuire. startUpCommand
Comando da eseguire dopo la distribuzione dell'app. L'app di esempio usa startup.txt
.
Eseguire la pipeline
È ora possibile provarlo.
Nell'editor selezionare Salva ed esegui.
Nella finestra di dialogo Salva ed esegui aggiungi un messaggio di commit e quindi seleziona Salva ed esegui.
È possibile controllare la pipeline durante l'esecuzione selezionando fasi o processi nel riepilogo dell'esecuzione della pipeline.
Accanto a ogni fase e processo sono presenti segni di spunta verdi al termine dell'operazione. Se si verificano errori, vengono visualizzati nel riepilogo o nei passaggi del processo.
È possibile tornare rapidamente all'editor YAML selezionando i punti verticali in alto a destra nella pagina Riepilogo e selezionando Modifica pipeline:
Nel processo di distribuzione selezionare l'attività Deploy Azure Web App (Distribuisci app Web di Azure) per visualizzarne l'output. Per visitare il sito distribuito, tenere premuto CTRL e selezionare l'URL dopo
App Service Application URL
.Se si usa l'app di esempio, l'app dovrebbe essere visualizzata come segue:
Importante
Se l'app non riesce a causa di una dipendenza mancante, il file requirements.txt non è stato elaborato durante la distribuzione. Questo comportamento si verifica se l'app Web è stata creata direttamente nel portale anziché usare il az webapp up
comando come illustrato in questo articolo.
Il az webapp up
comando imposta in modo specifico l'azione SCM_DO_BUILD_DURING_DEPLOYMENT
di compilazione su true
. Se è stato effettuato il provisioning del servizio app tramite il portale, questa azione non viene impostata automaticamente.
I passaggi seguenti impostano l'azione:
- Aprire il portale di Azure, selezionare il servizio app e quindi selezionare Configurazione.
- Nella scheda Impostazioni applicazione selezionare Nuova impostazione applicazione.
- Nella finestra popup visualizzata impostare Nome su
SCM_DO_BUILD_DURING_DEPLOYMENT
, impostare Valore sutrue
e selezionare OK. - Selezionare Salva nella parte superiore della pagina Configurazione .
- Eseguire di nuovo la pipeline. Le dipendenze devono essere installate durante la distribuzione.
Attivare un'esecuzione della pipeline
Per attivare un'esecuzione della pipeline, eseguire il commit di una modifica nel repository. Ad esempio, è possibile aggiungere una nuova funzionalità all'app o aggiornare le dipendenze dell'app.
- Passare al repository GitHub.
- Apportare una modifica al codice, ad esempio la modifica del titolo dell'app.
- Eseguire il commit della modifica nel repository.
- Passare alla pipeline e verificare che sia stata creata una nuova esecuzione.
- Al termine dell'esecuzione, verificare che la nuova compilazione sia distribuita nell'app Web.
- Nel portale di Azure passare all'app Web.
- Selezionare Centro distribuzione e selezionare la scheda Log .
- Verificare che la nuova distribuzione sia elencata.
Considerazioni per Django
È possibile usare Azure Pipelines per distribuire app Django per app Azure Servizio in Linux se si usa un database separato. Non è possibile usare un database SQLite perché servizio app blocca il file db.sqlite3, impedendo sia letture che scritture. Questo comportamento non influisce su un database esterno.
Come descritto in Configurare l'app Python in servizio app - Processo di avvio del contenitore, servizio app cerca automaticamente un file wsgi.py all'interno del codice dell'app, che in genere contiene l'oggetto app. Se si vuole personalizzare il comando di avvio in qualsiasi modo, usare il startUpCommand
parametro nel AzureWebApp@1
passaggio del file di pipeline YAML, come descritto nella sezione precedente.
Quando si usa Django, in genere si vuole eseguire la migrazione dei modelli di dati usando manage.py migrate
dopo la distribuzione del codice dell'app. A questo scopo, è possibile aggiungere startUpCommand
con uno script di post-distribuzione. Ad esempio, ecco la startUpCommand
proprietà nell'attività 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'
Eseguire test sull'agente di compilazione
Come parte del processo di compilazione, è possibile eseguire test nel codice dell'app. I test vengono eseguiti nell'agente di compilazione, quindi è necessario installare le dipendenze in un ambiente virtuale nell'agente di compilazione. Dopo l'esecuzione dei test, eliminare l'ambiente virtuale prima di creare il file di .zip per la distribuzione. Gli elementi di script seguenti illustrano questo processo. Posizionarli prima dell'attività ArchiveFiles@2
nel file di azure-pipelines.yml . Per altre informazioni, vedere Eseguire script multipiattaforma.
# 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'
È anche possibile usare un'attività come PublishTestResults@2 per pubblicare i risultati del test nella pipeline. Per altre informazioni, vedere Creare app Python - Eseguire test.
Pulire le risorse
Per evitare addebiti per le risorse di Azure create in questa esercitazione:
Eliminare il progetto creato. L'eliminazione del progetto elimina la pipeline e la connessione al servizio.
Eliminare il gruppo di risorse di Azure che contiene il servizio app e il piano di servizio app. Nella portale di Azure passare al gruppo di risorse, selezionare Elimina gruppo di risorse e seguire le istruzioni.
Eliminare l'account di archiviazione che gestisce il file system per Cloud Shell. Chiudere Cloud Shell e quindi passare al gruppo di risorse che inizia con cloud-shell-storage-, selezionare Elimina gruppo di risorse e seguire le istruzioni.