Alura > Cursos de DevOps > Cursos de Builds > Conteúdos de Builds > Primeiras aulas do curso CI/CD e DevOps: implementar pipelines automatizados e seguros

CI/CD e DevOps: implementar pipelines automatizados e seguros

Fundamentos de CI/CD e DevOps - Apresentação

Contextualizando o DevOps

Olá a todas as pessoas, vamos discutir os fundamentos de CI (Integração Contínua) e CD (Entrega Contínua) na prática. Antes, vamos falar sobre DevOps (Desenvolvimento e Operações).

Há uma máxima amplamente utilizada para definir DevOps: é cultura, não ferramenta; em essência, tampouco é um cargo. Para compreender por que esse conceito surgiu, precisamos voltar ao contexto anterior.

Historicamente, na área de tecnologia havia dois mundos separados: um time de desenvolvimento e outro de operações. O time de desenvolvimento buscava entregar software com rapidez, enquanto o time de operações priorizava manter tudo estável. Esses objetivos, na prática, frequentemente entravam em conflito.

Para reduzir essa tensão, nasceu DevOps para diminuir a fricção e aproximar quem constrói do software de quem mantém o sistema em funcionamento. Estabeleceu-se responsabilidade compartilhada para que a área opere como uma só, e não como duas áreas em constante atrito. O termo destaca a união de Development (Desenvolvimento) e Operations (Operações), com as iniciais em maiúsculas (D e O). Os objetivos centrais incluem automação, colaboração e retorno rápido.

Definindo CI, entrega contínua e publicação contínua

Com esse entendimento, seguimos para CI (Integração Contínua), CD (Entrega Contínua) e publicação contínua.

CI (Integração Contínua) refere-se à prática de integrar mudanças pequenas e frequentes no repositório principal, com validações automáticas executadas continuamente. Em vez de acumular código por longos períodos, integramos em partes menores e identificamos problemas mais cedo. CI não é apenas builds (compilações) automáticas; é um hábito de integração frequente com validação automática, o que reduz conflitos, evita surpresas e acelera o retorno.

Ao passarmos para Continuous Delivery (Entrega Contínua) e Continuous Deployment (Publicação Contínua), surge uma distinção clássica de nomenclatura. Continuous Delivery (Entrega Contínua) significa que o software está sempre em condição de ser publicado: passou pelas validações, está empacotado e pronto, mas ainda depende de uma decisão humana para autorizar o deploy (publicação) em produção.

Continuous Deployment (Publicação Contínua) vai um passo além: publica automaticamente em produção toda mudança que já passou pelos critérios que chamaremos aqui de gates (critérios de aprovação). Esses gates podem incluir segurança, boas práticas e testes. Para que o deploy (publicação) ocorra, não é necessária ação manual. A diferença principal está justamente nesse último passo.

Em Delivery (entrega), a publicação está pronta, mas depende de uma decisão humana. Em Deployment (implantação), o fluxo segue automaticamente para produção, porque já definimos critérios considerados aceitos.

Iniciando o exemplo de pipeline no GitHub Actions

Agora, vamos ver um exemplo prático de pipeline (esteira). Vamos mostrar como funciona um repositório que já temos criado. Fechamos o terminal e, em seguida, abrimos um arquivo YAML que está na tela para discutirmos em aula.

O primeiro parâmetro é o name. Vamos detalhar o conteúdo. Trata-se de um YAML simples, que é o arquivo dentro desta pasta. Neste caso, estamos no GitHub, no workflow (fluxo de trabalho) do GitHub, isto é, o GitHub Actions. Em seguida, veremos esse fluxo sendo executado na prática; por ora, esta é uma visão simples para entendermos como funciona.

Começando pelo topo do arquivo, definimos o nome do workflow:

name: CI

No primeiro bloco, temos workflow_dispatch, pull_request e push. Chamamos isso de trigger (gatilho). O que é um gatilho? Sempre que executarmos um git push na ramificação main, será disparada a execução de todos os comandos na esteira. Portanto, quando houver um push, um pull_request ou um workflow_dispatch, o fluxo será iniciado.

Configurando gatilhos e explicando o workflow_dispatch

Vamos adicionar os gatilhos. Note que comentamos o objetivo do pipeline e a ideia de “gates” (cada etapa aumenta a confiança para prosseguir):

# Este workflow materializa o pipeline minimo discutido na aula:
# checkout -> dependencias -> lint -> testes -> artefato.
#
# Cada etapa e um "gate" que aumenta a confianca antes da proxima promocao.

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  workflow_dispatch:

O que é o workflow_dispatch? É uma forma de executar manualmente. Se quisermos ir até a interface e clicar em “Run workflow” em Actions, será executado tudo o que está definido abaixo.

Abaixo, temos jobs. Nos jobs do CI (integração contínua), definimos:

Assim, será utilizada uma máquina hospedada no GitHub Actions para nós. Indicamos que desejamos essa máquina, que é Linux ubuntu-latest (a versão mais recente disponível).

Declarando jobs e ambiente de execução

