Distribuire un'app Web in una pipeline e configurare l'autenticazione servizio app
Questo articolo descrive come configurare una pipeline in Azure Pipelines per compilare e distribuire un'app Web in Azure e abilitare l'autenticazione predefinita del servizio app Azure.
Nello specifico:
- Configurare le risorse di Azure usando script in Azure Pipelines
- Creare un'applicazione Web e distribuirla in servizio app usando Azure Pipelines
- Creare una registrazione dell'app Microsoft Entra in Azure Pipelines
- Configurare servizio app'autenticazione predefinita in Azure Pipelines.
Prerequisiti
- Un account Azure con una sottoscrizione attiva. Creare un account gratuitamente.
- Un'organizzazione Azure DevOps. Crearne una gratuitamente.
- Per usare gli agenti ospitati da Microsoft, l'organizzazione Azure DevOps deve avere accesso ai processi paralleli ospitati da Microsoft. Controllare i processi paralleli e richiedere una concessione gratuita.
- Tenant di Microsoft Entra.
- Un account GitHub e la configurazione git in locale.
- Requisito minimo di .NET 6.0 SDK.
Creare un'app Web di esempio ASP.NET Core
Creare un'app di esempio ed eseguirne il push nel repository GitHub.
Creare e clonare un repository in GitHub
Creare un nuovo repository in GitHub, specificare un nome come "PipelinesTest". Impostarlo su Privato e aggiungere un file con estensione gitignore con .getignore template: VisualStudio
.
Aprire una finestra del terminale e modificare la directory di lavoro corrente nel percorso in cui si vuole clonare la directory:
cd c:\temp\
Immettere il comando seguente per clonare il repository:
git clone https://github.com/YOUR-USERNAME/PipelinesTest
cd PipelinesTest
Creare un'app Web ASP.NET Core
Aprire una finestra del terminale nel computer in una directory di lavoro. Creare una nuova app Web ASP.NET Core usando il comando dotnet new webapp e quindi modificare le directory nell'app appena creata.
dotnet new webapp -n PipelinesTest --framework net7.0 cd PipelinesTest dotnet new sln dotnet sln add .
Dalla stessa sessione del terminale eseguire l'applicazione in locale usando il comando dotnet run.
dotnet run --urls=https://localhost:5001/
Per verificare che l'app Web sia in esecuzione, aprire un Web browser e passare all'app all'indirizzo
https://localhost:5001
.
Nella pagina viene visualizzato il modello ASP.NET'app Web Core.
Immettere CTRL-C nella riga di comando per interrompere l'esecuzione dell'app Web.
Eseguire il push dell'esempio in GitHub
Eseguire il commit delle modifiche ed eseguire il push in GitHub:
git add .
git commit -m "Initial check-in"
git push origin main
Configurare l'ambiente Azure DevOps
Accedere all'organizzazione di Azure DevOps (https://dev.azure.com/{yourorganization}
).
Creare un nuovo progetto:
- Selezionare New project (Nuovo progetto).
- Immettere un nome di progetto, ad esempio "PipelinesTest".
- Selezionare Visibilità privata .
- Seleziona Crea.
Crea una nuova pipeline
Dopo aver creato il progetto, aggiungere una pipeline:
- Nel riquadro di spostamento sinistro selezionare Pipelines-Pipelines> e quindi selezionare Crea pipeline.
- Seleziona GitHub YAML.
- Nella scheda Connessione selezionare GitHub YAML. Quando richiesto, immettere le credenziali di GitHub.
- Quando viene visualizzato l'elenco dei repository, selezionare il
PipelinesTest
repository. - È possibile che si venga reindirizzati a GitHub per installare l'app Azure Pipelines. In tal caso, selezionare Approva e installa.
- In Configurare la pipeline selezionare la pipeline di avvio.
- Viene visualizzata una nuova pipeline con una configurazione di base. La configurazione predefinita usa un agente ospitato da Microsoft.
- Quando si è pronti, selezionare Salva ed esegui. Per eseguire il commit delle modifiche in GitHub e avviare la pipeline, scegliere Esegui commit direttamente nel ramo principale e selezionare Salva ed esegui una seconda volta. Se viene richiesto di concedere l'autorizzazione con un messaggio come Questa pipeline richiede l'autorizzazione per accedere a una risorsa prima che l'esecuzione possa continuare, scegliere Visualizza e seguire le istruzioni per consentire l'accesso.
Aggiungere una fase di compilazione e compilare attività alla pipeline
Ora che si dispone di una pipeline di lavoro, è possibile aggiungere una fase di compilazione e compilare attività per compilare l'app Web.
Aggiornare azure-pipelines.yml e sostituire la configurazione della pipeline di base con quanto segue:
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
Salvare le modifiche ed eseguire la pipeline.
Viene definita una fase Build
per compilare l'app Web. steps
Nella sezione vengono visualizzate varie attività per compilare l'app Web e pubblicare elementi nella pipeline.
- NuGetToolInstaller@1 acquisisce NuGet e lo aggiunge al percorso.
- NuGetCommand@2 ripristina i pacchetti NuGet nella soluzione.
- VSBuild@1 compila la soluzione con MSBuild e crea pacchetti i risultati della compilazione dell'app (incluse le relative dipendenze) come file .zip in una cartella.
- PublishBuildArtifacts@1 pubblica il file .zip in Azure Pipelines.
Creare una connessione al servizio
Aggiungere una connessione al servizio in modo che la pipeline possa connettere e distribuire risorse in Azure:
- Selezionare Impostazioni progetto.
- Nel riquadro di spostamento a sinistra selezionare Connessioni al servizio e quindi Crea connessione al servizio.
- Selezionare Azure Resource Manager e quindi Avanti.
- Selezionare Entità servizio (automatico) e quindi Avanti.
- Selezionare Sottoscrizione per livello di ambito e selezionare la sottoscrizione di Azure. Immettere un nome di connessione al servizio, ad esempio "PipelinesTestService Connessione ion" e selezionare Avanti. Il nome della connessione al servizio viene usato nei passaggi seguenti.
Viene creata anche un'applicazione nel tenant di Microsoft Entra che fornisce un'identità per la pipeline. È necessario il nome visualizzato della registrazione dell'app nei passaggi successivi. Per trovare il nome visualizzato:
- Accedere all'interfaccia di amministrazione di Microsoft Entra come almeno uno sviluppatore di applicazioni.
- Passare a Applicazioni di identità>> Registrazioni app> Tutte le applicazioni.
- Trovare il nome visualizzato della registrazione dell'app, che è nel formato
{organization}-{project}-{guid}
.
Concedere all'utente l'autorizzazione di connessione al servizio per accedere alla pipeline:
- Nel riquadro di spostamento sinistro selezionare Impostazioni progetto e quindi Connessioni al servizio.
- Selezionare la connessione al servizio PipelinesTestService Connessione ion, quindi i puntini di sospensione e quindi sicurezza dal menu a discesa.
- Nella sezione Autorizzazioni pipeline selezionare Aggiungi pipeline e selezionare la connessione al servizio PipelinesTest dall'elenco.
Aggiungere un gruppo di variabili
La DeployAzureResources
fase creata nella sezione successiva usa diversi valori per creare e distribuire risorse in Azure:
- ID tenant di Microsoft Entra (disponibile nell'interfaccia di amministrazione di Microsoft Entra).
- Area o località in cui vengono distribuite le risorse.
- Nome di un gruppo di risorse.
- Nome del piano di servizio servizio app.
- il nome dell'app Web.
- Nome della connessione al servizio usata per connettere la pipeline ad Azure. Nella pipeline questo valore viene usato per la sottoscrizione di Azure.
Creare un gruppo di variabili e aggiungere valori da usare come variabili nella pipeline.
Selezionare Libreria nel riquadro di spostamento a sinistra e creare un nuovo gruppo di variabili. Assegnare il nome "AzureResourcesVariableGroup".
Aggiungere le variabili e i valori seguenti:
Nome variabile | Valore di esempio |
---|---|
LOCATION | centralus |
TENANTID | {tenant-id} |
RESOURCEGROUPNAME | pipelinetestgroup |
SVCPLANNAME | pipelinetestplan |
WEBAPPNAMETEST | pipelinetestwebapp |
AZURESUBSCRIPTION | PipelinesTestService Connessione ion |
Seleziona Salva.
Concedere alla pipeline le autorizzazioni per accedere al gruppo di variabili. Nella pagina gruppo di variabili selezionare Autorizzazioni pipeline, aggiungere la pipeline e quindi chiudere la finestra.
Aggiornare azure-pipelines.yml e aggiungere il gruppo di variabili alla pipeline.
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
Salvare le modifiche ed eseguire la pipeline.
Distribuire le risorse di Azure
Aggiungere quindi una fase alla pipeline che distribuisce le risorse di Azure. La pipeline usa uno script inline per creare l'istanza di servizio app. In un passaggio successivo, lo script inline crea una registrazione dell'app Microsoft Entra per l'autenticazione servizio app. Viene usato uno script bash dell'interfaccia della riga di comando di Azure perché Azure Resource Manager (e le attività di Azure Pipelines) non possono creare una registrazione dell'app.
Lo script inline viene eseguito nel contesto della pipeline, assegnare application.Amministrazione ruolo istrator per l'app in modo che lo script possa creare registrazioni dell'app:
- Accedi all'Interfaccia di amministrazione di Microsoft Entra.
- Passare a Ruoli di identità>e ruoli amministratori e amministratori.>
- Selezionare Application Amministrazione istrator nell'elenco dei ruoli predefiniti e quindi Aggiungi assegnazione.
- Cercare la registrazione dell'app pipeline in base al nome visualizzato.
- Selezionare la registrazione dell'app dall'elenco e selezionare Aggiungi.
Aggiornare azure-pipelines.yml per aggiungere lo script inline, che crea un gruppo di risorse in Azure, crea un piano servizio app e crea un'istanza di servizio app.
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: DeployAzureResources
displayName: 'Deploy resources to Azure'
dependsOn: Build
condition: |
succeeded()
jobs:
- job: DeployAzureResources
pool:
vmImage: 'windows-latest'
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(AZURESUBSCRIPTION)
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Create a resource group
az group create --location $LOCATION --name $RESOURCEGROUPNAME
echo "Created resource group $RESOURCEGROUPNAME"
# Create App Service plan
az appservice plan create -g $RESOURCEGROUPNAME -n $SVCPLANNAME --sku FREE
echo "Created App Service plan $SVCPLANNAME"
### Create Test resources
# create and configure an Azure App Service web app
az webapp create -g $RESOURCEGROUPNAME -p $SVCPLANNAME -n $WEBAPPNAMETEST -r "dotnet:7"
name: DeploymentScript
Salvare le modifiche ed eseguire la pipeline. Nella portale di Azure passare a Gruppi di risorse e verificare che venga creato un nuovo gruppo di risorse e servizio app istanza.
Distribuire l'app Web in servizio app
Ora che la pipeline sta creando risorse in Azure, una fase di distribuzione per distribuire l'app Web in servizio app.
Aggiornare azure-pipelines.yml per aggiungere la fase di distribuzione.
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: DeployAzureResources
displayName: 'Deploy resources to Azure'
dependsOn: Build
condition: |
succeeded()
jobs:
- job: DeployAzureResources
pool:
vmImage: 'windows-latest'
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(AZURESUBSCRIPTION)
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Create a resource group
az group create --location $LOCATION --name $RESOURCEGROUPNAME
echo "Created resource group $RESOURCEGROUPNAME"
# Create App Service plan
az appservice plan create -g $RESOURCEGROUPNAME -n $SVCPLANNAME --sku FREE
echo "Created App Service plan $SVCPLANNAME"
### Create Test resources
# create and configure an Azure App Service web app
az webapp create -g $RESOURCEGROUPNAME -p $SVCPLANNAME -n $WEBAPPNAMETEST -r "dotnet:7"
name: DeploymentScript
- stage: DeployWebApp
displayName: 'Deploy the web app'
dependsOn: DeployAzureResources
condition: |
succeeded()
jobs:
- job: DeployWebApp
displayName: 'Deploy Web App'
pool:
vmImage: 'windows-latest'
steps:
- task: DownloadBuildArtifacts@0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
downloadPath: '$(System.DefaultWorkingDirectory)'
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: $(AZURESUBSCRIPTION)
appType: 'webApp'
WebAppName: '$(WEBAPPNAMETEST)'
packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
Salvare le modifiche ed eseguire la pipeline.
Una DeployWebApp
fase viene definita con diverse attività:
- DownloadBuildArtifacts@1 scarica gli artefatti di compilazione pubblicati nella pipeline in una fase precedente.
- AzureRmWebAppDeployment@4 distribuisce l'app Web in servizio app.
Visualizzare il sito Web distribuito in servizio app. Passare al servizio app e selezionare il dominio predefinito dell'istanza: https://pipelinetestwebapp.azurewebsites.net
.
Pipelinetestwebapp è stata distribuita correttamente in servizio app.
Configurare l'autenticazione servizio app
Ora che la pipeline distribuisce l'app Web in servizio app, è possibile configurare l'autenticazione predefinita servizio app. Modificare lo script inline in in DeployAzureResources
per:
- Creare una registrazione dell'app Microsoft Entra come identità per l'app Web. Per creare una registrazione dell'app, l'entità servizio per l'esecuzione della pipeline richiede il ruolo Application Amministrazione istrator nella directory.
- Ottenere un segreto dall'app.
- Configurare l'impostazione del segreto per l'app Web servizio app.
- Configurare le impostazioni dell'URI di reindirizzamento, dell'URI della home page e dell'autorità emittente per l'app Web servizio app.
- Configurare altre impostazioni nell'app Web.
variables:
- group: AzureResourcesVariableGroup
trigger:
- main
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)\WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
publishLocation: 'Container'
- stage: DeployAzureResources
displayName: 'Deploy resources to Azure'
dependsOn: Build
condition: |
succeeded()
jobs:
- job: DeployAzureResources
pool:
vmImage: 'windows-latest'
steps:
- task: AzureCLI@2
inputs:
azureSubscription: $(AZURESUBSCRIPTION)
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Create a resource group
az group create --location $LOCATION --name $RESOURCEGROUPNAME
echo "Created resource group $RESOURCEGROUPNAME"
# Create App Service plan
az appservice plan create -g $RESOURCEGROUPNAME -n $SVCPLANNAME --sku FREE
echo "Created App Service plan $SVCPLANNAME"
### Create Test resources
# create and configure an Azure App Service web app
az webapp create -g $RESOURCEGROUPNAME -p $SVCPLANNAME -n $WEBAPPNAMETEST -r "dotnet:7"
redirectUriTest="https://$WEBAPPNAMETEST.azurewebsites.net/.auth/login/aad/callback"
homePageUrlTest="https://$WEBAPPNAMETEST.azurewebsites.net"
issuerTest="https://sts.windows.net/$TENANTID"
# Required resource access. Access Microsoft Graph with delegated User.Read permissions.
cat > manifest.json << EOF
[
{
"resourceAppId": "00000003-0000-0000-c000-000000000000",
"resourceAccess": [
{
"id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
"type": "Scope"
}
]
}
]
EOF
# Create app registration for App Service authentication
appIdTest=$(az ad app create --display-name $WEBAPPNAMETEST --sign-in-audience AzureADMyOrg --enable-id-token-issuance true --query appId --output tsv)
echo "Created app registration $appIdTest"
# Set identifier URI, homepage, redirect URI, and resource access
az ad app update --id $appIdTest --identifier-uris api://$appIdTest --web-redirect-uris $redirectUriTest --web-home-page-url $homePageUrlTest --required-resource-accesses @manifest.json
echo "Updated app $appIdTest"
# Get secret from the app for App Service authentication
secretTest=$(az ad app credential reset --id $appIdTest --query password --output tsv)
echo "Added secret to app $appIdTest"
az config set extension.use_dynamic_install=yes_without_prompt
az extension add --name authV2
az webapp config appsettings set --name $WEBAPPNAMETEST --resource-group $RESOURCEGROUPNAME --slot-settings MICROSOFT_PROVIDER_AUTHENTICATION_SECRET=$secretTest
echo "Updated settings for web app $WEBAPPNAMETEST"
az webapp auth microsoft update --name $WEBAPPNAMETEST --resource-group $RESOURCEGROUPNAME --client-id $appIdTest --secret-setting MICROSOFT_PROVIDER_AUTHENTICATION_SECRET --allowed-audiences $redirectUriTest --issuer $issuerTest
echo "Updated authentication settings for $WEBAPPNAMETEST"
name: DeploymentScript
- stage: DeployWebApp
displayName: 'Deploy the web app'
dependsOn: DeployAzureResources
condition: |
succeeded()
jobs:
- job: DeployWebApp
displayName: 'Depoy Web App'
pool:
vmImage: 'windows-latest'
steps:
- task: DownloadBuildArtifacts@0
inputs:
buildType: 'current'
downloadType: 'single'
artifactName: 'drop'
downloadPath: '$(System.DefaultWorkingDirectory)'
- task: AzureRmWebAppDeployment@4
inputs:
ConnectionType: 'AzureRM'
azureSubscription: $(AZURESUBSCRIPTION)
appType: 'webApp'
WebAppName: '$(WEBAPPNAMETEST)'
packageForLinux: '$(System.DefaultWorkingDirectory)/**/*.zip'
Salvare le modifiche ed eseguire la pipeline.
Verificare l'accesso limitato all'app Web
Per verificare che l'accesso all'app sia limitato agli utenti dell'organizzazione, passare al servizio app e selezionare il dominio predefinito dell'istanza: https://pipelinetestwebapp.azurewebsites.net
.
Si dovrebbe essere indirizzati a una pagina di accesso protetta per verificare che gli utenti non autenticati non siano autorizzati ad accedere al sito. Eseguire l'accesso come utente nell'organizzazione per ottenere l'accesso al sito.
Si può anche avviare un nuovo browser e provare ad accedere con un account personale per verificare che gli utenti esterni all'organizzazione non siano autorizzati ad accedere.
Pulire le risorse
Pulire le risorse di Azure e l'ambiente Azure DevOps in modo che non vengano addebitati costi per le risorse al termine.
Eliminare il gruppo di risorse
Selezionare Gruppi di risorse dal menu e selezionare il gruppo di risorse che contiene l'app Web distribuita.
Fare clic su Elimina gruppo di risorse per eliminare il gruppo e tutte le risorse al suo interno.
Disabilitare la pipeline o eliminare il progetto Azure DevOps
È stato creato un progetto che punta a un repository GitHub. La pipeline viene attivata per l'esecuzione ogni volta che si esegue il push di una modifica al repository GitHub, richiedendo minuti di compilazione gratuiti o le risorse.
Opzione 1: Disabilitare la pipeline
Scegliere questa opzione se si vogliono mantenere il progetto di DevOps e la pipeline di compilazione per riferimento futuro. È possibile riabilitare la pipeline in un secondo momento se è necessario.
- All'interno del progetto Azure DevOps selezionare Pipeline e selezionare la pipeline.
- Selezionare il pulsante con i puntini di sospensione all'estrema destra e quindi selezionare Impostazioni.
- Selezionare Disabilitato e quindi Salva. La pipeline non elaborerà più richieste di compilazione.
Opzione 2: eliminare il progetto
Scegliere questa opzione se non è necessario mantenere il progetto di DevOps per riferimento futuro. In questo modo viene eliminato il progetto Azure DevOps.
- Passare al progetto Azure DevOps.
- Selezionare Impostazioni progetto nell'angolo in basso a sinistra.
- In Panoramica scorrere verso il basso fino alla parte inferiore della pagina e quindi selezionare Elimina.
- Digitare il nome del progetto nella casella di testo e quindi selezionare Elimina.
Eliminare le registrazioni dell'app in Microsoft Entra ID
Nell'interfaccia di amministrazione di Microsoft Entra selezionare Applicazioni> di identità>Registrazioni app> Tutte le applicazioni.
Selezionare l'applicazione per la pipeline, il nome visualizzato ha il formato {organization}-{project}-{guid}
e eliminarlo.
Selezionare l'applicazione per l'app Web, pipelinetestwebapp ed eliminarla.
Passaggi successivi
Altre informazioni su: