Entrega contínua com o Azure Pipelines
Implante automaticamente no Azure Functions com o Azure Pipelines. O Azure Pipelines permite criar, testar e implantar com CI (integração contínua) e CD (entrega contínua) usando o Azure DevOps.
Os pipelines do 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 avançado à validação que torna os pipelines menos propensos a falhar devido a erros.
Escolha sua versão de tarefa na parte superior do artigo. Os pipelines do YAML não estão disponíveis para Azure DevOps 2019 e versões anteriores.
Pré-requisitos
Uma organização do Azure DevOps. Caso não tenha uma, você pode criá-la gratuitamente. Se sua equipe já tiver uma, verifique se você é um administrador do projeto do Azure DevOps que deseja usar.
Uma capacidade de executar pipelines em agentes hospedados pela Microsoft. Você pode comprar um trabalho paralelo ou solicitar uma camada gratuita.
Se você planeja usar o GitHub em vez do Azure Repos, também precisará de um repositório GitHub. Se você não tiver uma conta do GitHub, poderá criar uma gratuitamente.
Um aplicativo de funções existente no Azure que tem seu código-fonte em um repositório com suporte. Se você ainda não tiver um projeto de código Azure Functions, poderá criar um concluindo o seguinte artigo específico ao idioma:
Lembre-se de carregar o projeto de código local no repositório GitHub ou Azure Repos depois de publicá-lo em seu aplicativo de funções.
Compilar o aplicativo
- Entre na sua organização do Azure DevOps e navegue até seu projeto.
- Em seu projeto, navegue até a página Pipelines. Em seguida, selecione Novo pipeline.
- Selecione uma destas opções para Onde está seu código?:
- GitHub: Você pode ser redirecionado para o GitHub para então entrar. Nesse caso, insira suas credenciais do GitHub. Quando essa conexão é sua primeira conexão do GitHub, o assistente também orienta você pelo processo de conexão do DevOps às suas contas do GitHub.
- Git do Azure Repos: você pode escolher imediatamente um repositório em seu projeto de DevOps atual.
- Quando a lista de repositórios for exibida, selecione o repositório de aplicativo de amostra.
- 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ções apropriado para seu idioma. Se você não vir o modelo correto, selecione Mostrar mais.
- Clique em Salvar e executar e selecione Fazer commit diretamente para a ramificação principal. Depois clique de novo em Salvar e executar.
- Uma nova execução é iniciada. Aguarde a conclusão da execução.
Exemplo de pipelines de build do YAML
Os pipelines específicos de idioma a seguir podem ser usados para a criação de aplicativos.
Você pode usar o exemplo a seguir para criar um arquivo YAML para compilar 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 Azure Functions. Para obter mais informações, consulte Visão geral de versões do Azure Functions runtime.
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 Implantação de aplicativo de funções do Azure. 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 trecho a seguir ao final do arquivo azure-pipelines.yml
. O padrão appType
é Windows. Você pode especificar o Linux definindo o appType
como functionAppLinux
. A implantação em um aplicativo de Consumo Flex não tem suporte com @v1 da tarefa AzureFunctionApp.
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 de código pressupõe que as etapas de compilação no arquivo YAML produzem o arquivo zip na pasta $(System.ArtifactsDirectory)
no seu agente.
Implantar um contêiner
Você pode implantar automaticamente seu código como um aplicativo de funções em contêineres após cada build bem-sucedido. Para saber mais sobre contêineres, confira Trabalhando com contêineres e o Azure Functions .
A maneira mais simples de implantar em um contêiner é usar a tarefa Aplicativo de Funções do Azure na Implantação de Contêiner.
Para implantar, adicione o trecho a seguir ao 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 por push a imagem do Docker para o Registro de Contêiner do Azure. A tarefa Aplicativo de Funções do Azure na Implantação de Contêiner extrai a imagem apropriada do Docker correspondente ao BuildId
do repositório especificado e, em seguida, implanta a imagem.
Para obter um exemplo completo de pipeline de ponta a ponta, incluindo a criação do contêiner e a publicação no registro de contêiner, consulte este exemplo de implantação de contêiner do Azure Pipelines.
Implantar em um slot
Você pode configurar seu aplicativo de funções 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 de código YAML a seguir mostra como implantar em um slot de preparo e, em seguida, alternar 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 create
comando. O pipeline de compilação é criado para compilar 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 versão e, em seguida, o confirma para seu repositório. Os pré-requisitos para esse comando dependem do local 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 PAT (token de acesso pessoal) do GitHub que tenha permissões suficientes. Para obter mais informações, consulte requisitos de permissão do GitHub PAT.
Você deve ter permissões para confirmar o Branch principal em seu repositório do GitHub, para que você possa confirmar o arquivo YAML gerado automaticamente.
Se seu código estiver em Azure Repos:
Você deve ter permissões de gravação para sua assinatura.
Você deve ser o administrador do projeto no Azure DevOps.
Compilar o aplicativo
- Entre na sua organização do Azure DevOps e navegue até seu projeto.
- Em seu projeto, navegue até a página Pipelines. Em seguida, escolha a ação para criar um novo pipeline.
- Percorra as etapas do assistente selecionando primeiro GitHub como o local do código-fonte.
- Você pode ser redirecionado para o GitHub para então entrar. Nesse caso, insira suas credenciais do GitHub.
- Quando a lista de repositórios for exibida, selecione o repositório de aplicativo de amostra.
- O Azure Pipelines analisará seu repositório e recomendará um modelo. Clique em Salvar e executar e selecione Fazer commit diretamente para a ramificação principal. Depois clique de novo em Salvar e executar.
- Uma nova execução é iniciada. Aguarde a conclusão da execução.
Exemplo de pipelines de build do YAML
Os pipelines específicos de idioma a seguir podem ser usados para a criação de aplicativos.
Você pode usar o exemplo a seguir para criar um arquivo YAML para compilar 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 Implantação de aplicativo de funções do Azure 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. Você deve criar uma conexão que use a federação de identidade de carga de trabalho.
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 na pré-implantação, a implantação é interrompida.
Para implantar no Azure Functions, adicione o trecho a seguir ao final do arquivo azure-pipelines.yml
. O padrão appType
é Windows. Você pode especificar o Linux definindo o appType
como functionAppLinux
. A implantação em um aplicativo de Consumo Flex exige que você defina tanto appType: functionAppLinux
quanto isFlexConsumption: true
.
trigger:
- main
variables:
# Azure service connection established during pipeline creation
azureSubscription: <SUBSCRIPTION_NAME>
appName: <APP_NAME>
# Agent VM image name
vmImageName: 'windows-latest'
- task: AzureFunctionApp@2 # Add this at the end of your file
inputs:
azureSubscription: <AZURE_SERVICE_CONNECTION>
appType: functionApp # this specifies a Windows-based function app
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>'
#slotName: '<SLOT_NAME>'
Próximas etapas
- Examine a visão geral do Azure Functions.
- Examine a visão geral do Azure DevOps.