Compartir a través de


Entrega continua con Azure Pipelines

Use Azure Pipelines para implementar automáticamente el proyecto de código en una aplicación de funciones en Azure. Azure Pipelines permite compilar, probar e implementar con integración continua (CI) y entrega continua (CD) mediante Azure DevOps.

Las canalizaciones de YAML se definen mediante un archivo YAML en el repositorio. Un paso es el bloque de creación más pequeño de una canalización y puede ser un script o una tarea (script empaquetado previamente). Obtenga información sobre los conceptos y componentes clave que forma una canalización.

Usas la tarea AzureFunctionApp para desplegar tu código. Ahora hay dos versiones de AzureFunctionApp, que se comparan en esta tabla:

Comparación y versión AzureFunctionApp@2 AzureFunctionApp@1
Admite el plan de consumo flexible.
Incluye soporte de validación mejorado*
Cuándo usar... Recomendado para nuevas implementaciones de aplicaciones Se mantiene para implementaciones heredadas

* La compatibilidad mejorada con la validación reduce la probabilidad de que las canalizaciones fallen debido a errores.

Elija la versión de la tarea en la parte superior del artículo.

Nota:

Actualice de AzureFunctionApp@1 a AzureFunctionApp@2 para acceder a nuevas características y soporte a largo plazo.

Requisitos previos

Recuerde cargar el proyecto de código local en el repositorio de GitHub o de Azure Repos después de publicarlo en la aplicación de funciones.

Compilación de la aplicación

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.
  2. En el proyecto, vaya a la página Pipelines (Canalizaciones). A continuación, elija la acción para crear una 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 repositorio de la aplicación de ejemplo.
  6. Azure Pipelines analizará el repositorio y recomendará una plantilla. Seleccione Save and run (Guardar y ejecutar) y, luego, seleccione Commit directly to the main branch (Confirmar directamente en la rama principal) y, luego, elija de nuevo Save and run (Guardar y ejecutar).
  7. Se inicia una nueva ejecución. Espere a que finalice.

Ejemplo de canalizaciones de compilación de YAML

Las siguientes canalizaciones específicas del lenguaje se pueden usar para compilar aplicaciones.

Puede utilizar el ejemplo siguiente con el fin de crear el archivo YAML para compilar la aplicación de .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'
  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.
  2. En el proyecto, vaya a la página Pipelines (Canalizaciones). Luego seleccione Nueva canalización.
  3. Seleccione una de estas opciones en ¿Dónde está su código?:
    • GitHub: es posible que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub. Cuando esta conexión es su primera conexión a GitHub, el asistente también le guía por el proceso de conectar DevOps a las cuentas de GitHub.
    • Git de Azure Repos: puede elegir inmediatamente un repositorio en su proyecto de DevOps actual.
  4. Cuando aparezca la lista de repositorios, seleccione el repositorio de la aplicación de ejemplo.
  5. Azure Pipelines analiza el repositorio y, en Configure su canalización, proporciona una lista de posibles plantillas. Elija la plantilla de aplicación de funciones adecuada para su lenguaje. Si no ve la plantilla correcta, seleccione Mostrar más.
  6. Seleccione Save and run (Guardar y ejecutar) y, luego, seleccione Commit directly to the main branch (Confirmar directamente en la rama principal) y, luego, elija de nuevo Save and run (Guardar y ejecutar).
  7. Se inicia una nueva ejecución. Espere a que finalice.

Ejemplo de canalizaciones de compilación de YAML

Las siguientes canalizaciones específicas del lenguaje se pueden usar para compilar aplicaciones.

Puede utilizar el ejemplo siguiente con el fin de crear un archivo YAML para compilar la aplicación .NET.

Si ve errores al compilar la aplicación, compruebe que la versión de .NET que usa coincide con la versión de Azure Functions. Para más información, consulte Selección de un destino para versiones de runtime de Azure Functions.

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'

Implementación de la aplicación

Se implementará con la tarea de Implementación de Azure Function App v2. Esta tarea requiere una conexión de servicio de Azure como entrada. Una conexión de servicio de Azure almacena las credenciales para conectarse de Azure Pipelines a Azure. Debe crear una conexión que use la federación de identidades de carga de trabajo.

