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

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Vaya a Pipelinesy, a continuación, seleccione Nueva canalización.

  3. Siga los pasos del asistente y seleccione primero GitHub como ubicación del código fuente.

  4. Puede que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub.

  5. Cuando aparezca la lista de repositorios, seleccione el que corresponda.

  6. Es posible que se le redirija a GitHub para instalar la aplicación Azure Pipelines. Si es así, seleccione Aprobar instalación.

  7. Cuando aparezca la pestaña Configurar, seleccione ASP.NET Core.

  8. 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

  1. Use el Asistente para tareas para agregar la tarea Aplicación web de Azure.

    Tarea de aplicación web de Azure.

  2. Seleccione Azure Resource Manager tipo de conexión y elija la suscripción de Azure. Asegúrese de autorizar la conexión.

  3. 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.config e 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>'

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 deployToSlotOrASE es true.
  • slotName:nombre de la ranura, el valor predeterminado es . Obligatorio si deployToSlotOrASE es 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

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

  1. Inicie sesión en Azure Portal.
  2. Inicie Cloud Shell desde el panel de navegación superior del portal. Abra el Cloud Shell.

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" 

Compilación de la aplicación con Azure Pipelines