Curso
Se o seu pipeline de CI/CD continua quebrando ou parece lento e desajeitado, você não está sozinho. Já lidei com compilações que falharam, ambientes incompatíveis e colegas de equipe que acidentalmente sobrescreveram meu trabalho. O Azure Pipelines elimina essas frustrações com um serviço hospedado na nuvem que pode criar, testar e implantar quase todos os projetos em qualquer plataforma.
Por isso, neste tutorial, mostrarei a você como fazer isso:
- Crie seu primeiro pipeline do Azure
- Crie seu projeto na nuvem
- Adicione testes automatizados para detectar erros com antecedência
- Implemente na fase de preparação ou produção com um único envio
- Monitore e otimize seu pipeline para obter velocidade e confiabilidade
- Siga as práticas recomendadas comprovadas em projetos do mundo real
Vamos começar!
O que é o Azure Pipelines?
O Azure Pipelines é uma solução baseada em nuvem que simplifica o desenvolvimento, o teste e a implantação de aplicativos.
Ele é um componente do kit de ferramentas Azure DevOps, que oferece suporte a todo o ciclo de vida de desenvolvimento de software. Também é uma opção flexível para equipes de todos os tamanhos, pois é compatível com várias plataformas e linguagens de programação. O GitHub, o Azure Repos e outros sistemas de controle de versão conhecidos estão integrados a ele.
Os principais recursos do Azure Pipelines incluem:
Serviço |
Finalidade |
Suporte multiplataforma |
O Azure Pipelines automatiza a criação e a implantação de aplicativos para vários sistemas operacionais, como Linux, macOS e Windows. |
Integração com o controle de versão |
O Azure Pipelines se conecta aos seus repositórios de código, como o Azure Repos, o GitHub e outros sistemas de controle de versão conhecidos. |
Configuração do pipeline baseada em YAML |
O Azure Pipelines nos permite definir nossos processos de criação e implantação como código, permitindo o controle de versão. |
Integração contínua e implantação contínua (CI/CD) |
O Azure Pipelines facilita o processo de ponta a ponta de integração de alterações de código e implantação de aplicativos. |
Na minha experiência, o Azure Pipelines é útil para quem deseja ter uma operação de CI/CD em sua equipe. Ele é flexível, dimensionável e se integra bem a outros serviços do Azure.
Arquitetura do Azure Pipelines (Fonte: Microsoft).
Se você está procurando uma compreensão mais ampla do Azure DevOps além dos pipelines, este tutorial do Azure DevOps vocêvocê conhecerá todo o ciclo de vida de CI/CD do início ao fim.
Configurando seu primeiro pipeline do Azure
Para trabalhar com o ambiente do Azure Pipelines, primeiro precisamos configurar tudo para promover um processo de criação, teste e implantação de ponta a ponta.
Pré-requisitos
Antes de começar a criar seu primeiro pipeline, verifique se você tem o seguinte:
- Configuração da conta e da organização do Azure DevOps: Inscreva-se empara obter uma conta do Azure DevOpsnt se você ainda não tiver uma. Crie uma organização para gerenciar seus projetos.
- Repositório: Você precisará de um repositório de código com um projeto de amostra. Isso pode ser hospedado no Azure Repos ou no GitHub. Para este tutorial, usaremos um projeto Node.js simples.
- Acesso ao portal do Azure: Você também precisará acessar o portal do Azure quando quiser implantar serviços do Azure, como o Azure Kubernetes Service (AKS) e muitos outros.
Se você precisar se atualizar sobre o ecossistema mais amplo do Azure, recomendo que confira o curso Understanding Microsoft Azure.
Criando um novo projeto e repositório
Agora que sua conta e organização do Azure DevOps estão configuradas, vamos criar nosso primeiro projeto e repositório.
- Crie um novo projeto:
- Faça login na sua conta do Azure DevOps.
- Clique em Novo projeto, dê um nome a ele (por exemplo, "AzureDevOps-DataCamp-Tutorial") e escolha a visibilidade (pública ou privada).
- Clique em Criar projeto.
- Configure um repositório:
- Se você estiver usando o Azure Repos, navegue até a seçãoRepos e inicialize um novo repositório.
- Como alternativa, você pode vincular um repositório existente do GitHub selecionando Importar repositório.
- Dê um nome ao seu repositório, escolha o tipo de repositório (Git ou TFVC), cole a URL do repositório clonado e clique em Importar.
- Se você estiver usando o GitHubvocê pode vincular sua conta do GitHub ao Azure DevOps indo para o canto inferior esquerdo da interface do projeto e selecionando Configurações do projeto > Conexões do GitHub > Conectar sua conta do GitHub.
Para este tutorial, usaremos o Azure Repos como nosso repositório de código. Se você estiver apenas começando ou não tiver um motivo específico para escolher a TFVC, aconselho que escolha a Git.
Criando seu primeiro pipeline
É hora de criar nosso primeiro pipeline. Siga as etapas abaixo:
- Em você Pipelines clique em Criar pipeline.
- Selecione Repositórios do Azure Git como a fonte e escolha seu repositório.
- Você pode configurar seu pipeline usando o editor YAML ou Classic. Vamos usar o YAML, uma forma baseada em código de definir o pipeline.
- Salve o pipeline e execute-o para ver se tudo funciona corretamente.
Escolhendo o YAML em vez do editor clássico
O Azure Pipelines oferece duas maneiras de você definir seus pipelines:
- Pipelines YAML: Uma maneira baseada em código para descrever seu pipeline. Eles são definidos em um arquivo
.yaml
ou.yml
em seu repositório de origem, permitindo o controle de versão e uma melhor colaboração. - Editor clássico: O Classic Editor é uma interface visual de arrastar e soltar fácil de usar que é menos flexível para cenários complexos.
Aspecto |
YAML Pipelines |
Editor clássico |
Controle de versão |
Os pipelines YAML oferecem suporte ao controle de versão e são armazenados no repositório de código-fonte. |
O Editor Clássico não é compatível com o controle de versão. Ele é baseado em uma interface gráfica do usuário (GUI). |
Flexibilidade |
Os pipelines YAML têm flexibilidade de ponta. |
O Classic Editor tem flexibilidade limitada. |
Melhor para |
Os pipelines YAML são melhores para automação e fluxos de trabalho complexos e de longo prazo. |
O Classic Editor é mais adequado para configurações rápidas. |
Na minha experiência, os pipelines YAML oferecem mais flexibilidade e são melhores para as equipes queseguem as práticas de IaC (Infrastructure as Code). Mas esse Editor Clássico é perfeito para você que está se renovando e tem uma maneira mais visual de fazer as coisas.
No entanto, para escalabilidade de longo prazo, os pipelines YAML são recomendados em vez do Classic Editor.
Criando com o Azure Pipelines
Agora, vamos ver como podemos criar com o Azure Pipelines.
Nesta seção, especificaremos as etapas que o Azure Pipelines executa para criar seu código, como a instalação de dependências, a compilação e a execução de testes. Vamos expressar essas etapas em um arquivo de configuração em nosso repositório de código-fonte usando YAML, uma forma simples e legível para descrever as etapas de uma receita.
Sintaxe do pipeline YAML
Aqui está um exemplo simples de um pipeline YAML:
# This section defines the trigger(s) for the pipeline.
# 'main' specifies that the pipeline will run whenever changes are pushed to the 'main' branch.
trigger:
- main # automatically triggers this pipeline when changes are made to the 'main' branch.
# This defines the pool where the pipeline will run.
# 'ubuntu-latest' specifies the virtual machine image for executing tasks.
pool:
vmImage: 'ubuntu-latest' # This uses the latest Ubuntu image provided by Azure DevOps.
# Steps contain the individual tasks or actions that the pipeline will execute.
steps:
- script: echo Hello, world! # A script task to run shell commands. This one prints "Hello, world!".
displayName: 'Run my first pipeline script' # A friendly name for this step, making it easier to identify in the pipeline logs.
Vamos detalhar o código passo a passo:
trigger
: Especifica a ramificação que aciona o pipeline (por exemplo,main
).pool
: Define o agente de compilação (por exemplo,ubuntu-latest
).steps
: Lista as tarefas a serem executadas, como a instalação de dependências e a execução de um script de compilação.
Configuração das etapas de compilação
Para adicionar etapas de compilação ao seu pipeline YAML, você deve definir o "script" na seção "etapas".
Para um aplicativo Node.js
simples, por exemplo, nosso arquivo azure-pipelines.yml
abaixo contém código que o Azure DevOps criou automaticamente.
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '20.x'
displayName: 'Install Node.js'
- script: |
npm install
npm run build
displayName: 'npm install and build'
Vamos dar uma olhada na compilação steps
no pipeline YAML acima:
- Instale o Node.js: Use a tarefa
NodeTool@0
para especificar a versão do Node.js. - Instale as dependências: Execute
npm install
para instalar as dependências do projeto. - Compilar o código (criar o projeto): Execute
npm run build
para compilar o código.
Executando o pipeline
Nosso pipeline pode ser acionado manualmente ou configurado para ser executado automaticamente quando ocorrerem eventos como o envio de ramificações.
- Gatilho manual: Clique em Run Pipeline na interface do Azure DevOps para acionar o pipeline manualmente.
- Gatilho automático: Configure acionadores com base em eventos do repositório para enviar alterações para a ramificação
main
e acionar o pipeline automaticamente. Aqui está um exemplo:
trigger:
- main
Depois de executar o pipeline, você pode visualizar os logs e solucionar problemas.
Para acessar os registros, vá para o resumo da execução do pipeline e selecione o trabalho ou a tarefa específica. Isso exibirá os logs dessa etapa; assim como na imagem abaixo, você pode escolher qualquer trabalho (Build, Push ou Update) para visualizar os logs brutos.
Para solucionar problemas comuns, você pode verificar se há problemas comuns no pipeline, como tempos limite, restrições de recursos ou configurações incorretas.
Adicionando testes ao seu pipeline
Você adiciona testes ao seu pipeline para garantir a qualidade do código e detectar problemas no início do desenvolvimento. No Azure Pipelines, você pode integrar unidades, integração ou outros testes adicionando etapas na configuração do pipeline.
Configuração das etapas de teste
Inclua etapas de teste em seu pipeline para garantir a qualidade do código. Você pode usar estruturas populares como Jest, Mocha ou NUnit. Por exemplo, veja como você pode adicionar testes de unidade com o Jest:
- script: |
npm test
displayName: 'Run unit tests with Jest'
Visualização dos resultados do teste
Há relatórios de teste incorporados no Azure Pipelines. Você pode configurar a publicação do resultado do teste para simplificar o acompanhamento e visualizar os resultados do teste nos logs do pipeline. É assim que você faz:
- Primeiro, navegue até Builds > Resultados do teste.
- Para publicar os resultados do teste, use a tarefa
PublishTestResults@2
para exibir os resultados. Isso torna o programa geral mais fácil. Por exemplo:
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/test-results.xml'
testRunTitle: 'Unit Tests'
Implantação com o Azure Pipelines
Nas etapas de implantação do arquivo YAML do pipeline do Azure, você pode implantar automaticamente seu aplicativo em vários ambientes, como teste, preparação e produção. Nesta seção, analisaremos algumas maneiras de implantar com o Azure Pipelines.
Implantando no Azure Web Apps
O Azure Web Apps é um serviço no Portal do Azure que permite que você desenvolva, implante e gerencie aplicativos Web em escala.
Para implantar no Azure Web Apps, você deve vincular os dois serviços. Veja como você pode fazer isso:
- Na parte inferior esquerda do seu projeto, vá para Configurações do projeto e clique em Conexões de serviço sob a seção Pipelines seção.
- Clique em Nova conexão de serviço e escolha Gerenciador de recursos do Azure.
- Faça a autenticação com sua conta do Azure.
- Implante no Serviço de Aplicativo do Azure:
- Volte para os pipelines e configure o pipeline.
- Em seu pipeline, adicione uma tarefa para implantar no Azure.
- Especifique o grupo de recursos e os detalhes do serviço.
Aqui está um exemplo de um pipeline de implantação YAML para um aplicativo Node.js
simples no Azure App Service:
# Define the task for deploying to an Azure Web App
- task: AzureWebApp@1
inputs:
# This specifies your Azure subscription service connection
azureSubscription: 'your-azure-subscription'
# This specifies the name of your web app
appName: 'your-app-name'
# This specifies the location of the app package or files to be deployed
package: '$(Build.ArtifactStagingDirectory)'
Vamos detalhar o código acima para que você possa adaptá-lo ao seu caso de uso:
- Substitua
your-azure-subscription
pelo nome da conexão de serviço que dá acesso à sua assinatura do Azure. - Substitua
your-app-name
pelo nome real do seu aplicativo Web no Azure. - Substitua
$(Build.ArtifactStagingDirectory)
pelo diretório no qual você colocará o pacote ou os arquivos do aplicativo Web para implementação.$(Build.ArtifactStagingDirectory)
- Essa variável aponta para a pasta onde os artefatos de compilação (os arquivos do aplicativo) ficam depois de terem sido compilados.
Configuração da implantação contínua (CD)
Depois que tudo em nosso código for aprovado em todos os testes e verificações, a próxima etapa é configurar a implantação contínua. Siga as etapas descritas abaixo.
Modelo de implantação do pipeline de versão do Azure (Fonte: Microsoft)
- Crie um pipeline de lançamento:
- Ir para Pipelines > Releases e clique em New Pipeline.
- Selecione a Implantação do serviço de aplicativos do Azure modelo.
- Configurar ambientes:
- Adicionar e configurar Dispositivo, Preparação, QAe Produção ambientes onde você deseja que o aplicativo seja implantado.
- Vincule o artefato do seu pipeline de compilação como a fonte para o pipeline de liberação, selecionando Adicionar um artefato.
- Configure aprovações e portões:
- É necessário configurar aprovações de pré-implantação para ambientes sensíveis, como ambientes de produção. Por exemplo, pode ser necessário que um líder de equipe aprove a liberação. Você também pode adicionar portas como testes automatizados ou verificações de monitoramento para garantir que a implementação atenda aos padrões de qualidade.
Em minha experiência, essa fase é necessária para manter a estabilidade em ambientes de desenvolvimento exigentes. As aprovações e os portões proporcionam controle e garantem que somente códigos de alta qualidade cheguem à produção.
Implementação no Kubernetes
O Kubernetes facilita a execução de aplicativos em contêineres confiáveis e dimensionáveis. Ao usar o Azure Kubernetes Service (AKS), você obtém um ambiente gerenciado que simplifica a implantação e as operações. Nesta seção, mostrarei como implantar seu aplicativo no AKS usando o Azure Pipelines.
Prepare seu cluster AKS
Você pode criar um cluster AKS usando o portal do Azure ou a CLI. Aqui está um comando básico da CLI do Bash para provisionar o cluster:
az aks create \
--resource-group <ResourceGroupName> \
--name <AKSClusterName> \
--node-count 3 \
--enable-addons monitoring \
--generate-ssh-keys
Vamos detalhar o comando acima:
--resource-group
: Isso indica o grupo de recursos do Azure no qual o cluster AKS será criado.--name
: Refere-se ao nome do seu cluster AKS.--node-count
: Isso define o número de nós no cluster (por exemplo, 3 neste exemplo).--enable-addons monitoring
: Isso torna possível o monitoramento e a análise com o Azure Monitor para Contêineres.--generate-ssh-keys
: Isso gera automaticamente chaves SSH para acesso seguro ao nó, se você não as fornecer.
Não se esqueça de substituir e
pelos nomes reais do grupo de recursos e do cluster.
O Kubectl precisa ser configurado depois que o cluster AKS for configurado. Isso garante que o agente do pipeline ou o computador local possa usar o site kubectl
para se comunicar com o cluster.
Você pode acelerar suas tarefas do Azure usando a linha de comando paravocê pode acelerar suas tarefas do Azure usando a linha de comando - esta folha de dicas da CLI do Azure é uma referência útil.
Criar um arquivo YAML de implantação
Vamos usar como exemplo um arquivo YAML de implantação básica para implantar uma imagem do Docker no Kubernetes:
# This defines the API version and the kind of Kubernetes resource we are creating.
# 'apps/v1' is the API version, and 'Deployment' is the resource type.
apiVersion: apps/v1
kind: Deployment
# Metadata contains information to identify the resource uniquely.
# 'name' specifies the name of the Deployment.
metadata:
name: my-app # Name of the Deployment, used for identification.
# "spec" specifies the intended deployment state.
spec:
# Number of replicas/pods we want for this Deployment.
replicas: 3 # Ensures high availability by running three app replicas.
# Selector is used to define the labels that this Deployment will manage.
selector:
matchLabels:
app: my-app # This ensures that only Pods with the label 'app: my-app' are managed by this Deployment.
# Template specifies the blueprint for the pods created by the Deployment.
template:
metadata:
labels:
app: my-app # Labels for the Pods, matching the selector above.
# A specification for the containers of the Pods.
spec:
containers:
- name: my-app # Name of the container. This is useful for linking to the container in logs, etc.
image: mycontainerregistry.azurecr.io/my-app:latest # Pull the container image you will call from your container registry.
ports:
- containerPort: 80 # The container listens on port 80.
Implantar usando o Azure Pipelines
Em seu pipeline YAML, inclua uma tarefa para implantar no AKS.
# This defines a task for deploying Kubernetes manifests within an Azure DevOps pipeline.
- task: KubernetesManifest@0 # Task type for working with Kubernetes manifest files.
inputs:
# This configures what to do with the Kubernetes manifest files.
action: 'deploy' # 'deploy' action ensures the Kubernetes manifests are applied to the cluster.
# This defines the namespace where the Kubernetes resources will be deployed.
namespace: 'default' # 'default' is the namespace for deploying resources. Change if needed.
# All this does is point to the manifest files that define the desired state of your Kubernetes resources.
manifests: '$(Build.ArtifactStagingDirectory)/manifests/*.yaml'
# The 'manifests' variable points to the location of all the YAML files (e.g., Deployment, Service, etc.) that will be applied during the deployment.
# To access private container registry images, use the image pull secret.
imagePullSecrets: 'my-registry-secret'
# This instructs Kubernetes on which secret to use when pulling images from a private container registry.
# Ensure that 'my-registry-secret' exists in the namespace before the deploy
Confirme e envie o arquivo YAML para acionar a implantação.
O AKS simplifica a orquestração de contêineres, facilitando o gerenciamento de dimensionamento, atualizações e reversões. Na minha experiência, ele é indispensável para aplicativos modernos nativos da nuvem.
Obter a certificação Azure AZ-900
Otimizando e monitorando seus pipelines
No início de minha carreira, criar pipelines não era o maior desafio - ter um pipeline rápido e confiável é que era. Um pipeline bem otimizado não apenas torna as compilações mais rápidas; ele também reduz a frustração da equipe, diminui os riscos de implementação e acelera a entrega.
Compartilharei algumas dicas e estratégias que você pode usar para manter seus pipelines de DevOps do Azure rápidos, organizados e confiáveis.
Cache de pipeline
A instalação de dependências é outro gargalo comum do pipeline. Se você estiver trabalhando com o npm, o .NET ou outros gerenciadores de pacotes, o download repetido das mesmas dependências pode desperdiçar muito tempo. O armazenamento em cache de dependências e artefatos entre execuções reduz drasticamente o tempo de execução.
Veja como armazenar em cache as dependências no Azure Pipelines.
Primeiro, você precisa identificar os gerenciadores de pacotes, como:
- Node.js (
node_modules
) - Pacotes NuGet
- Python (
pip
packages) - Dependências do Maven/Gradle
O Azure Pipelines oferece suporte a mecanismos de armazenamento em cache, como a tarefa Cache@2
, que permite que você armazene em cache as dependências entre as execuções do pipeline.
Vamos usar um cache simples para o Node.js como exemplo:
# This task is used to cache files to speed up your pipeline.
- task: Cache@2 # This is the task name for caching files in Azure Pipelines.
inputs:
# Key is used to identify the cache. It combines npm (package manager), operating system (OS), and package-lock.json files.
key: 'npm | "$(Agent.OS)" | package-lock.json'
# RestoreKeys is an optional value used when the specific cache key is not found. It helps to find a fallback cache.
restoreKeys: |
npm | "$(Agent.OS)"
# Path defines the location of files or folders to be cached.
# Here, we are caching the 'node_modules' directory to avoid reinstalling dependencies.
path: '$(Build.SourcesDirectory)/node_modules'
# CacheHitVar is a variable that stores whether the cache was successfully used (restored).
# This can be checked later in the pipeline to decide if tasks need to run.
cacheHitVar: 'NPM_CACHE_RESTORED'
Você pode então ignorar condicionalmente a instalação se estiver em cache. Essa é uma verificação inteligente antes de concluir a instalação do npm
. É uma lógica eficiente baseada em condições.
Vejamos um exemplo simples abaixo:
# This step runs the command to install Node.js dependencies using npm.
- script: npm install # Installs packages listed in the package.json file.
# The condition checks whether the cache was restored successfully.
# This step will run if the cache is not restored ('NPM_CACHE_RESTORED' is not true).
condition: ne(variables.NPM_CACHE_RESTORED, 'true') # Run only if the cache is not restored.
Este exemplo de cache simples para um aplicativo Node.js salva o diretório de cache npm
usando package-lock.json
como uma chave. Quando suas dependências não mudam, ele as restaura, economizando minutos em cada compilação.
Já vi o armazenamento em cache reduzir drasticamente o tempo de compilação, especialmente em projetos grandes, mas somente se as chaves do cache forem escolhidas com cuidado. Em um dos meus projetos anteriores, isso reduziu o tempo de criação de um aplicativo Node.js em 55%.
Monitoramento da integridade da tubulação
Um pipeline bem-sucedido não se resume apenas a tíquetes verdes, visibilidade e feedback rápido. Quando algo quebra, você quer que sua equipe saiba imediatamente. Veja como você pode ficar à frente dos problemas.
Como configurar os painéis do Azure DevOps
O Azure DevOps fornece widgets internos para exibir o status do pipeline, as execuções recentes, as taxas de falha e as durações médias.
- Primeiro, você navega até Dashboards em seu projeto.
- Em seguida, clique em New Dashboard (Novo painel) ou use um já existente.
- Você pode adicionar widgets como: Histórico de construção, Visão geral do pipeline de lançamento, Tendência dos resultados dos testese muito mais.
Esses programas são essenciais para que você acompanhe as tendências de aprovação/reprovação, veja quais ambientes são problemáticos e muito mais.
Configuração de alertas para pipelines com falha
- Na parte inferior esquerda do seu projeto, vá para Configurações do projeto.
- Clique em Notificações.
- Em seguida, clique em Nova assinatura.
Vejamos um cenário: Na seção Category, selecione Build; na seção Template, selecione "A build fails" e clique em Next.
Você tem uma interface como esta abaixo:
- Por fim, clique em Concluir.
- Na seção Notificações você pode verificar a seção Construir para a mensagem "Uma compilação falha" que criamos anteriormente.
Certa vez, deixei passar uma falha crítica de implementação porque os alertas não estavam configurados. Desde então, sempre defini e configurei alertas de equipe para cada implementação de produção. Dessa forma, nunca perco uma compilação quebrada ou atraso em meu ciclo de lançamento.
Análise do desempenho do pipeline
Sabemos que, mesmo que seu pipeline funcione, ele pode ser lento, e pipelines lentos acabam com a produtividade. Portanto, identificar os gargalos logo no início evita problemas mais tarde.
As métricas do pipeline esclarecem o desempenho de compilações e implementações. É assim que você pode chegar até eles.
Primeiro, você deve ativar Visualizações do Analytics nas configurações do projeto e você deve se conectar ao Power BI ou explorar por meio de gráficos internos.
Monitorar a integridade do pipeline
- Sob os Pipelines vá para Análises.
- Visualize métricas como taxa de aprovação do pipeline, taxa de aprovação do teste e duração do pipeline.
Vamos explorar melhor quais são as principais métricas que podemos monitorar no Analytics e por que elas são importantes:
Métrica |
Por que isso é importante |
Tendências de duração da construção |
Isso ajuda a identificar facilmente as lentidões ao longo do tempo. |
Taxa de falhas por filial |
Isso ajuda a identificar recursos instáveis. |
Tempo na fila |
Isso ajuda a detectar a falta de agentes. |
Há alguns meses, trabalhei no pipeline de um cliente, eo que mais se destacou foi o Time in Queue. Certa vez, descobri que minha equipe e eu havíamos sobrecarregado um pool de agentes auto-hospedados, e 40% do tempo do nosso pipeline era gasto esperando por um executor disponível. Ninguém percebeu isso até que os dados analíticos tornaram isso óbvio.
Poderíamos corrigir isso adicionando mais dois agentes auto-hospedados e distribuindo a carga por tipo de trabalho. Os resultados foram imediatos: o tempo médio de construção do pipeline caiu cerca de 35%.
Monitorar usando registros
Portanto, além das métricas, os logs da linha do tempo são de grande valia, especialmente para tarefas de longa duração. Ao longo dos anos, tenho o hábito de adicionar marcadores de registro personalizados dentro de etapas críticas de scripts para identificar atrasos exatos.
Vamos dar um exemplo simples aqui:
# This step prints a message to the console in the pipeline logs.
# It helps to mark the start of the dependency installation process.
echo "=== START: Dependency Install ===" # Display a message indicating the beginning of dependency installation.
Obter a certificação Azure AZ-900
Práticas recomendadas para pipelines do Azure
Agora que já abordamos os principais serviços do Azure Pipelines e muitos outros, vamos ver como você pode tirar o máximo proveito deles seguindo estas práticas recomendadas.
Vamos mudar do desempenho para a estrutura, porque um pipeline rápido que é difícil de manter ainda prejudicará qualquer equipe.
Organização de pipelines para equipes
Quando várias equipes ou ambientes compartilham pipelines, as coisas costumam ficar confusas. Você precisará de estrutura. Um pipeline gigante para ambientes de desenvolvimento, preparação e produção leva ao caos.
Para organizar seu pipeline, você deve separá-lo em ambientes. Vamos dar uma olhada em uma estruturasimples abaixo.
Meio ambiente |
Nome do oleoduto |
Gatilho |
Desenvolvimento |
|
Ramificações de recursos (executadas em cada commit) |
Preparação |
|
Solicitações pull → Preparação (acionamento manual) |
Produção |
|
Pipelines manuais ou de liberação (aprovação necessária) |
Os principais aspectos que você deve entender com base nessaestrutura simples:
- Cada arquivo é extraído de modelos compartilhados.
- Cada arquivo usa variáveis específicas do ambiente.
- Cada arquivo controla o acesso por meio de permissões de pipeline.
Por experiência própria, essa separação facilita a depuração e permite que os desenvolvedores juniores implementem no ambiente de desenvolvimento sem arriscar o ambiente de produção.
Uso de modelos e código reutilizável
O DevOps trata da redução do fluxo de trabalho manual e do aprimoramento da automação em todo o processo de desenvolvimento de software.
O código YAML é propenso a erros quando copiado e colado entre projetos. O Azure DevOps tem modelos de pipeline para configuração DRY (Don't Repeat Yourself) por meio de pipelines YAML. Você pode reutilizar os modelos de pipeline YAML em vários projetos, projetar seus pipelines de forma consistente e até mesmo reduzir o tempo de processamento do pipeline.
Vamos usar um modelo de compilação simples e reutilizável como exemplo.
Primeiro, defina seu modelo de compilação, build-template.yml
:
# Here we configure the platform and the build configuration.
parameters:
buildPlatform: 'Any CPU' # This specifies the build platform (e.g., Any CPU, x86, x64).
buildConfiguration: 'Release' # This specifies the build configuration (Release) to avoid warning.
# A pipeline is composed of steps (a series of tasks that will be executed)
steps:
- task: DotNetCoreCLI@2 # Task for running .NET Core commands in the pipeline.
inputs:
command: 'build' # This runs the 'build' command to compile the project(s).
projects: '**/*.csproj' # This specifies to build all .csproj files in the repository.
arguments: '--configuration ${{ parameters.buildConfiguration }}'
# This passes the build configuration parameter (e.g., Release or Debug) to the command.
Use seu modelo de compilação em seu pipeline principal:
# A pipeline job is a group of tasks. Here, the job is named 'Build'.
jobs:
- job: Build # The job name where the build process occurs.
# Steps define the tasks or actions the pipeline will perform.
steps:
- template: templates/build-template.yml # Reference an external YAML template for reusable steps.
Gerenciar segredos e variáveis
Ao trabalhar em projetos, especialmente em ambientes colaborativos, é comum usar informações confidenciais, como cadeias de conexão de banco de dados, chaves de API, senhas ou tokens. Se esses segredos estiverem codificados em sua base de código ou expostos em registros, eles podem ser facilmente comprometidos.
Vamos analisar maneiras de gerenciar com segurança nossos segredos e variáveis usando os segredos e grupos de variáveis do Azure Pipelines.
Etapa 1: Criação de um grupo de variáveis
- Clique na seção Pipelines na barra lateral esquerda.
- Na seção Pipelines, clique em Biblioteca.
- Crie um grupo de variáveis:
- Clique em Grupos de variáveis para você.
- Clique no botão Adicionar grupo de variáveis para você.
- Digite um nome para o seu grupo de variáveis (por exemplo,
MyAppSecrets
).
Etapa 2: Adicionar segredos ao grupo de variáveis
- Adicione variáveis:
- No grupo de variáveis, clique em Adicionar para criar uma nova variável.
- Digite o nome da variável (por exemplo,
DB_CONNECTION_STRING
). - Marque a caixa com o rótulo Manter esse valor em segredo para garantir que ele seja tratado como um segredo.
- Digite o valor da variável (por exemplo, minha string de conexão com o banco de dados).
- Clique em Salvar para armazenar a variável.
Etapa 3: Usando segredos em seu pipeline
Agora que você criou um grupo de variáveis com segredos, pode usar essas variáveis no arquivo YAML do pipeline.
- Faça referência ao grupo de variáveis: Adicione o grupo de variáveis ao arquivo YAML do pipeline:
variables:
- group: MyAppSecrets
- Use os segredos em suas etapas: Você pode fazer referência aos segredos nas etapas do pipeline usando a sintaxe
$(VariableName)
. Aqui está um exemplo de como você pode usar oDB_CONNECTION_STRING
em uma etapa de script:
# This defines the trigger for the pipeline.
# The pipeline runs automatically whenever changes are pushed to the 'main' branch.
trigger:
- main # Trigger the pipeline on changes to the 'main' branch.
# The pool specifies the environment where the pipeline will run.
# 'ubuntu-latest' means the pipeline will use the latest Ubuntu operating system image.
pool:
vmImage: 'ubuntu-latest' # Use the latest Ubuntu image provided by Azure Pipelines.
# Variables section defines reusable values for the pipeline.
# 'group: MyAppSecrets' links to a variable group that stores sensitive information like secrets.
variables:
- group: MyAppSecrets # Load secrets, such as database credentials, from a variable group.
# Steps define the tasks that the pipeline will execute one by one.
steps:
- script: |
echo "Connecting to the database..." # Print a message indicating the start of database connection.
echo "Connection String: $(DB_CONNECTION_STRING)" # Display the database connection string from the variable group.
displayName: 'Connect to Database' # A simple name for this step that appears in the pipeline logs.
Etapa 4: Executando o pipeline
- Depois que você tiver salvo o arquivo YAML, vá para a seção Pipelines e clique em Executar pipeline.
- Após a execução do pipeline, você pode verificar os logs. Você perceberá que o valor secreto está oculto, mantendo suas informações confidenciais seguras.
Conclusão
Neste tutorial, percorremos toda a jornada de uso do Azure Pipelines, desde a configuração do seu primeiro pipeline até a criação, o teste, a implantação, o monitoramento e a otimização.
A fase de implementação requer prática. Comece de forma simples, continue melhorando e, com o tempo, você ganhará confiança e fluência no gerenciamento de fluxos de trabalho de CI/CD. O Azure Pipelines fornece as ferramentas, você traz a iteração e o aprendizado.
Com um esforço consistente, você pode otimizar o processo de desenvolvimento e ter confiança no envio de software de alta qualidade em escala.
Para se aprofundar no Azure DevOps e no Microsoft Azure, confiraos seguintes recursos:
- Tutorial do Azure DevOps - Este tutorial orienta você pelo Azure DevOps, tornando a CI/CD mais fácil do que nunca.
- Entendendo o Microsoft Azure - Crie uma base sólida no Microsoft Azure e libere o poder da computação em nuvem.
- Microsoft Azure Fundamentals (AZ-900) - Prepare-se para o exame com este programa para iniciantes que abrange todos os principais fundamentos do Azure.
- Noções básicas sobre a arquitetura e os serviços do Microsoft Azure - Saiba como a arquitetura e os serviços do Azure trabalham juntos para potencializar as soluções em nuvem.
Perguntas frequentes
Posso usar o Azure Pipelines para projetos que não sejam do Azure?
Sim, você pode. O Azure Pipelines oferece suporte a implantações no local e em vários ambientes de nuvem, como AWS, GCP e muitos outros.
Quais linguagens de programação são compatíveis com o Azure Pipelines?
O Azure Pipelines oferece suporte a muitas linguagens de programação, incluindo Node.js, Python, Java, .NET e muitas outras.
Qual é a diferença entre o Azure Pipelines e o GitHub Actions?
O Azure Pipelines oferece uma integração mais profunda com o ecossistema do Azure e ferramentas de implantação robustas, enquanto o GitHub Actions oferece uma experiência de CI/CD mais simples e nativa do GitHub. Ambos suportam fluxos de trabalho YAML e implementações em contêineres.
Posso usar o Azure Pipelines com tecnologias que não são da Microsoft, como Python ou Java?
Sim, o Azure Pipelines oferece suporte a todas as principais plataformas e linguagens, incluindo Python, Java, Node.js e muito mais. Você pode configurar compilações e implementações para qualquer pilha de tecnologia usando YAML.
O uso do Azure Pipelines é gratuito?
O Azure Pipelines oferece uma camada gratuita com 1.800 minutos/mês para projetos públicos e tempo limitado de criação privada. O uso adicional requer um plano pago ou agentes auto-hospedados.
O que são as conexões de serviço do Azure DevOps e por que elas são importantes?
As Conexões de Serviço vinculam com segurança o Azure Pipelines a serviços externos, como o Azure Web Apps ou clusters do Kubernetes. Eles são essenciais para implementações automatizadas e gerenciamento de infraestrutura.
Como o Azure Pipelines se compara ao Jenkins ou ao CircleCI?
O Azure Pipelines oferece uma experiência mais integrada para os usuários do Azure e melhor suporte para os serviços da Microsoft. O Jenkins é mais personalizável, mas exige mais configuração; o CircleCI se destaca pela velocidade e pelo paralelismo.
Emmanuel Akor é um engenheiro de nuvem e DevOps especializado em aproveitar as tecnologias de nuvem e as ferramentas de DevOps para conduzir projetos impactantes. Formado em Ciência da Computação pela Babcock University e ex-Co-Líder de Nuvem do GDSC, Emmanuel combina excelência acadêmica com experiência prática. Como redator de conteúdo técnico, ele se destaca por compartilhar conhecimento e colaborar com as equipes.