Vamos declarar o bloco de jobs com o job principal, o nome e o runner:

jobs:
  ci:
    name: Pipeline de CI
    runs-on: ubuntu-latest

Em seguida, há os steps, que são as etapas que serão executadas:

Adicionando checkout e configurando o Node.js

Primeiro, adicionamos o checkout do código e a configuração do Node.js com cache de dependências:

    steps:
      - name: Checkout do codigo
        uses: actions/checkout@v4

      - name: Configurar Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

Este projeto é em Node com Express, concebido de forma simples apenas para explicar o fluxo. Depois de instalar as dependências e executar o que for preciso, ao final, publicamos um artefato nesta esteira.

Instalando dependências e executando lint e testes

Vamos incluir a instalação de dependências com npm ci, que é adequada para ambientes de CI por ser determinística e rápida:

      - name: Instalar dependencias
        run: npm ci

Em seguida, acrescentamos as verificações de qualidade (lint) e os testes automatizados. Essas etapas funcionam como “gates” que precisam ser aprovados antes de prosseguir:

      - name: Lint
        run: npm run lint
      - name: Testes
        run: npm test

Gerando e publicando artefatos

Com as validações passando, geramos o artefato (build) do projeto:

      - name: Gerar artefato
        run: npm run build

Por fim, publicamos o artefato para ficar disponível no resumo da execução do workflow (aba Summary) do GitHub Actions. Assim, é possível baixar e inspecionar o que foi produzido:

      - name: Publicar artefato
        uses: actions/upload-artifact@v4
        with:
          name: devops-pipeline-demo-${{ github.sha }}
          path: dist/
          retention-days: 7

Executando o workflow e inspecionando artefatos

Voltando à esteira: lembram-se do workflow_dispatch? Podemos executá-lo aqui selecionando a ramificação main e clicando em “Run workflow”. Ele será executado na prática e poderemos observar. Cada etapa que vimos no YAML é realizada: se olharmos nos logs, veremos a publicação do artefato e todas as etapas definidas. A primeira ação é o checkout do código, e, a partir daí, o trabalho progride até concluir.

Pronto. Vimos o que é uma esteira na prática e a execução completa. Observamos o trigger (gatilho), os estágios, os steps e o artefato gerado na esteira. É relevante mostrar onde o artefato é disponibilizado: por exemplo, na aba Resumo, conseguimos visualizar um artefato que pode ser baixado para inspecionarmos o que foi gerado. Podemos anexar relatórios, diversos conteúdos e formatos, como um JSON, entre outros.

Como exemplo do tipo de conteúdo que pode ser empacotado como artefato, poderíamos ter um arquivo JSON com metadados do build, como este:

{
  "name": "devops-pipeline-demo",
  "version": "1.0.0",
  "builtAt": "2024-03-19T22:39:19.467Z",
  "commit": "2aa0d7228dd1c28c8340d29d84688eaa39e6511"
}

Este é um exemplo para ilustrar o funcionamento. Na próxima aula, continuaremos com mais conteúdo.

Fundamentos de CI/CD e DevOps - Introduzindo os fundamentos de CI/CD

Apresentando o curso

Olá a todas as pessoas.

Neste curso, vamos abordar pipelines (fluxos de automação) e CI/CD, construindo uma visão completa sobre o tema: partiremos dos conceitos fundamentais até chegar às práticas modernas de pipelines (fluxos de automação) em produção. Passaremos por DevOps (integração entre desenvolvimento e operações), integração contínua, ramificação, portas de qualidade, ferramentas, Docker (ferramenta de contêineres), estratégias de implantação, segurança e métricas.

Estabelecendo princípios e apresentando o instrutor

A ideia aqui não é memorizar sintaxe ou YAML (formato de configuração), nem se tornar refém das ferramentas, porque a ferramenta muda o tempo todo, o contexto muda, a plataforma muda. O objetivo é entendermos os princípios de validação, de fluxo, de segurança e de confiabilidade, que sempre permanecerão.

Vou falar um pouco sobre mim. Eu sou Eric, serei a pessoa instrutora aqui hoje. Já tenho mais de 18 anos de experiência na área de tecnologia, SRE (Engenharia de Confiabilidade de Sites), observabilidade e qualidade. Qualquer coisa, entrem em contato comigo também pelo Discord (plataforma de comunicação).

Definindo CI/CD como sistema de entrega

Hoje, quando falamos de fundamentos de CI/CD, o primeiro pensamento costuma ser automação. No entanto, não se resume a isso.

Quando pensamos em CI/CD, há muito mais envolvido. Na prática, tratamos de um sistema de entrega. Podemos encará-lo como a forma pela qual uma organização transforma código em mudanças em produção. Nosso objetivo é colocar essas mudanças em produção com a menor fricção possível e com o maior nível de segurança possível. Esse é o fundamento de CI/CD; é por isso que existe.

Evoluindo a maturidade e concluindo a introdução

