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

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.

  1. Accedere all'organizzazione di Azure DevOps e passare al progetto.

  2. Passare a Pipeline e quindi selezionare Nuova pipeline.

  3. 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.

  4. Quando viene visualizzato l’elenco dei repository, selezionare il repository.

  5. È possibile che si venga reindirizzati a GitHub per installare l'app Azure Pipelines. In tal caso, selezionare Approva e installa.

  6. Quando viene visualizzata la scheda Configura, selezionare ASP.NET Core.

  7. 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

  1. Fare clic alla fine del file YAML, quindi selezionare Mostra assistente.’

  2. Usare Assistente attività per aggiungere l’attività app Web di Azure.

    Screenshot dell’attività dell’app Web di Azure.

    In alternativa, è possibile aggiungere l’attività di distribuzione del Servizio app di Azure (AzureRmWebAppDeployment).

  3. Scegliere la sottoscrizione di Azure. Assicurarsi di Autorizzare la connessione. L’autorizzazione crea la connessione al servizio richiesta.

  4. 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>'

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 se deployToSlotOrASE è 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:

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