Eseguire la distribuzione nel Servizio app tramite Azure Pipelines

Azure DevOps Services | Azure DevOps Server 2020 | Azure DevOps Server 2019

Usare Azure Pipelines per distribuire automaticamente l'app Web in app Azure Servizio in ogni compilazione corretta. Azure Pipelines consente di compilare, testare e distribuire con integrazione continua (CI) e recapito continuo (CD) usando 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 sui concetti chiave e sui componenti che costituiscono una pipeline.

Si userà l'attività App Web di Azure (AzureWebApp) per eseguire la distribuzione nel servizio app Azure nella pipeline. Per scenari più complessi, ad esempio la necessità di usare i parametri XML nella distribuzione, è possibile usare l'attività di distribuzione del servizio app 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, vedere YAML per vedere cosa fa. Quando si è pronti, selezionare Salva ed esegui.

2. Aggiungere l'attività di distribuzione

  1. Fare clic sulla fine del file YAML, quindi selezionare Mostra assistente".

  2. Usare Assistente attività per aggiungere l'attività App Web di Azure.

    Screenshot of Azure web app task.

    In alternativa, è possibile aggiungere l'attività app Azure Service deploy (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 servizio app. Il codice YAML completo dovrebbe essere simile al codice seguente.

    variables:
      buildConfiguration: 'Release'
    
    steps:
    - script: dotnet build --configuration $(buildConfiguration)
      displayName: 'dotnet build $(buildConfiguration)'
    - 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 del servizio autorizzato alla sottoscrizione di Azure.
    • appName: nome dell'app esistente.
    • package: percorso del file del pacchetto o di 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:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- 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 VirtualApplication proprietà dell'attività distribuzione del servizio app 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.
  • deployToSlotOrA edizione Standard: booleano. Eseguire la distribuzione in uno slot di distribuzione esistente o in un ambiente del servizio app 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: valore booleano. Scambiare il traffico dello slot di origine con quello di produzione.

Esempio: Eseguire la distribuzione in più app Web

È possibile usare i 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, le impostazioni dell'app e le stringa di connessione possono essere impostate come variabili di ambiente in fase di esecuzione.

Esistono tuttavia altri motivi per cui si vogliono eseguire sostituzioni di variabili nel file Web.config. In questo esempio il file Web.config contiene un stringa di connessione denominato 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 mostra un esempio di sostituzione delle variabili usando l'attività Distribuzione servizio app 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, in YAML è possibile usare una delle tecniche seguenti:

  • 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 main:

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

Esempio: distribuire con Distribuzione Web

L'attività distribuzione del servizio app Azure (AzureRmWebAppDeployment) può essere distribuita in servizio app tramite Distribuzione Web.

trigger:
- main

pool:
  vmImage: windows-latest

variables:
  buildConfiguration: 'Release'

steps:
- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'
- 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 AzureWebApp attività 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 Azure (AzureRmWebAppDeployment) può gestire scenari più personalizzati, ad esempio:

Nota

Le trasformazioni di file e la sostituzione delle variabili sono supportate anche dall'attività Trasformazione file separata da usare in Azure Pipelines. È possibile usare l'attività Trasformazione file per applicare trasformazioni di file e sostituzioni di variabili in qualsiasi file di configurazione e parametri.

Viene visualizzato il messaggio "Non valido servizio app pacchetto o percorso della cartella fornito".

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

Viene visualizzato il messaggio "Publish using webdeploy options are supported only when using Windows agent".

Questo errore si verifica nell'attività AzureRmWebAppDeployment quando si configura l'attività per la distribuzione tramite Distribuzione Web, ma l'agente non esegue Windows. Verificare che yaml abbia 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à, vedere Non è possibile eseguire la distribuzione Web nel servizio app Azure tramite l'autenticazione con ID Microsoft Entra dall'agente AzureRmWebAppDeployment di Windows

Passaggi successivi

  • Personalizzare la pipeline di Azure DevOps.