Entrega contínua com o Azure Pipelines

Use o Azure Pipelines para implantar automaticamente no Azure Functions. O Azure Pipelines permite criar, testar e implantar com integração contínua (CI) e entrega contínua (CD) usando o Azure DevOps.

Os pipelines YAML são definidos usando um arquivo YAML em seu repositório. Uma etapa é o menor bloco de construção de um pipeline e pode ser um script ou tarefa (script pré-empacotado). Saiba mais sobre os principais conceitos e componentes que compõem um pipeline.

Você usará a tarefa AzureFunctionApp para implantar no Azure Functions. Agora há duas versões da tarefa AzureFunctionApp (AzureFunctionApp@1, AzureFunctionApp@2). AzureFunctionApp@2 inclui suporte de validação aprimorado que torna os pipelines menos propensos a falhar devido a erros.

Escolha a versão da sua tarefa na parte superior do artigo. Os pipelines YAML não estão disponíveis para o Azure DevOps 2019 e versões anteriores.

Pré-requisitos

Compilar a sua aplicação

  1. Entre em sua organização do Azure DevOps e navegue até seu projeto.
  2. No seu projeto, navegue até a página Pipelines . Em seguida, selecione Novo pipeline.
  3. Selecione uma destas opções para Onde está o seu código?:
    • GitHub: Você pode ser redirecionado para o GitHub para entrar. Em caso afirmativo, insira suas credenciais do GitHub. Quando esta é a primeira conexão com o GitHub, o assistente também orienta você pelo processo de conexão do DevOps às suas contas do GitHub.
    • Azure Repos Git: Você pode escolher imediatamente um repositório em seu projeto DevOps atual.
  4. Quando a lista de repositórios for exibida, selecione seu repositório de aplicativo de exemplo.
  5. O Azure Pipelines analisa seu repositório e, em Configurar seu pipeline , fornece uma lista de modelos potenciais. Escolha o modelo de aplicativo de função apropriado para o seu idioma. Se não vir o modelo correto, selecione Mostrar mais.
  6. Selecione Salvar e executar, selecione Confirmar diretamente na ramificação principal e, em seguida, escolha Salvar e executar novamente.
  7. Uma nova execução é iniciada. Aguarde a conclusão da execução.

Exemplo de pipelines de construção YAML

Os seguintes pipelines específicos de idioma podem ser usados para criar aplicativos.

Você pode usar o exemplo a seguir para criar um arquivo YAML para criar um aplicativo .NET.

Se você vir erros ao criar seu aplicativo, verifique se a versão do .NET que você usa corresponde à sua versão do Azure Functions. Para obter mais informações, consulte Visão geral das versões de tempo de execução do Azure Functions.

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.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'

Implante seu aplicativo

Você implantará com a tarefa Azure Function App Deploy . Esta tarefa requer uma conexão de serviço do Azure como entrada. Uma conexão de serviço do Azure armazena as credenciais para se conectar do Azure Pipelines ao Azure.

Para implantar no Azure Functions, adicione o seguinte trecho no final do arquivo azure-pipelines.yml . O padrão appType é Windows. Você pode especificar Linux definindo como appTypefunctionAppLinux.

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: AzureFunctionApp@1 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.zip
    #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 Name>'
    #slotName: '<Slot name>'

O trecho pressupõe que as etapas de compilação em seu arquivo YAML produzem o arquivo zip na $(System.ArtifactsDirectory) pasta do seu agente.

Implantar um contêiner

Você pode implantar automaticamente seu código no Azure Functions como um contêiner personalizado após cada compilação bem-sucedida. Para saber mais sobre contêineres, consulte Criar uma função no Linux usando um contêiner personalizado.

Implantar com a tarefa Aplicativo de Função do Azure para Contêiner

A maneira mais simples de implantar em um contêiner é usar a tarefa Azure Function App on Container Deploy.

Para implantar, adicione o seguinte trecho no final do arquivo YAML:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

O trecho envia a imagem do Docker para o Registro de Contêiner do Azure. A tarefa Azure Function App on Container Deploy extrai a imagem apropriada do Docker correspondente à BuildId do repositório especificado e, em seguida, implanta a imagem.

Implantar em um slot

Você pode configurar seu aplicativo de função para ter vários slots. Os slots permitem que você implante seu aplicativo com segurança e teste-o antes de disponibilizá-lo para seus clientes.

O trecho YAML a seguir mostra como implantar em um slot de preparo e, em seguida, trocar para um slot de produção:

- 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

Criar um pipeline com a CLI do Azure

Para criar um pipeline de compilação no Azure, use o az functionapp devops-pipeline createcomando. O pipeline de compilação é criado para criar e liberar quaisquer alterações de código feitas em seu repositório. O comando gera um novo arquivo YAML que define o pipeline de compilação e liberação e, em seguida, confirma-o ao seu repositório. Os pré-requisitos para este comando dependem da localização do seu código.

  • Se o seu código estiver no GitHub:

    • Você deve ter permissões de gravação para sua assinatura.

    • Você deve ser o administrador do projeto no Azure DevOps.

    • Você deve ter permissões para criar um token de acesso pessoal (PAT) do GitHub que tenha permissões suficientes. Para obter mais informações, consulte Requisitos de permissão PAT do GitHub.

    • Você deve ter permissões para confirmar a ramificação principal em seu repositório GitHub para poder confirmar o arquivo YAML gerado automaticamente.

  • Se o seu código estiver nos repositórios do Azure:

    • Você deve ter permissões de gravação para sua assinatura.

    • Você deve ser o administrador do projeto no Azure DevOps.

