Eseguire la distribuzione nel Servizio app tramite Azure Pipelines
Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019
Nota
A partire dal 1° giugno 2024, tutte le app del servizio app appena create avranno la possibilità di generare un nome host predefinito univoco usando la convenzione di denominazione <app-name>-<random-hash>.<region>.azurewebsites.net
. I nomi delle app esistenti rimarranno invariati.
Esempio: myapp-ds27dh7271aah175.westus-01.azurewebsites.net
Per altri dettagli, vedere Nome host predefinito univoco per la risorsa del servizio app.
Usare Azure Pipelines per distribuire automaticamente l’app Web in Servizio app di Azure in ogni compilazione corretta. Azure Pipelines consente di creare, testare e distribuire integrazione continua (CI, continuous integration) e recapito continuo (CD, continuous delivery) tramite Azure DevOps.
Le pipeline YAML vengono definite usando un file YAML nel repository. Un passaggio è il blocco predefinito più piccolo di una pipeline e può essere uno script o un’attività (script prepacchetto). Informazioni su concetti chiave e componenti che costituiscono una pipeline.
Si userà l’attività App Web di Azure (AzureWebApp
) per la distribuzione nel Servizio app di Azure nella pipeline. Per scenari più complessi, ad esempio la necessità di usare i parametri XML nella distribuzione, è possibile usare l’attività di distribuzione Servizio app di Azure (AzureRmWebAppDeployment).
Prerequisiti
- Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
- Un'organizzazione di Azure DevOps. Crearne una gratuitamente.
- Possibilità di eseguire pipeline su agenti ospitati da Microsoft. È possibile acquistare un processo in parallelo oppure richiedere un livello gratuito.
- Un’app del Servizio app di Azure funzionante con codice ospitato in GitHub o Azure Repos.
1. Creare una pipeline per lo stack
Gli esempi di codice in questa sezione presuppongono che si stia distribuendo un’app Web ASP.NET. È possibile adattare le istruzioni per altri framework.
Altre informazioni sul supporto dell’ecosistema di Azure Pipelines.
Accedere all'organizzazione di Azure DevOps e passare al progetto.
Passare a Pipeline e quindi selezionare Nuova pipeline.
Quando richiesto, selezionare il percorso del codice sorgente: Git Azure Repos o GitHub.
Si potrebbe essere reindirizzati a GitHub per l'accesso. In questo caso, immettere le credenziali di GitHub.
Quando viene visualizzato l’elenco dei repository, selezionare il repository.
È possibile che si venga reindirizzati a GitHub per installare l'app Azure Pipelines. In tal caso, selezionare Approva e installa.
Quando viene visualizzata la scheda Configura, selezionare ASP.NET Core.
Quando viene visualizzata la nuova pipeline, osservare YAML per vedere cosa fa. Quando si è pronti, selezionare Salva ed esegui.
2. Aggiungere l’attività di distribuzione
Fare clic alla fine del file YAML, quindi selezionare Mostra assistente.’
Usare Assistente attività per aggiungere l’attività app Web di Azure.
In alternativa, è possibile aggiungere l’attività di distribuzione del Servizio app di Azure (AzureRmWebAppDeployment).
Scegliere la sottoscrizione di Azure. Assicurarsi di Autorizzare la connessione. L’autorizzazione crea la connessione al servizio richiesta.
Selezionare il tipo di app, il nome dell’app e lo stack di runtime in base all’app del servizio app. Il codice YAML completo dovrebbe essere simile al seguente.
variables: buildConfiguration: 'Release' steps: - task: DotNetCoreCLI@2 inputs: command: 'publish' publishWebProjects: true - task: AzureWebApp@1 inputs: azureSubscription: '<service-connection-name>' appType: 'webAppLinux' appName: '<app-name>' package: '$(System.DefaultWorkingDirectory)/**/*.zip'
- azureSubscription: nome della connessione al servizio autorizzata alla sottoscrizione di Azure.
- appName: nome dell’app esistente.
- package: percorso del file al pacchetto o a una cartella contenente il contenuto del servizio app. Sono supportati caratteri jolly.
Esempio: distribuire un’app .NET
Per distribuire un pacchetto Web .zip, ad esempio, da un’app Web ASP.NET a un’app Web di Azure, usare il frammento di codice seguente per distribuire la compilazione in un’app.
variables:
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: 'webAppLinux'
appName: '<app-name>'
package: '$(System.DefaultWorkingDirectory)/**/*.zip'
- azureSubscription: la sottoscrizione di Azure.
- appType: il tipo di app Web.
- appName: il nome del servizio app esistente.
- package: il percorso di file del pacchetto o di una cartella che contiene i contenuti del servizio app. Sono supportati caratteri jolly.
Esempio: eseguire la distribuzione in un’applicazione virtuale
Per impostazione predefinita, la distribuzione si verifica nell’applicazione radice nell’app Web di Azure. È possibile eseguire la distribuzione in un’applicazione virtuale specifica usando la proprietà VirtualApplication
dell’attività di distribuzione del Servizio app di Azure (AzureRmWebAppDeployment
):
- task: AzureRmWebAppDeployment@4
inputs:
VirtualApplication: '<name of virtual application>'
- VirtualApplication: nome dell’applicazione virtuale configurata nel portale di Azure. Per altre informazioni, vedere Configurare un’app del servizio app nel portale di Azure.
Esempio: eseguire la distribuzione in uno slot
Nell’esempio seguente viene illustrato come eseguire la distribuzione in uno slot di staging e quindi passare a uno slot di produzione:
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: webAppLinux
appName: '<app-name>'
deployToSlotOrASE: true
resourceGroupName: '<name of resource group>'
slotName: staging
package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
- task: AzureAppServiceManage@0
inputs:
azureSubscription: '<service-connection-name>'
appType: webAppLinux
WebAppName: '<app-name>'
ResourceGroupName: '<name of resource group>'
SourceSlot: staging
SwapWithProduction: true
- azureSubscription: la sottoscrizione di Azure.
- appType: (facoltativo) usare
webAppLinux
per eseguire la distribuzione in un’app Web in Linux. - appName: il nome del servizio app esistente.
- deployToSlotOrASE: booleano. Eseguire la distribuzione in uno slot di distribuzione esistente o in un ambiente del servizio app di Azure.
- resourceGroupName: nome del gruppo di risorse. Obbligatorio se
deployToSlotOrASE
è true. - slotName: nome dello slot che per impostazione predefinita è
production
. Obbligatorio sedeployToSlotOrASE
è true. - package: il percorso di file del pacchetto o di una cartella che contiene i contenuti del servizio app. Sono supportati caratteri jolly.
- SourceSlot: slot inviato all’ambiente di produzione quando
SwapWithProduction
è true. - SwapWithProduction: booleano. Scambiare il traffico dello slot di origine con quello di produzione.
Esempio: eseguire la distribuzione in più app Web
È possibile usare processi nel file YAML per configurare una pipeline di distribuzioni. Usando i processi, è possibile controllare l’ordine di distribuzione in più app Web.
jobs:
- job: buildandtest
pool:
vmImage: ubuntu-latest
steps:
# publish an artifact called drop
- task: PublishPipelineArtifact@1
inputs:
targetPath: '$(Build.ArtifactStagingDirectory)'
artifactName: drop
# deploy to Azure Web App staging
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: <app type>
appName: '<staging-app-name>'
deployToSlotOrASE: true
resourceGroupName: <group-name>
slotName: 'staging'
package: '$(Build.ArtifactStagingDirectory)/**/*.zip'
- job: deploy
dependsOn: buildandtest
condition: succeeded()
pool:
vmImage: ubuntu-latest
steps:
# download the artifact drop from the previous job
- task: DownloadPipelineArtifact@2
inputs:
source: 'current'
artifact: 'drop'
path: '$(Pipeline.Workspace)'
- task: AzureWebApp@1
inputs:
azureSubscription: '<service-connection-name>'
appType: <app type>
appName: '<production-app-name>'
resourceGroupName: <group-name>
package: '$(Pipeline.Workspace)/**/*.zip'
Esempio: effettuare sostituzioni di variabili
Per la maggior parte degli stack di linguaggi, impostazioni dell’app e stringhe di connessione possono essere impostate come variabili di ambiente in fase di runtime.
Esistono tuttavia altri motivi per cui si vogliono eseguire sostituzioni di variabili a Web.config. In questo esempio, il file Web.config contiene una stringa di connessione chiamata connectionString
. È possibile modificarne il valore prima della distribuzione in ogni app Web. A tale scopo, è possibile applicare una trasformazione Web.config o sostituendo le variabili nel file Web.config.
Il frammento di codice seguente illustra un esempio di sostituzione delle variabili usando l’attività di distribuzione del Servizio app di Azure (AzureRmWebAppDeployment
):
jobs:
- job: test
variables:
connectionString: <test-stage connection string>
steps:
- task: AzureRmWebAppDeployment@4
inputs:
azureSubscription: '<Test stage Azure service connection>'
WebAppName: '<name of test stage web app>'
enableXmlVariableSubstitution: true
- job: prod
dependsOn: test
variables:
connectionString: <prod-stage connection string>
steps:
- task: AzureRmWebAppDeployment@4
inputs:
azureSubscription: '<Prod stage Azure service connection>'
WebAppName: '<name of prod stage web app>'
enableXmlVariableSubstitution: true
Esempio: distribuire in modo condizionale
A tale scopo, è possibile usare una delle tecniche seguenti in YAML:
- Isolare i passaggi di distribuzione in un processo separato e aggiungere una condizione a tale processo.
- Aggiungere una condizione al passaggio.
L’esempio seguente illustra come usare le condizioni dei passaggi per distribuire solo le compilazioni che hanno origine dal ramo principale:
- task: AzureWebApp@1
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
inputs:
azureSubscription: '<service-connection-name>'
appName: '<app-name>'
Per altre informazioni sulle condizioni, vedere Specificare condizioni.
Esempio: distribuire con Distribuzione Web
L’attività di distribuzione del Servizio app di Azure (AzureRmWebAppDeployment
) può essere distribuita nel servizio app tramite Distribuzione Web.
trigger:
- main
pool:
vmImage: windows-latest
variables:
buildConfiguration: 'Release'
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'publish'
publishWebProjects: true
arguments: '--configuration $(buildConfiguration)'
zipAfterPublish: true
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: '<service-connection-name>'
appType: 'webApp'
WebAppName: '<app-name>'
packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
enableCustomDeployment: true
DeploymentType: 'webDeploy'
Domande frequenti
Qual è la differenza tra le attività AzureWebApp
e AzureRmWebAppDeployment
?
L’attività app Web di Azure (AzureWebApp
) è il modo più semplice per eseguire la distribuzione in un’app Web di Azure. Per impostazione predefinita, la distribuzione si verifica nell’applicazione radice nell’app Web di Azure.
L’attività di distribuzione del Servizio app di Azure (AzureRmWebAppDeployment
) può gestire scenari più personalizzati, ad esempio:
- Modificare le impostazioni di configurazione all’interno di pacchetti Web e file di parametri XML.
- Distribuire con Distribuzione Web se si è abituati al processo di distribuzione IIS.
- Distribuire in applicazioni virtuali.
- Eseguire la distribuzione in altri tipi di app, ad esempio App contenitore, app per le funzioni, processi Web o app per dispositivi mobili ed API.
Nota
Le trasformazioni di file e la sostituzione di variabili sono supportate anche dall’attività di trasformazione file separata da usare in Azure Pipelines. È possibile usare l’attività di trasformazione file per applicare trasformazioni di file e sostituzioni di variabili in qualsiasi file di configurazione e parametri.
Viene visualizzato il messaggio “Pacchetto del servizio app o percorso della cartella fornito non valido”.
Nelle pipeline YAML, a seconda della pipeline, potrebbe verificarsi una mancata corrispondenza tra la posizione in cui viene salvato il pacchetto Web compilato e la posizione in cui l’attività di distribuzione lo sta cercando. Ad esempio, l’attività AzureWebApp
seleziona il pacchetto Web per la distribuzione. Ad esempio, l’attività AzureWebApp cerca in $(System.DefaultWorkingDirectory)/**/*.zip
. Se il pacchetto Web viene depositato altrove, modificare il valore package
.
Viene visualizzato il messaggio “La pubblicazione con le opzioni webdeploy è supportata solo quando si usa un agente di Windows”.
Questo errore si verifica nell’attività AzureRmWebAppDeployment quando si configura l’attività per la distribuzione con Distribuzione Web, ma l’agente non esegue Windows. Verificare che YAML presenti un codice simile al seguente:
pool:
vmImage: windows-latest
Distribuzione Web non funziona quando si disabilita l’autenticazione di base
Per informazioni sulla risoluzione dei problemi relativi all’uso dell’autenticazione di Microsoft Entra ID con l’attività AzureRmWebAppDeployment
, vedere Non è possibile eseguire la Distribuzione Web nel Servizio app di Azure usando l’autenticazione di Microsoft Entra ID dall’agente di Windows
Passaggi successivi
- Personalizzare la pipeline di Azure DevOps.