Esercitazio - Distribuisci un'app di Funzioni di Azure in Azure

Completato

Il progetto è stato fornito con una pipeline che compila i progetti nella soluzione e distribuisce l'app Web nel servizio app di Azure. È ora possibile estendere la pipeline anche per distribuire il nuovo progetto Funzioni di Azure.

In questa parte:

  • Esaminare la fase di compilazione.
  • Aggiungere un'attività per distribuire l'app per le funzioni.
  • Aggiungere un'attività per configurare il servizio app pubblicato per l'uso della funzione pubblicata.
  • Salvare la pipeline per attivare un flusso di lavoro CI/CD.

Esaminare la fase di compilazione

In questa sezione verrà esaminata la pipeline CI/CD esistente definita in azure-pipelines.yml.

  1. In Azure DevOps, passare a Pipelines.

  2. Selezionare la pipeline.

  3. Seleziona Modifica Assicurarsi che il ramo sia impostato su main, selezionandolo dal menu a discesa. Verrà visualizzato il file azure-pipelines.yml che definisce la pipeline CI/CD esistente.

    A causa dell'uso di caratteri jolly nei percorsi del progetto, le attività evidenziate seguenti ripristineranno, eseguiranno automaticamente il ripristino, la compilazione e la pubblicazione del nuovo progetto Funzioni di Azure.

    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.0.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    

Andy: Questa era la fase di compilazione precedente. Non è stato modificato dal progetto originale perché le attività erano già configurate per l'esecuzione in tutti i progetti in base al modello di corrispondenza con caratteri jolly.

Mara: Sì, dovrebbe funzionare così come è. Non credo che dobbiamo apportare modifiche qui. Dopo l'esecuzione di questa attività di compilazione, gli artefatti di file ZIP per i progetti web e leaderboard verranno pubblicati per la fase Distribuisci da usare.

Aggiungere un'attività per distribuire la funzione di Azure

Andy: Penso che possiamo anche riutilizzare l'attività di distribuzione servizio app così come sono. Speriamo che sia possibile usare qualcosa di simile per distribuire un'app per le funzioni.

Mara: Ho buone notizie. Dopo una piccola ricerca, sembra che ci sia un'attività concettualmente simile all'attività di distribuzione servizio app, ma per le distribuzioni Funzioni di Azure. Vediamola ora.

Attività App per le funzioni di Azure

L'attività AzureFunctionApp@1 è progettata per distribuire le app per le funzioni. È concettualmente simile all'attività AzureWebApp@1 e include tutti gli elementi necessari per questo scenario di app per le funzioni:

  • azureSubscription fa riferimento al nome della variabile della pipeline di connessione del servizio di Azure.
  • appType indica se l'app viene distribuita per Linux (functionAppLinux) o Windows (functionApp).
  • appNamespecifica il nome dell'istanza dell'app Funzioni di Azure nell'account Azure.
  • package specifica il percorso del pacchetto da distribuire.
  • runtimeStack indica l'immagine in cui deve essere eseguita la funzione, necessaria per le distribuzioni Linux.
  • startUpCommand specifica il comando di avvio da eseguire dopo la distribuzione della funzione, necessaria per le distribuzioni Linux.

Per altre informazioni sulla flessibilità di questa attività, vedere la documentazione relativa all'attività App per le funzioni di Azure.

Aggiungere il codice evidenziato seguente alla fine della pipeline.

- stage: 'Deploy'
  displayName: 'Deploy the web application'
  dependsOn: Build
  jobs:
  - deployment: Deploy
    pool:
      vmImage: 'ubuntu-20.04'
    environment: spike
    variables:
    - group: Release
    strategy:
      runOnce:
        deploy:
          steps:
          - download: current
            artifact: drop
          - task: AzureWebApp@1
            displayName: 'Azure App Service Deploy: website'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appName: '$(WebAppName)'
              appType: webAppLinux
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.Web.zip'

          - task: AzureFunctionApp@1
            displayName: 'Azure Function Deploy: leaderboard'
            inputs:
              azureSubscription: 'Resource Manager - Tailspin - Space Game'
              appType: functionAppLinux
              appName: '$(LeaderboardAppName)'
              package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
              runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
              startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

