Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Usare Azure Pipelines per distribuire automaticamente il progetto di codice in un'app per le funzioni in Azure. 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.
Usare l'attività AzureFunctionApp per distribuire il codice. In questa tabella sono ora disponibili due versioni di AzureFunctionApp, che vengono confrontate:
| Confronto/versione | AzureFunctionApp@2 | AzureFunctionApp@1 |
|---|---|---|
| Supporta il piano di consumo flessibile | ✔ | ❌ |
| Include il supporto avanzato per la convalida* | ✔ | ❌ |
| Quando usare... | Consigliato per le nuove distribuzioni di app | Mantenuto per le distribuzioni legacy |
* Il supporto della convalida avanzata rende meno probabile che le pipeline non riescano a causa di errori.
Scegliere la versione dell'attività nella parte superiore dell'articolo.
Note
Eseguire l'aggiornamento da AzureFunctionApp@1 a AzureFunctionApp@2 per l'accesso alle nuove funzionalità e al supporto a lungo termine.
Prerequisiti
Un'organizzazione di Azure DevOps. Se non si ha tale account, è possibile crearne uno gratuitamente. Se il team ne ha già uno, assicurarsi di essere un amministratore del progetto Azure DevOps che si vuole usare.
Possibilità di eseguire pipeline su agenti ospitati da Microsoft. È possibile acquistare un processo in parallelo oppure richiedere un livello gratuito.
Se si prevede di usare GitHub invece di Azure Repos, è necessario anche un repository GitHub. Se non si dispone di un account GitHub, è possibile crearne uno gratuitamente.
Un'app per le funzioni esistente in Azure con il codice sorgente in un repository supportato. Se non si ha ancora un progetto di codice di Funzioni di Azure, è possibile crearne uno completando l'articolo specifico del linguaggio seguente:
Ricordarsi di caricare il progetto di codice locale nel repository GitHub o Azure Repos dopo la pubblicazione nell'app per le funzioni.
Creare l'app
- Accedere all'organizzazione di Azure DevOps e passare al progetto.
- Nel progetto passare alla pagina Pipeline. Quindi scegliere l'azione per creare una nuova pipeline.
- Eseguire i passaggi della procedura guidata selezionando prima di tutto GitHub come posizione del codice sorgente.
- 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 quello dell'app di esempio.
- Azure Pipelines analizzerà il repository e consiglierà un modello. Selezionare Salva ed esegui, quindi Commit directly to the main branch (Esegui il commit direttamente nel ramo principale) e infine di nuovo Salva ed esegui.
- Viene avviata una nuova esecuzione. Attendere che venga completata.
Pipeline di compilazione YAML di esempio
Per la compilazione di app, è possibile usare le pipeline specifiche del linguaggio seguenti.
È possibile usare l'esempio seguente per creare un file YAML per compilare un'app .NET:
pool:
vmImage: 'windows-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET 8.0 SDK'
inputs:
packageType: 'sdk'
version: '8.0.x'
installationPath: $(Agent.ToolsDirectory)/dotnet
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
projects: 'csharp/*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
- Accedere all'organizzazione di Azure DevOps e passare al progetto.
- Nel progetto passare alla pagina Pipeline. Selezionare quindi Nuova pipeline.
- Selezionare una di queste opzioni per Dove si trova il codice?:
- GitHub: si potrebbe essere reindirizzati a GitHub per l'accesso. In questo caso, immettere le credenziali di GitHub. Quando questa connessione è la prima connessione a GitHub, la procedura guidata illustra anche il processo di connessione di DevOps agli account GitHub.
- Azure Repos Git: è possibile scegliere immediatamente un repository nel progetto DevOps corrente.
- Quando viene visualizzato l'elenco dei repository, selezionare quello dell'app di esempio.
- Azure Pipelines analizza il repository e in Configurare la pipeline fornisce un elenco di modelli potenziali. Scegliere il modello app per le funzioni appropriato per la lingua. Se il modello corretto non viene visualizzato, selezionare Mostra altro.
- Selezionare Salva ed esegui, quindi Commit directly to the main branch (Esegui il commit direttamente nel ramo principale) e infine di nuovo Salva ed esegui.
- Viene avviata una nuova esecuzione. Attendere che venga completata.
Pipeline di compilazione YAML di esempio
Per la compilazione di app, è possibile usare le pipeline specifiche del linguaggio seguenti.
È possibile usare l'esempio seguente per creare un file YAML per compilare un'app .NET.
Se vengono visualizzati errori durante la compilazione dell'app, verificare che la versione di .NET usata corrisponda alla versione di Funzioni di Azure. Per altre informazioni, vedere Panoramica delle versioni del runtime per Funzioni di Azure.
pool:
vmImage: 'windows-latest'
steps:
- task: UseDotNet@2
displayName: 'Install .NET 8.0 SDK'
inputs:
packageType: 'sdk'
version: '8.0.x'
installationPath: $(Agent.ToolsDirectory)/dotnet
- script: |
dotnet restore
dotnet build --configuration Release
- task: DotNetCoreCLI@2
displayName: 'dotnet publish'
inputs:
command: publish
arguments: '--configuration Release --output $(System.DefaultWorkingDirectory)/publish_output'
projects: 'csharp/*.csproj'
publishWebProjects: false
modifyOutputPath: false
zipAfterPublish: false
- task: ArchiveFiles@2
displayName: "Archive files"
inputs:
rootFolderOrFile: "$(System.DefaultWorkingDirectory)/publish_output"
includeRootFolder: false
archiveFile: "$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip"
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip'
artifactName: 'drop'
Distribuire l'app Web
Si distribuirà con l'attività Distribuzione v2 app per le funzioni di Azure. Questa attività richiede una Connessione al servizio di Azure come input. Una connessione al servizio di Azure archivia le credenziali per connettersi da Azure Pipelines ad Azure. È consigliabile creare una connessione che usa la federazione dell'identità del carico di lavoro.
Per eseguire la distribuzione in Funzioni di Azure, aggiungere questo frammento di codice alla fine del azure-pipelines.yml file, a seconda che l'app venga eseguita in Linux o Windows:
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <Name of your Azure subscription>
appName: <Name of the function app>
# Agent VM image name
vmImageName: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <Name of your Azure subscription>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
#Uncomment the next lines to deploy to a deployment slot
#Note that deployment slots is not supported for Linux Dynamic SKU
#deployToSlotOrASE: true
#resourceGroupName: '<RESOURCE_GROUP>'
#slotName: '<SLOT_NAME>'
Il valore predefinito appType è Windows (functionApp). È possibile specificare Linux impostando appType su functionAppLinux. Un'app Flex Consumption viene eseguita in Linux ed è necessario impostare sia appType: functionAppLinux che isFlexConsumption: true.
Il frammento presuppone che i passaggi di compilazione nel file YAML producano l'archivio ZIP nella cartella $(System.ArtifactsDirectory) dell'agente.
Si distribuirà con l'attività Distribuzione app per le funzioni di Azure. Questa attività richiede una Connessione al servizio di Azure come input. Una connessione al servizio di Azure archivia le credenziali per connettersi da Azure Pipelines ad Azure.
Importante
La distribuzione in un'app Flex Consumption non è supportata utilizzando @v1 dell'attivitàAzureFunctionApp.
Per eseguire la distribuzione in Funzioni di Azure, aggiungere questo frammento di codice alla fine del azure-pipelines.yml file:
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <Name of your Azure subscription>
appName: <Name of the function app>
# Agent VM image name
vmImageName: 'ubuntu-latest'
- task: DownloadBuildArtifacts@1 # Add this at the end of your file
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
itemPattern: '**/*.zip'
downloadPath: '$(System.ArtifactsDirectory)'
- task: AzureFunctionApp@1
inputs:
azureSubscription: $(azureSubscription)
appType: functionAppLinux # default is functionApp
appName: $(appName)
package: $(System.ArtifactsDirectory)/**/*.zip
Questo frammento di codice imposta il appType su functionAppLinux, necessario per la distribuzione su un'applicazione che gira su Linux. Il valore predefinito appType è Windows (functionApp).
L'esempio presuppone che i passaggi di compilazione nel file YAML producano l'archivio ZIP nella cartella dell'agente $(System.ArtifactsDirectory) .
Distribuire un contenitore
Suggerimento
È consigliabile usare il supporto di Azure Functions in Azure Container Apps per ospitare l'app per le funzioni in un contenitore personalizzato di Linux. Per altre informazioni, vedere Panoramica di Funzioni di Azure in App Azure Container.
Quando si distribuisce un'app per le funzioni in contenitori, l'attività di distribuzione usata dipende dall'ambiente di hosting specifico.
È possibile usare l'attività Distribuisci app di Azure Container (AzureContainerApps) per distribuire un'immagine di un'app per le funzioni in un'istanza di Azure Container App ottimizzata per Azure Functions.
Questo codice distribuisce l'immagine di base per un'app per le funzioni del modello di processo isolato .NET 8:
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: AzureContainerApps@1
inputs:
azureSubscription: <Name of your Azure subscription>
imageToDeploy: 'mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated8.0'
containerAppName: <Name of your container app>
resourceGroup: <Name of the resource group>
Idealmente, è consigliabile creare un contenitore personalizzato nella pipeline anziché usare un'immagine di base, come illustrato in questo esempio. Per altre informazioni, vedere Distribuire nelleApp contenitore di Azure da Azure Pipelines.
Eseguire la distribuzione in uno slot
Importante
Il piano Flex Consumption attualmente non supporta gli slot. Le app Linux non supportano gli slot quando vengono eseguite in un piano a consumo e il supporto per queste app sarà ritirato in futuro.
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <Name of your Azure subscription>
appName: <Name of the function app>
# Agent VM image name
vmImageName: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <Name of your Azure subscription>
appType: functionApp # this specifies a Windows-based function app
appName: $(appName)
package: $(System.DefaultWorkingDirectory)/build$(Build.BuildId).zip
deploymentMethod: 'auto' # 'auto' | 'zipDeploy' | 'runFromPackage'. Required. Deployment method. Default: auto.
deployToSlotOrASE: true
resourceGroupName: '<RESOURCE_GROUP>'
slotName: '<SLOT_NAME>'
È possibile configurare l'app per le funzioni in modo che disponga di più slot. Gli slot consentono di distribuire in modo sicuro l'app e testarla prima di renderla disponibile ai clienti.
Il frammento di codice YAML seguente illustra come eseguire la distribuzione in uno slot di staging e quindi passare a uno slot di produzione:
- task: AzureFunctionApp@1
inputs:
azureSubscription: <Azure service connection>
appType: functionAppLinux
appName: <Name of the function app>
package: $(System.ArtifactsDirectory)/**/*.zip
deployToSlotOrASE: true
resourceGroupName: <Name of the resource group>
slotName: staging
- task: AzureAppServiceManage@0
inputs:
azureSubscription: <Azure service connection>
WebAppName: <name of the function app>
ResourceGroupName: <name of resource group>
SourceSlot: staging
SwapWithProduction: true
Quando si usano gli slot di distribuzione, è anche possibile aggiungere l'attività seguente per eseguire uno scambio di slot come parte della distribuzione.
- task: AzureAppServiceManage@0
inputs:
azureSubscription: <AZURE_SERVICE_CONNECTION>
WebAppName: <APP_NAME>
ResourceGroupName: <RESOURCE_GROUP>
SourceSlot: <SLOT_NAME>
SwapWithProduction: true
Creare una pipeline con l'interfaccia della riga di comando di Azure
Per creare una pipeline di compilazione in Azure, usare il az functionapp devops-pipeline createcomando. La pipeline di compilazione viene creata per compilare e rilasciare tutte le modifiche al codice apportate nel repository. Il comando genera un nuovo file YAML che definisce la pipeline di compilazione e versione e quindi ne esegue il commit nel repository. I prerequisiti per questo comando dipendono dalla posizione del codice.
Se il codice si trova in GitHub:
È necessario disporre di autorizzazioni di scrittura per la sottoscrizione.
È necessario essere l'amministratore del progetto in Azure DevOps.
È necessario disporre delle autorizzazioni per creare un token di accesso personale (PAT) di GitHub con autorizzazioni sufficienti. Per altre informazioni, vedere Requisiti di autorizzazione PAT di GitHub.
È necessario disporre delle autorizzazioni per eseguire il commit nel ramo principale nel repository GitHub in modo da poter eseguire il commit del file YAML generato automaticamente.
Se il codice si trova in Azure Repos:
È necessario disporre di autorizzazioni di scrittura per la sottoscrizione.
È necessario essere l'amministratore del progetto in Azure DevOps.
Passaggi successivi
- Esaminare la Panoramica di Funzioni di Azure.
- Esaminare la Panoramica di Azure DevOps.