Ao longo deste curso, nós vamos avançar continuamente além da visão superficial de “temos um pipeline (esteira)” para uma visão mais madura. Vamos avaliar se essa esteira realmente ajuda a equipe a entregar melhor, se proporciona retroalimentação rápida — um de seus propósitos —, se protege a qualidade e se ajuda a escalar a engenharia. Escala é muito importante.

A mensagem principal que reforçaremos aqui é: pipeline (esteira) não é o que simplesmente se executa; é o que melhora a entrega da equipe. CI/CD não é apenas automação. CI/CD é fluxo de entrega com qualidade, segurança e velocidade.

Nos vemos no início desta Aula 1 em breve.

Revisão de código e qualidade de pipeline - Revisando código e protegendo branches

Apresentando o tema e o papel da revisão humana

Olá a todos.

Vamos falar sobre Revisão de código e Proteção de branches. Antes de entrar no tema, reforçamos que temos falado bastante sobre um pipeline (esteira) robusto. Um pipeline robusto não elimina a revisão humana; ele melhora a qualidade da revisão. Na era da IA, muitas tarefas já foram automatizadas, e a revisão humana pode se concentrar no que realmente importa: arquitetura, clareza e impacto, além da identificação de riscos. Mantemos o controle. Esse é o ponto.

A Revisão de código, especificamente, não pode ser tratada como um ritual vazio. É um mecanismo importante de qualidade e, sobretudo, de compartilhamento de conhecimento.

Trouxemos alguns conceitos para fixarmos. Ainda vamos discutir bastante teoria aqui e, depois, veremos na prática. Vamos ver o material que preparamos, anotado em nosso Markdown (marcação).

Esses são os três pontos nos quais vamos fixar conceitos agora.

Detalhando a revisão de código

Revisão de código

Qual problema a Revisão de código resolve? Em que ela ajuda? Anotamos os principais pontos que uma boa Revisão de código permite observar:

Além disso, a Revisão de código funciona como uma mentoria implícita e promove a difusão de conhecimento dentro do time. As pessoas do time ficam alinhadas sobre a mudança que está sendo enviada, com participação de quem realmente precisa estar envolvido naquela tarefa.

Apresentando proteção de branches e estratégia de merge

Proteção de branches

Agora passamos aos conceitos de Proteção de branches. São configurações presentes no dia a dia ao enviar código e que costumamos encontrar nos repositórios, como:

Estratégia de merge

Também vamos tratar de Estratégia de merge (mesclagem) ao longo do conteúdo, conectando teoria e prática.

Às vezes, precisamos que o nosso Pull Request (solicitação de integração) passe por verificações automatizadas, os Status Checks (verificações de status). Também podemos definir pessoas obrigatoriamente requeridas para aprovação: responsáveis pelo repositório, pela área ou membros de um time. Frequentemente há um grupo aprovador.

Detalhando governança do ramo principal e mesclagens

O bloqueio de push (envio) direto é uma prática autoexplicativa, pois estamos falando de um ramo protegido. É governança, não burocracia. Não podemos fazer push (envio) de alterações o tempo todo sem nenhuma proteção no ramo principal.

É consenso que o ramo principal é o caminho mais confiável. Quando vamos fazer uma alteração nova, fazemos pull (obter) do ramo principal para ter a base, implementamos a mudança e, em seguida, fazemos o push (envio) do código. Proteger esse ramo é uma forma de manter organização no time, previsibilidade e disciplina.

Agora, estratégias de mesclagem. Vamos abordar rapidamente três conceitos que também funcionam como estratégias de proteção, pois impactam o histórico e a forma como o time lê a evolução do repositório.

Enfatizando escolhas de mesclagem e políticas de proteção

Não existe uma estratégia de mesclagem universal. Gostamos de enfatizar que cada pessoa e cada time têm preferências, e a mais adequada é a que se alinha à forma de trabalho do time. Não há bala de prata.

É importante destacar um erro comum: não podemos usar a revisão como mecanismo absoluto. O ramo precisa ter a contraparte de estar protegido, porque isso poupa esforços em outros pontos. Revisão sem política de proteção vira um acordo informal, e isso não funciona. Ao formalizarmos a proteção, tudo se torna mais simples e tranquilo para evoluir.

Encerrando e próximos passos

Falamos sobre esses conceitos. Na nossa próxima aula, vamos discutir a pirâmide de testes. Quando falamos de qualidade, não podemos deixar de abordar esse tema; comentaremos rapidamente. Em seguida, falaremos sobre gates (barreiras de qualidade), cobertura e vulnerabilidades.

Eu vejo vocês lá. Agradeço a todas as pessoas.

Sobre o curso CI/CD e DevOps: implementar pipelines automatizados e seguros

O curso CI/CD e DevOps: implementar pipelines automatizados e seguros possui 134 minutos de vídeos, em um total de 50 atividades. Gostou? Conheça nossos outros cursos de Builds em DevOps, ou leia nossos artigos de DevOps.

Matricule-se e comece a estudar com a gente hoje! Conheça outros tópicos abordados durante o curso:

Aprenda Builds acessando integralmente esse e outros cursos, comece hoje!

Conheça os Planos para Empresas