Suggerimento

In un file YAML, lo spazio vuoto è importante. Assicurarsi che l'attività aggiunta qui usi lo stesso rientro dell'attività precedente.

Aggiungere un'attività per aggiornare le impostazioni dell'app servizio app

Andy: ora è sufficiente configurare l'app Web per usare l'API del tabellone punteggi pubblicata. In genere si configurano le variabili nel portale, ma sarebbe meglio farlo qui. Si prevede un parametro App Impostazioni denominato LeaderboardFunctionUrl.

Mara: Sono d'accordo. L'aggiunta di un'attività per tale attività alla pipeline consentirà di evitare supervisione accidentali lungo la strada se si modifica uno dei due servizi. Possiamo metterlo proprio alla fine.

Aggiungere il codice evidenziato seguente alla fine della pipeline. Assicurarsi di far corrispondere il rientro dell'attività al di sopra di esso. Per altre informazioni su questa attività, vedere la documentazione relativa all'attività Impostazioni del servizio app di Azure.

- task: AzureFunctionApp@1
  displayName: 'Azure Function Deploy: leaderboard'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appType: functionAppLinux
    appName: '$(LeaderboardAppName)'
    package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/Tailspin.SpaceGame.LeaderboardFunction.zip'
    runtimeStack: DOCKER|microsoft/azure-functions-dotnet:4
    startUpCommand: 'func azure functionapp publish $(functionAppName) --no-bundler'

- task: AzureAppServiceSettings@1
  displayName: 'Update web app settings'
  inputs:
    azureSubscription: 'Resource Manager - Tailspin - Space Game'
    appName: $(WebAppName)
    resourceGroupName: $(ResourceGroupName)
    appSettings: |
      [
        {
          "name": "AppSettings__LeaderboardFunctionUrl",
          "value": "http://$(LeaderboardAppName).azurewebsites.net/api/LeaderboardFunction",
          "slotSetting": false
        }
      ]

Salvare la pipeline per attivare una compilazione e il rilascio

  1. Selezionare Salva nell'angolo superiore destro della pagina. Confermare l'operazione Salva per attivare un'esecuzione.

  2. In Azure Pipelines passare alla compilazione. Tracciare quindi la compilazione durante l'esecuzione.

  3. Al termine della compilazione, selezionare l'attività di distribuzione del sito Web e selezionare l'URL per visualizzare il sito distribuito.

    A screenshot of Azure Pipelines, showing the location of the web site URL.

  4. Si otterrà una pagina con il sito in esecuzione nel servizio app. Scorrere verso il basso per verificare che nel tabellone punteggi siano presenti dati reali. Questa funzionalità è basata sull'app per le funzioni.

    A screenshot of the Space Game web site.

    Nota

    Se si verifica un errore durante il caricamento del tabellone punteggi, verificare i passaggi seguiti in questo modulo. Se viene visualizzato il messaggio di eccezione "Tentativo di accesso al socket con modalità non consentite dalle rispettive autorizzazioni di accesso", assicurarsi che l'impostazione AppSettings__LeaderboardFunctionUrl del servizio app sia stata specificata correttamente.

  5. È anche possibile testare direttamente l'app per le funzioni. È sufficiente passare all'URL usando il formato seguente. La risposta è JSON, che dovrebbe essere visualizzata come testo nel browser.

    http://<leaderboard function name>.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

    Come

    http://tailspin-space-game-leaderboard-4692.azurewebsites.net/api/LeaderboardFunction?pageSize=10
    

    A screenshot of a web browser showing the JSON response from the leaderboard API Azure Functions app.

Andy: È un ottimo risultato Tutti dovrebbero essere abbastanza impressionati dal potenziale che abbiamo mostrato qui.