🚀 Atividade 16: Pipelines de CI/CD com GitHub Actions
🎯 Objetivo da Aula
Ao final desta atividade, você será capaz de:
- Compreender os conceitos fundamentais de CI/CD (Integração Contínua e Entrega Contínua).
- Projetar e mapear pipelines lógicos e suas sequências de execução.
- Configurar um arquivo YAML de automação corporativa real com GitHub Actions.
- Integrar testes unitários JUnit em aplicações Spring Boot 3.5.x e Java 17 no fluxo de CI.
🏢 O Cenário Prático (Seu Desafio)
Na TecProExpress, a gerência estava cansada: toda vez que um desenvolvedor subia uma nova alteração de código, ele jurava de pés juntos que o sistema estava "funcionando perfeitamente". Porém, ao publicar na nuvem, o aplicativo do motorista quebrava porque alguém esqueceu de testar a alteração localmente!
Os testes manuais demoravam horas de digitação improdutiva e, frequentemente, bugs passavam para produção.
"Seu desafio como Analista de DevOps é criar o primeiro Pipeline de Integração Contínua (CI) para a TecProExpress. Você configurará um arquivo do GitHub Actions que, de forma 100% automática, baixa o código do repositório, instala o Java 17, compila a aplicação Spring Boot e executa todos os testes unitários do JUnit toda vez que um programador enviar um Push ou Pull Request."
🧠 Fundamentos: A Teoria Traduzida
CI (Continuous Integration): É a prática de integrar alterações de código com frequência e validá-las de forma automática. CD (Continuous Delivery): É a publicação automatizada do código validado no servidor web (produção).
Anatomia de um Workflow do GitHub Actions:
- Workflow: O arquivo YAML que define a automação (salvo na pasta
.github/workflows/). - Trigger (on): O evento que aciona o pipeline (Ex:
pushoupull_requestna branch develop/main). - Jobs (Trabalhos): As seções do pipeline (Ex:
build-and-test). - Steps (Passos): A sequência de comandos que roda dentro de uma máquina virtual dedicada na nuvem (Runner).
📊 Visualizando a Sequência de Automação
📖 Exemplo Guiado: Roteiro e Configuração do Pipeline
Para configurar a automação, precisaremos de duas coisas no nosso repositório Java Spring Boot: o teste unitário de negócio (JUnit) e o arquivo do pipeline (Actions).
1. 🛠️ O Teste Unitário JUnit em Java 17 (Cálculo de Frete):
Dentro da pasta src/test/java/com/tecproexpress/ do seu projeto Spring Boot, nós escrevemos o teste de validade da regra de negócio:
package com.tecproexpress.service;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class DeliveryServiceTest {
@Test
public void deveCalcularFreteComSucesso() {
double pesoCarga = 10.0; // 10kg
double valorBase = 50.0;
// Regra da TecProExpress: R$ 2.00 por Kg excedente
double freteFinal = valorBase + (pesoCarga * 2.0);
// Asserção JUnit de Sucesso
assertEquals(70.0, freteFinal, "O cálculo de frete da TecProExpress falhou!");
}
}
2. 📄 O Arquivo do Pipeline .github/workflows/ci.yml:
Este é o arquivo YAML que o GitHub interpreta para automatizar a verificação:
name: Java CI com Maven e Spring Boot
on:
push:
branches: [ "main", "develop" ]
pull_request:
branches: [ "main", "develop" ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
# 1. Faz o download do código do repositório
- name: Checkout do Código
uses: actions/checkout@v4
# 2. Configura a versão do Java no ambiente de execução
- name: Instalar JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: maven
# 3. Compila a aplicação Spring Boot e roda os testes do JUnit
- name: Executar Build e Testes JUnit com Maven
run: mvn -B clean test
🛠️ Prática Obrigatória 1: Desenho do Pipeline
Cenário: Mapeamento visual das etapas de automação do seu projeto.
- Desenhe um diagrama
flowchartno Mermaid representando a sequência de passos lógicos que o seu pipeline do GitHub Actions deve executar. - Adicione cores ou estilos para indicar a diferença visual entre o sucesso e a falha de um passo de teste.
🏁 Resultado Esperado (Para sua Referência)
Um diagrama Mermaid detalhado demonstrando o ciclo de CI acionado por um Push de branch e o desfecho do build.
🛠️ Prática Obrigatória 2: O Roteiro de CI e Teste de Unidade
Cenário: Escrevendo sua primeira verificação automatizada.
- Crie a especificação em formato Markdown do seu arquivo de configuração
.github/workflows/ci.ymlcustomizado para o seu repositório do projeto. - Escreva a classe de teste JUnit (Java) correspondente a uma validação de dados lógica do seu sistema (Ex: Validar se uma senha tem menos de 8 caracteres e falha, Validar se a idade do usuário é maior que 18 para aprovação).
📤 Instruções de Entrega (Microsoft Teams)
Após validar a sua arquitetura de automação de testes:
- Salve o arquivo de especificações e códigos com o nome
Atividade_16.mdna pastaes-atv-16-pipelines-cicd/do seu repositório GitHub. - Certifique-se de fazer o commit e push para o repositório público.
- Submeta o link do seu repositório no Microsoft Teams para avaliação do professor.
💡 Checkpoint de Lógica
AssertionError), o que o GitHub fará com o Pull Request de mesclagem de código daquele desenvolvedor? (Resposta: O GitHub marcará o build como "Falho" (Status Vermelho) e bloqueará a mesclagem automática do Pull Request, impedindo que o código defeituoso contamine a branch estável de desenvolvimento develop ou main). 🧠🛡️📊 Rubrica Formativa de Avaliação
| Critério de Avaliação | Insuficiente (0% - 40%) | Regular (41% - 70%) | Excelente (71% - 100%) |
|---|---|---|---|
| Pipeline CI/CD (GitHub Actions YAML & Mermaid) | Erros na sintaxe YAML do GitHub Actions ou fluxo do pipeline sem passos de build/test. | Escreve o workflow `.yml` mas sem personalizar para a linguagem do projeto. | Pipeline CI em YAML perfeitamente funcional com gatilhos (`push`/`pull_request`), setup de JDK/ambiente e execução automatizada de testes. |
| Automação de Testes de Unidade (JUnit) | Sem asserções de teste automatizadas ou sintaxe inválida. | Escreve a classe JUnit mas com asserções genéricas. | Classe de teste JUnit impecável com asserções de sucesso e tratamento de falhas lógicas do sistema. |
| Entrega no GitHub | Entrega fora da pasta `es-atv-16-pipelines-cicd/`. | Arquivo entregue mas sem validação visual da execução do pipeline. | Submete `Atividade_16.md` com YAML e JUnit formatados e validados no repositório. |
🌿 Atividade 15: GitFlow e Trabalho Colaborativo
Bem-vindo a mais uma etapa prática de Engenharia de Software! Até agora, você criou especificações e diagramas. Mas na vida real de desenvolvimento corporativo, as equipes trabalham juntas em uma base de código única. Como fazer para que 10 programadores editem o mesmo arquivo do Spring Boot ao mesmo tempo sem que um apague a alteração do outro? Hoje, aprenderemos a dominar o controle de versão profissional usando o Git e a metodologia estratégica GitFlow. 🛡️🧩
🐳 Atividade 17: Containerização de Ambientes com Docker
Bem-vindo a mais uma etapa prática da sua jornada na Engenharia de Software! Após automatizarmos nossos testes no pipeline de CI/CD, agora resolveremos um dos problemas mais clássicos e irritantes no desenvolvimento de software: "Na minha máquina funciona, por que não funciona no servidor de produção?" 🤦♂️💻