Compilar a sua aplicação

  1. Entre em sua organização do Azure DevOps e navegue até seu projeto.
  2. No seu projeto, navegue até a página Pipelines . Em seguida, escolha a ação para criar um novo pipeline.
  3. Percorra as etapas do assistente selecionando primeiro o GitHub como o local do seu código-fonte.
  4. Poderá ser redirecionado para o GitHub para iniciar sessão. Em caso afirmativo, insira suas credenciais do GitHub.
  5. Quando a lista de repositórios for exibida, selecione seu repositório de aplicativo de exemplo.
  6. O Azure Pipelines analisará seu repositório e recomendará um modelo. Selecione Salvar e executar, selecione Confirmar diretamente na ramificação principal e, em seguida, escolha Salvar e executar novamente.
  7. Uma nova execução é iniciada. Aguarde a conclusão da execução.

Exemplo de pipelines de construção YAML

Os seguintes pipelines específicos de idioma podem ser usados para criar aplicativos.

Você pode usar o exemplo a seguir para criar um arquivo YAML para criar um aplicativo .NET:

pool:
  vmImage: 'windows-latest'
steps:
- script: |
    dotnet restore
    dotnet build --configuration Release
- task: DotNetCoreCLI@2
  inputs:
    command: publish
    arguments: '--configuration Release --output publish_output'
    projects: '*.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'

Implante seu aplicativo

Você implantará com a tarefa Azure Function App Deploy v2 . Esta tarefa requer uma conexão de serviço do Azure como entrada. Uma conexão de serviço do Azure armazena as credenciais para se conectar do Azure Pipelines ao Azure.

A versão v2 da tarefa inclui suporte para pilhas de aplicativos mais recentes para .NET, Python e Node. A tarefa inclui verificações de pré-implantação de rede. Quando há problemas de pré-implantação, a implantação é interrompida.

Para implantar no Azure Functions, adicione o seguinte trecho no final do arquivo azure-pipelines.yml . O padrão appType é Windows. Você pode especificar Linux definindo como appTypefunctionAppLinux.

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: AzureFunctionApp@2 # Add this at the end of your file
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux # default is functionApp
    appName: $(appName)
    package: $(System.ArtifactsDirectory)/**/*.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 Name>'
    #slotName: '<Slot name>'

O trecho pressupõe que as etapas de compilação em seu arquivo YAML produzem o arquivo zip na $(System.ArtifactsDirectory) pasta do seu agente.

Implantar um contêiner

Você pode implantar automaticamente seu código no Azure Functions como um contêiner personalizado após cada compilação bem-sucedida. Para saber mais sobre contêineres, consulte Trabalhando com contêineres e Azure Functions .

Implantar com a tarefa Aplicativo de Função do Azure para Contêiner

A maneira mais simples de implantar em um contêiner é usar a tarefa Azure Function App on Container Deploy.

Para implantar, adicione o seguinte trecho no final do arquivo YAML:

trigger:
- main

variables:
  # Container registry service connection established during pipeline creation
  dockerRegistryServiceConnection: <Docker registry service connection>
  imageRepository: <Name of your image repository>
  containerRegistry: <Name of the Azure container registry>
  dockerfilePath: '$(Build.SourcesDirectory)/Dockerfile'
  tag: '$(Build.BuildId)'

  # Agent VM image name
  vmImageName: 'ubuntu-latest'

- task: AzureFunctionAppContainer@1 # Add this at the end of your file
  inputs:
    azureSubscription: '<Azure service connection>'
    appName: '<Name of the function app>'
    imageName: $(containerRegistry)/$(imageRepository):$(tag)

O trecho envia a imagem do Docker para o Registro de Contêiner do Azure. A tarefa Azure Function App on Container Deploy extrai a imagem apropriada do Docker correspondente à BuildId do repositório especificado e, em seguida, implanta a imagem.

Implantar em um slot

Você pode configurar seu aplicativo de função para ter vários slots. Os slots permitem que você implante seu aplicativo com segurança e teste-o antes de disponibilizá-lo para seus clientes.

O trecho YAML a seguir mostra como implantar em um slot de preparo e, em seguida, trocar para um slot de produção:

- task: AzureFunctionApp@2
  inputs:
    azureSubscription: <Azure service connection>
    appType: functionAppLinux
    appName: <Name of the Function app>
    package: $(System.ArtifactsDirectory)/**/*.zip
    deploymentMethod: 'auto'
    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

Criar um pipeline com a CLI do Azure

Para criar um pipeline de compilação no Azure, use o az functionapp devops-pipeline createcomando. O pipeline de compilação é criado para criar e liberar quaisquer alterações de código feitas em seu repositório. O comando gera um novo arquivo YAML que define o pipeline de compilação e liberação e, em seguida, confirma-o ao seu repositório. Os pré-requisitos para este comando dependem da localização do seu código.

  • Se o seu código estiver no GitHub:

    • Você deve ter permissões de gravação para sua assinatura.

    • Você deve ser o administrador do projeto no Azure DevOps.

    • Você deve ter permissões para criar um token de acesso pessoal (PAT) do GitHub que tenha permissões suficientes. Para obter mais informações, consulte Requisitos de permissão PAT do GitHub.

    • Você deve ter permissões para confirmar a ramificação principal em seu repositório GitHub para poder confirmar o arquivo YAML gerado automaticamente.

  • Se o seu código estiver nos repositórios do Azure:

    • Você deve ter permissões de gravação para sua assinatura.

    • Você deve ser o administrador do projeto no Azure DevOps.

Próximos passos

  • Analise a visão geral do Azure Functions.
  • Analise a visão geral do Azure DevOps.