Para implementar en Azure Functions, agregue este fragmento de código al final del archivo, en función de azure-pipelines.yml si la aplicación se ejecuta en 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>'

El valor predeterminado appType es Windows (functionApp). Puede especificar Linux estableciendo el valor de appType en functionAppLinux. Una aplicación Flex Consumption se ejecuta en Linux y usted también debe establecer ambos appType: functionAppLinux y isFlexConsumption: true.

En el fragmento de código se da por supuesto que los pasos de compilación del archivo YAML generan el archivo ZIP en la carpeta $(System.ArtifactsDirectory) del agente.

La implementación se realiza mediante la tarea Implementación de la aplicación de funciones de Azure . Esta tarea requiere una conexión de servicio de Azure como entrada. Una conexión de servicio de Azure almacena las credenciales para conectarse de Azure Pipelines a Azure.

Importante

No se admite la implementación en una aplicación de Consumo flexible usando @v1 de la tarea AzureFunctionApp.

Para implementar en Azure Functions, agregue este fragmento de código al final del azure-pipelines.yml archivo:

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

Este fragmento de código establece appType a functionAppLinux, lo cual es necesario al desplegar en una aplicación que se ejecuta en Linux. El valor predeterminado appType es Windows (functionApp).

En el ejemplo se supone que los pasos de compilación del archivo YAML generan el archivo ZIP en la $(System.ArtifactsDirectory) carpeta del agente.

Implementación de un contenedor

Sugerencia

Se recomienda usar la compatibilidad con Azure Functions en Azure Container Apps para hospedar la aplicación de funciones en un contenedor de Linux personalizado. Para más información, consulte Introducción a Azure Functions en Azure Container Apps.

Al implementar una aplicación de funciones en contenedor, la tarea de implementación que usa depende del entorno de hospedaje específico.

Puede usar la tarea Implementación de Azure Container Apps (AzureContainerApps) para implementar una imagen de aplicación de funciones en una instancia de Azure Container App optimizada para Azure Functions.

Este código implementa la imagen base para una aplicación de función de modelo de proceso aislado de .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>

Lo ideal es crear su propio contenedor personalizado en la canalización en lugar de usar una imagen base, como se muestra en este ejemplo. Para obtener más información, consulte Implementación en Azure Container Apps desde Azure Pipelines.

Implementación en una ranura

Importante

Actualmente, el plan Flex Consumption no admite slots. Las aplicaciones Linux tampoco admiten ranuras cuando se ejecutan en un plan de Consumo y la compatibilidad con estas aplicaciones se retirará en el 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>'

Puede configurar la aplicación de funciones 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.

El siguiente fragmento de código YAML muestra cómo implementar en un espacio de ensayo y, a continuación, cambiar a un espacio de producción:

- 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

Al usar ranuras de implementación, también puede agregar la siguiente tarea para realizar un intercambio de ranuras como parte de la implementación.

- task: AzureAppServiceManage@0
  inputs:
    azureSubscription: <AZURE_SERVICE_CONNECTION>
    WebAppName: <APP_NAME>
    ResourceGroupName: <RESOURCE_GROUP>
    SourceSlot: <SLOT_NAME>
    SwapWithProduction: true

Creación de una canalización con la CLI de Azure

Para crear una canalización de compilación en Azure, use el az functionapp devops-pipeline create . La canalización de compilación se crea para compilar y liberar los cambios de código que se realicen en el repositorio. El comando generará un nuevo archivo YAML que define la canalización de versión y compilación y lo confirma en el repositorio. Los requisitos previos para este comando dependen de la ubicación del código.

  • Si el código está en GitHub:

    • Debe contar con permisos de escritura en su suscripción.

    • Debe ser el administrador del proyecto en Azure DevOps.

    • Debe tener permisos para crear un token de acceso personal (PAT) en GitHub que tenga permisos suficientes. Para obtener más información, consulte Requisitos de permiso de token de acceso personal en GitHub.

    • Debe tener permisos para confirmar en la rama principal del repositorio de GitHub con el fin de confirmar el archivo YAML generado automáticamente.

  • Si el código está en Azure Repos:

    • Debe contar con permisos de escritura en su suscripción.

    • Debe ser el administrador del proyecto en Azure DevOps.

Pasos siguientes