Implementación de una aplicación web de Azure
Creación de un proyecto de .NET
Si no tiene un proyecto de .NET con el que trabajar, cree uno nuevo y cargue el código en el repositorio de GitHub o Azure Repos. Empiece por instalar el SDK de .NET 6.0 más reciente.
Cree una nueva aplicación web de .NET 6.
dotnet new webapp -f net6.0
Desde la misma sesión de terminal, ejecute la aplicación localmente mediante el dotnet run comando desde el directorio del proyecto.
dotnet run
Cargar el código
Upload el código a la nueva aplicación web GitHub o Azure Repos:
Creación de la canalización
Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.
Vaya a Pipelinesy, a continuación, seleccione Nueva canalización.
Siga los pasos del asistente y seleccione primero GitHub como ubicación del código fuente.
Puede que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub.
Cuando aparezca la lista de repositorios, seleccione el que corresponda.
Es posible que se le redirija a GitHub para instalar la aplicación Azure Pipelines. Si es así, seleccione Aprobar instalación.
Cuando aparezca la pestaña Configurar, seleccione ASP.NET Core.
Cuando aparezca la nueva canalización, echa un vistazo a YAML para ver lo que hace. Cuando esté listo, seleccione Guardar y ejecute.
Adición de la tarea Aplicación web de Azure
Use el Asistente para tareas para agregar la tarea Aplicación web de Azure.
Seleccione Azure Resource Manager tipo de conexión y elija la suscripción de Azure. Asegúrese de autorizar la conexión.
Seleccione Aplicación web en Linux y escriba , y
appNamepackage. El YAML completo debe tener este aspecto.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: '<Azure service connection>' appType: 'webAppLinux' appName: '<Name of web app>' package: '$(System.DefaultWorkingDirectory)/**/*.zip'- azureSubscription: su suscripción a Azure.
- appName: el nombre del servicio de aplicaciones existente.
- package: la ruta de acceso del archivo al paquete o una carpeta que contiene el contenido del servicio de aplicaciones. Se admite caracteres comodín.
Todavía no estamos aconsejando a los nuevos usuarios que usen canalizaciones YAML para implementar desde Azure DevOps Server 2019. Si es un usuario de canalización experimentado y ya tiene una canalización de YAML para compilar la aplicación .NET Core, es posible que los ejemplos siguientes le sean útiles.
Las canalizaciones yaml no están disponibles en TFS.
Ahora está listo para leer el resto de este tema para conocer algunos de los cambios más comunes que los usuarios hacen para personalizar una implementación de aplicación web de Azure.
Uso de la tarea Aplicación web de Azure
La manera más sencilla de implementar en una aplicación web de Azure es usar la tarea Aplicación web de Azure ().
Implementar un paquete Web Deploy (ASP.NET)
Para implementar un paquete .zip Web Deploy (por ejemplo, desde una aplicación web de ASP.NET) enuna aplicación web de Azure, agregue el siguiente fragmento de código al archivo azure-pipelines.yml:
- task: AzureWebApp@1
inputs:
azureSubscription: '<Azure service connection>'
appName: '<Name of web app>'
package: $(System.DefaultWorkingDirectory)/**/*.zip
- azureSubscription: su suscripción a Azure.
- appName: el nombre del servicio de aplicaciones existente.
- package: la ruta de acceso del archivo al paquete o una carpeta que contiene el contenido del servicio de aplicaciones. Se admite caracteres comodín.
En el fragmento de código se da por supuesto que los pasos de compilación del archivo YAML generan el archivo ZIP en $(System.DefaultWorkingDirectory) la carpeta del agente.
Para obtener información sobre las conexiones de servicio de Azure, consulte la sección siguiente.
Implementación de una aplicación .NET
Si va a compilar una aplicación de .NET Core,use el siguiente recortado para implementar la compilación en una aplicación.
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: '<Azure service connection>'
appType: 'webAppLinux'
appName: '<Name of web app>'
package: '$(System.DefaultWorkingDirectory)/**/*.zip'
- azureSubscription: su suscripción a Azure.
- appType: el tipo de aplicación web.
- appName: el nombre del servicio de aplicaciones existente.
- package: la ruta de acceso del archivo al paquete o una carpeta que contiene el contenido del servicio de aplicaciones. Se admite caracteres comodín.
Implementación de una aplicación de Node.js JavaScript
Si va a compilar una aplicación de Node.js JavaScript,publicará todo el contenido del directorio de trabajo en la aplicación web. Este fragmento de código también genera un Web.config durante la implementación si la aplicación no tiene uno e inicia el controlador iisnode en la aplicación web de Azure:
- task: AzureWebApp@1
inputs:
azureSubscription: '<Azure service connections>'
appName: '<Name of web app>'
package: '$(System.DefaultWorkingDirectory)'
customWebConfig: '-Handler iisnode -NodeStartFile server.js -appType node'
- azureSubscription: su suscripción a Azure.
- appName: el nombre del servicio de aplicaciones existente.
- package: la ruta de acceso del archivo al paquete o una carpeta que contiene el contenido del servicio de aplicaciones. Se admite caracteres comodín.
- customWebConfig:genere web.config parámetros para aplicaciones python, Node.js, Go y Java. Se generará
web.confige implementará un archivo estándar en Azure App Service si la aplicación no tiene uno.
Para obtener información sobre las conexiones de servicio de Azure, consulte la sección siguiente.
Las canalizaciones yaml no están disponibles en TFS.
Uso de una conexión de servicio
Para implementar en Azure App Service, deberá usar una conexión de Azure Resource Manager servicio . La conexión de servicio de Azure almacena las credenciales para conectarse Azure Pipelines o Azure DevOps Server a Azure.
Obtenga más información sobre Azure Resource Manager conexiones de servicio. Si la conexión de servicio no funciona según lo previsto, consulte Solución de problemas de conexiones de servicio.
Necesitará una conexión de servicio de Azure para la AzureWebApp tarea. La conexión de servicio de Azure almacena las credenciales para conectarse Azure Pipelines a Azure. Consulte Creación de una conexión de servicio de Azure.
Las canalizaciones yaml no están disponibles en TFS.
Implementación en una aplicación virtual
De forma predeterminada, la implementación se produce en la aplicación raíz de la aplicación web de Azure. Puede implementar en una aplicación virtual específica mediante la VirtualApplication propiedad de la tarea AzureRmWebAppDeployment :
- task: AzureRmWebAppDeployment@4
inputs:
VirtualApplication: '<name of virtual application>'
- VirtualApplication:el nombre de la aplicación virtual que se ha configurado en el Azure Portal. Consulte Configuración de App Service aplicación en el Azure Portal para obtener más detalles.
Las canalizaciones yaml no están disponibles en TFS.
Implementación en una ranura
Puede configurar la aplicación web de Azure para que tenga varias ranuras. Las ranuras permiten implementar la aplicación de forma segura y probarla antes de ponerla a disposición de los clientes.
En el ejemplo siguiente se muestra cómo implementar en un espacio de ensayo y, a continuación, cambiar a un espacio de producción:
- task: AzureWebApp@1
inputs:
azureSubscription: '<Azure service connection>'
appType: webAppLinux
appName: '<name of web app>'
deployToSlotOrASE: true
resourceGroupName: '<name of resource group>'
slotName: staging
- task: AzureAppServiceManage@0
inputs:
azureSubscription: '<Azure service connection>'
appType: webAppLinux
WebAppName: '<name of web app>'
ResourceGroupName: '<name of resource group>'
SourceSlot: staging
SwapWithProduction: true
- azureSubscription: su suscripción a Azure.
- appType: (opcional) Use para implementar en una aplicación web en Linux.
- appName: el nombre del servicio de aplicaciones existente.
- deployToSlotOrASE:booleano. Implemente en una ranura de implementación existente o Azure App Service Environment.
- resourceGroupName:nombre del grupo de recursos. Obligatorio si
deployToSlotOrASEes true. - slotName:nombre de la ranura, el valor predeterminado es . Obligatorio si
deployToSlotOrASEes true. - SourceSlot:ranura enviada a producción cuando es true.
- SwapWithProduction:booleano. Intercambie el tráfico de la ranura de origen con producción.
Las canalizaciones yaml no están disponibles en TFS.
Implementación en varias aplicaciones web
Puede usar trabajos en el archivo YAML para configurar una canalización de implementaciones. Mediante el uso de trabajos, puede controlar el orden de implementación en varias aplicaciones 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: '<Azure service connection>'
appType: <app type>
appName: '<name of test stage web app>'
deployToSlotOrASE: true
resourceGroupName: <resource 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:
buildType: 'current'
artifactName: 'drop'
targetPath: '$(Pipeline.Workspace)'
- task: AzureWebApp@1
inputs:
azureSubscription: '<Azure service connection>'
appType: <app type>
appName: '<name of test stage web app>'
resourceGroupName: <resource group name>
package: '$(Pipeline.Workspace)/**/*.zip'
Las canalizaciones yaml no están disponibles en TFS.
Cambios en la configuración
Para la mayoría de las pilas de idioma, la configuración de la aplicación y las cadenas de conexión se pueden establecer como variables de entorno en tiempo de ejecución. La configuración de la aplicación también se puede resolver desde Key Vault mediante las referencias de Key Vault.
Para ASP.NET y ASP.NET Core desarrolladores, establecer la configuración de la aplicación en App Service es como establecerlos en <appSettings> en Web.config. Es posible que quiera aplicar una configuración específica para el destino de la aplicación web antes de implementarla en él.
Esto resulta útil cuando se implementa la misma compilación en varias aplicaciones web en una canalización.
Por ejemplo, si el archivo Web.config contiene una cadena de conexión denominada , puede cambiar su valor antes connectionString de implementar en cada aplicación web. Puede hacerlo aplicando una transformación de Web.config o sustituyendo variables en el Web.config archivo.
Azure App Service deploy permite a los usuarios modificar los valores de configuración en archivos de configuración (*archivos .config) dentro de paquetes web y archivos de parámetros XML (parameters.xml), en función del nombre de fase especificado.
Nota
Las transformaciones de archivos y la sustitución de variables también son compatibles con la tarea transformación de archivos independiente para su uso en Azure Pipelines. Puede usar la tarea Transformación de archivos para aplicar transformaciones de archivos y sustituciones de variables en cualquier archivo de configuración y parámetros.
En el fragmento de código siguiente se muestra un ejemplo de sustitución de variables:
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
Las canalizaciones yaml no están disponibles en TFS.
Implementación condicional
Puede optar por implementar solo determinadas compilaciones en la aplicación web de Azure.
Para ello en YAML, puede usar una de estas técnicas:
- Aísle los pasos de implementación en un trabajo independiente y agregue una condición a ese trabajo.
- Agregue una condición al paso.
En el ejemplo siguiente se muestra cómo usar condiciones de paso para implementar solo compilaciones que se originan en la rama principal:
- task: AzureWebApp@1
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
inputs:
azureSubscription: '<Azure service connection>'
appName: '<name of web app>'
Para obtener más información sobre las condiciones, vea Especificar condiciones.
Las canalizaciones yaml no están disponibles en TFS.
Implementación en una Azure Government o en Azure Stack
Cree una conexión de servicio adecuada:
Mecanismos de implementación
Los ejemplos anteriores se basan en la tarea integrada Aplicación web de Azure, que proporciona una integración simplificada con Azure.
Si usa un agente Windows, esta tarea usa Web Deploy para interactuar con la aplicación web de Azure. Web Deploy proporciona varias opciones de implementación prácticas, como cambiar el nombre de los archivos bloqueados y excluir los archivos de la carpeta App_Data durante la implementación.
Si usa el agente de Linux, la tarea se basa en las API REST de Kudu.
Una cosa que merece la pena comprobar antes de la implementación es la Azure App Service restricciones de acceso. Esta lista puede incluir direcciones IP o subredes Virtual Network Azure. Cuando hay una o varias entradas, hay una denegación implícita de todo lo que existe al final de la lista. Para modificar las reglas de restricción de acceso a la aplicación, consulte Incorporación y edición dereglas de restricción de acceso Azure Portal . También puede modificar o restringir el acceso al sitio de administración de control de código fuente (scm).
La Azure App Service administrar es otra tarea útil para la implementación. Puede usar esta tarea para iniciar, detener o reiniciar la aplicación web antes o después de la implementación. También puede usar esta tarea para intercambiar ranuras, instalar extensiones de sitio o habilitar la supervisión de la aplicación web.
Puede usar la tarea Transformación de archivos para aplicar transformaciones de archivos y sustituciones de variables en cualquier archivo de configuración y parámetros.
Si las tareas integradas no satisfacen sus necesidades, puede usar otros métodos para crear scripts de la implementación. Vea los fragmentos de código YAML en cada una de las siguientes tareas para ver algunos ejemplos:
Azure Pipelines | Azure DevOps Server 2020 | Azure DevOps Server 2019 | TFS 2018 | TFS 2017
Nota
En Microsoft Team Foundation Server (TFS) 2018 y versiones anteriores, las canalizaciones de compilación y versión se denominan definiciones, las ejecuciones se denominan compilaciones, las conexiones de servicio se denominan puntos de conexión de servicio, las fases se denominan entornos y los trabajos se denominan fases.
Puede usar Azure Pipelines implementar continuamente la aplicación web para Azure App Service cada compilación correcta.
Azure App Service es un entorno administrado para hospedar aplicaciones web, API REST y back-ends móviles. Puede desarrollar en sus lenguajes favoritos, incluidos .NET, Python y JavaScript.
Usará la tarea Aplicación web de Azure para implementar en Azure App Service en la canalización. Para escenarios más complicados, como la necesidad de usar parámetros XML en la implementación, puede usar la Azure App Service Implementar.
Para obtener información sobre cómo implementar en una aplicación web de Azure para contenedores de Linux, consulte Implementación de un contenedor de aplicaciones web de Azure.
Nota
Esta guía se aplica a Team Foundation Server (TFS) versión 2017.3 y posteriores.
Requisitos previos
- Una cuenta de Azure con una suscripción activa. Cree una cuenta gratuita.
Tener una cuenta de GitHub en la que pueda crear un repositorio. Si no tiene ninguna, puede crearla gratis.
Una organización de Azure DevOps. Si no tiene ninguna, puede crearla gratis. (Las organizaciones de Azure DevOps son diferentes de las organizaciones de GitHub. Puede asignar a la organización de DevOps y la de GitHub el mismo nombre si desea que estén coordinadas).
Si el equipo ya tiene una, asegúrese de que usted es el administrador del proyecto de Azure DevOps que desea usar.
Tener capacidad para ejecutar canalizaciones en agentes hospedados por Microsoft. Puede comprar un trabajo paralelo o solicitar un nivel gratuito. Para solicitar un nivel gratuito, siga las instrucciones que se indican en este artículo. Tenga en cuenta que se pueden tardar 2 o 3 días laborables en conceder el nivel gratuito.
Cree una Azure App Service en el Azure Portal
Cree un Azure App Service en Linux o Windows con Azure Cloud Shell. Primeros pasos:
- Inicie sesión en Azure Portal.
- Inicie Cloud Shell desde el panel de navegación superior del portal.
Para más información, vea Introducción a Azure Cloud Shell.
Cree una Azure App Service en Linux.
# Create a resource group
az group create --location eastus2 --name myapp-rg
# Create an app service plan of type Linux
az appservice plan create -g myapp-rg -n myapp-service-plan --is-linux
# Create an App Service from the plan
az webapp create -g myapppipeline-rg -p myapp-service-plan -n my-app-dotnet --runtime "DOTNETCORE|3.1"